美文网首页web前端开发
你真的了解babel-loader,eslint-loader,

你真的了解babel-loader,eslint-loader,

作者: web_柚子小记 | 来源:发表于2019-12-26 16:51 被阅读0次

    webpack+react项目引入了eslint和eslint-loader,编译后发现报错如下

    WARNING in ./src/scripts/app/head/index.js
    Module Warning: Module Warning (from ./node_modules/eslint-loader/index.js):
    
    /Users/wr/Documents/workspace/sharetome-adminv3.0/src/scripts/app/head/index.js
    41:26 warning Unexpected trailing comma comma-dangle
    
    ✖ 1 problem (0 errors, 1 warning)
    0 errors, 1 warning potentially fixable with the `--fix` option.
    

    .eslintrc配置如下

    {
        "parser": "babel-eslint",
            "rules": {
            "comma-dangle": ["error", "only-multiline"]
        }
    }
    

    按照报错提示对src/scripts/app/head/index.js进行修改后发现无效,仍报错如图一。

    修改.eslintrc的配置:"comma-dangle": 0,禁用comma-dangle规则,发现仍然无效,甚至是删除.eslintrc配置文件,仍然顽固不化的报错。

    于是仔细梳理了babel-loader,eslint-loader,.eslintrc之间的关联

    因为在项目中使用了Es6语法,所以我们引入了babel-loader,在webpack中对js文件增加了相关规则:

    module: {
        rules: [{
            test: /\.(js|jsx)$/,
            exclude: [/node_modules/],
            use: {
                loader: 'babel-loader',
                options: {
                    sourceMap: true,
                    plugins: [
                        "add-module-exports",
                        ['import', { libraryName: "antd", style: 'css' }]
                    ]
                }
            }
        }]
    }
    
    

    随后增加了对js文件的eslint校验规则:

    npm install eslint-loader eslint --save-dev
    
    {
        test: /\.js$/,
        use: ['eslint-loader'],
        exclude: [/node_modules/]
    }
    

    在项目根目录下创建.eslintrc文件,配置如上,此时运行项目发现.eslintrc配置并未生效,如文章开头所述。

    这里解释下"parser": "babel-eslint"配置的含义:
    eslint允许常规解析器,有一些babel语法没有被eslint支持。当使用这些插件时,你的代码要转换成eslint能够支持解析的代码格式

    .eslintrc不起作用的关键原因是因为规则配置的顺序问题

    划重点:eslint-loader规则必须要先于babel-loader规则

    我们使用eslint-loader是为了对编译前的ES6语法进行检查,而不是对使用了babel编译后的语法进行检查。所以在webpack中,eslint-loader规则要优先于babel-loader规则:

    module: {
        rules: [{
            test: /\.js$/,
            use: ['eslint-loader'],
            exclude: [/node_modules/]
        },
        {
            test: /\.(js|jsx)$/,
            exclude: [/node_modules/],
            use: {
                loader: 'babel-loader',
                options: {
                    sourceMap: true,
                    plugins: [
                        "add-module-exports",
                        ['import', { libraryName: "antd", style: 'css' }]
                    ]
                }
            }
        }]
    }
    

    或者对eslint-loader规则增加enforce: 'pre'配置:

    module: {
        rules: [{
            test: /\.(js|jsx)$/,
            exclude: [/node_modules/],
            use: {
                loader: 'babel-loader',
                options: {
                    sourceMap: true,
                    plugins: [
                        "add-module-exports",
                        ['import', { libraryName: "antd", style: 'css' }]
                    ]
                }
            }
        },
        {
            test: /\.js$/,
            use: ['eslint-loader'],
            exclude: [/node_modules/],
            enforce: 'pre'
        }]
    }
    

    顾名思义,预处理eslint-loader规则

    附ESLint中文文档:http://eslint.cn/docs/rules/comma-dangle

    相关文章

      网友评论

        本文标题:你真的了解babel-loader,eslint-loader,

        本文链接:https://www.haomeiwen.com/subject/ixlloctx.html