Eslint - 脚本和模块的 SourceType 混合体

Eslint - SourceType mixture of script and module

我们开始混入一些 es6 模块,当你使用 import/export 而不使用 sourceType: script

时,eslint 会公正地抱怨
Parsing error: 'import' and 'export' may appear only with 'sourceType: module'at line 1 col 1

但是,如果我将 sourceType 更改为模块,那么每个具有 'use strict' 的文件;在顶部被标记为模块中不需要 use strict。

模块是我的 jsx 文件,我的 js 文件是 POJ,所以我需要两个 sourceTypes 才能运行。

关于如何强制 eslint 与模块和脚本一起工作有什么想法吗?我想避免 运行 两个单独的 eslintrc 文件和规则集,只是让一个是模块,另一个是脚本。

只要你的脚本有一个扩展名而你的模块有不同的扩展名,那么你就可以有两种不同的配置。

// .eslintrc.json
{
    // ...
    // Your normal config goes here
    // ...
}

eslint . 整理您的普通脚本,就像您一直在做的那样。它默认为 sourceType: "script",默认拉取 .eslintrc.json,默认只检查 *.js 个文件。

// .eslintrc.modules.json
{
    "extends": "./.eslintrc.json",
    "parserOptions": {
        "sourceType": "module"
    },
    // You can have additional module-specific config here if you want
}

现在您可以使用 eslint --config .eslintrc.modules.json --ext .jsx . 只对模块进行 lint,这将拉取模块配置,这只是正常 .eslintrc.json 的扩展,它只会对 *.jsx 个文件。

我在根文件夹中创建了带有选项 sourceType 的主文件:script。 在文件夹中时 ./front file .eslintrc.json:

{
    "extends": "../.eslintrc.json",
    "parserOptions": {
        "sourceType": "module"
    }
}

eslint 4.1.0+ 现在有一个更好的方法:

module.exports = {
  overrides: [
    {
      files: [ "rollup.config.js" ],
      parserOptions: { sourceType: "module" },
    }
  ]
};

您还可以在 overrides 部分中按 glob 更改规则或任何您想要的内容。

有一种方法既能吃蛋糕又能吃蛋糕,让所有文件都带有 .js 扩展名,同时消除 sourceType 文件的歧义。

首先,像其他答案所建议的那样,为备用文件扩展名添加覆盖:

 { "overrides":
            [
            { "files": [ "*.js" ]
            , "excludedFiles": "*unambiguous.js"
            , "processor": "plugin-name/disambiguate" }
            ,
            { "files": [ "*.mjs" ]
            , "parserOptions":
                    { "sourceType": "module" } }
            ] }

神奇的是:像这样制作一个超级简单的 ESLint 插件

var module_regex = /\bimport\b|\bexport\b/

module .exports =
        { processors:
                { disambiguate:
                        { preprocess: (_source_string, _file_path) => {
                                if (module_regex .test (_source_string)) {
                                        return [
                                                { text:  _source_string
                                                , filename: 'unambiguous.mjs' } ] }
                                else {
                                        return [
                                                { text: _source_string
                                                , filename: 'unambiguous.js' } ] } } } } }

使用此设置,在 ESLint 插件消除您的 Javascript 代码歧义后,ESLint 可以理解您的 sourceType 就像它应该的那样,不需要更改 .js 文件扩展名。

这非常适合 ESLint configuration/plugin 模型,作为一个插件,您甚至可以将 "overrides" 放在插件配置中,这样您所有的基本配置需要做的就是包含插件,以消除歧义。

可能会考虑在某个时候将它放在 npm 上,希望这对某人有所帮助。