【问题标题】:ESLint - "window" is not defined. How to allow global variables in package.jsonESLint - 未定义“窗口”。如何在 package.json 中允许全局变量
【发布时间】:2015-08-04 14:26:55
【问题描述】:

我正在为全局窗口对象分配一个属性,但是当我运行 eslint 时,我得到了这个:

“窗口”未定义

我看到了这个here in the eslint docs

以下将 window 定义为不应触发正在测试的规则的代码的全局变量:

valid: [
  {
    code: "window.alert()",
    globals: [ "window" ]
  }
]

我尝试在 package.json 文件中添加类似的内容以使 eslint 允许“窗口”作为全局变量,但我一定做错了。从文档看来我可能需要在一个单独的文件中执行类似的操作,但是有没有办法在 package.json 文件中定义一些允许的全局变量?

【问题讨论】:

  • 仅供参考,如果您使用节点并希望 ESLint 识别 global,那么您需要确保在您的 "env" 配置下设置了 "node": true
  • 我认为最好将stackoverflow.com/a/32481806/9888500 作为默认答案,因为它是最准确的答案?

标签: eslint


【解决方案1】:

我在这个页面上找到了它:http://eslint.org/docs/user-guide/configuring

在 package.json 中,这是可行的:

"eslintConfig": {
  "globals": {
    "window": true
  }
}

【讨论】:

  • 正确的做法是使用 "env":{"browser": true}
  • @Nicolas,是的,如果这是我首先找到的方法,我可能会使用您建议的方法,但这个答案至少有助于表明您可以在 package.json 中进行 eslint 配置.
  • 也可以像这样为 eslint 内联全局变量:/*global angular: true */
  • 该问题专门询问如何使用 package.json 文件
【解决方案2】:

有一个内置的environment: browser,其中包括window

例如.eslintrc.json:

"env": {
    "browser": true,
    "node": true,
    "jasmine": true
  },

更多信息:http://eslint.org/docs/user-guide/configuring.html#specifying-environments

另请参阅下面的the package.json answer by chevin99

【讨论】:

  • 绝对是最佳答案,谢谢。我什至没有想到:)
  • 以防其他人像我一样被抓到:这应该是.eslintrc而不是package.json
  • 有没有办法让它只适用于一个文件?
  • 我在answer by Carles Alcolea below 中找到了以下内容:在这个文件的顶部添加:/* eslint-env browser */
  • 也可以在“eslintConfig”下的package.json中。
【解决方案3】:

在项目根目录中添加.eslintrc

{
  "globals": {
    "document": true,
    "foo": true,
    "window": true
  }
}

【讨论】:

  • 不知何故将 eslingConfig 放在 package.json 中对我不起作用(除了在概念上是错误的)。不过,在 .eslintrc.json 中添加它是可行的。
  • @Petrunov .eslintrc.json 可以是 .eslintrc
  • 这在我遇到的一种情况下不起作用 - 我正在将 eslint 与 gulp 一起用于 chrome 扩展项目。在全局变量中,我设置了 "chrome": true 并且它仍然会抛出一个错误,说明它是一个无法识别的全局变量。
【解决方案4】:

如果您使用的是 Angular,您可以通过以下方式完成:

"env": {
    "browser": true,
    "node": true
},
"rules" : {
    "angular/window-service": 0
 }

【讨论】:

    【解决方案5】:

    您的 .eslintrc.json 应包含以下文本。
    这样 ESLint 就知道你的全局变量了。

    {
      "env": {
        "browser": true,
        "node": true
      }                                                                      
    }
    

    【讨论】:

      【解决方案6】:

      我知道他不是要 inline 版本。但由于这个问题有近 10 万次访问,我在这里寻找它,我将把它留给下一位程序员:

      确保 ESLint 没有使用 --no-inline-config 标志运行(如果这听起来不熟悉,你可能会很好)。然后,把它写在你的代码文件中(为了清楚和约定,它写在文件的顶部,但它可以在任何地方工作):

      /* eslint-env browser */
      

      这告诉 ESLint 你的工作环境是一个浏览器,所以现在它知道浏览器中可用的东西并相应地进行调整。

      environments有很多,可以同时声明多个,比如in-line:

      /* eslint-env browser, node */
      

      如果您几乎总是使用特定环境,最好将其设置在您的 ESLint's config file 中,然后忘记它。

      来自their docs

      环境定义了预定义的全局变量。这 可用的环境是:

      • browser - 浏览器全局变量。
      • node - Node.js 全局变量和 Node.js 范围。
      • commonjs - CommonJS 全局变量和 CommonJS 范围(将其用于使用 Browserify/WebPack 的仅浏览器代码)。
      • shared-node-browser - 节点和浏览器通用的全局变量。

      [...]

      除了环境,你可以让它忽略你想要的任何东西。如果它警告您使用 console.log() 但您不想被警告,只需内联:

      /* eslint-disable no-console */
      

      您可以查看the list of all rules,包括最佳编码实践的推荐规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多