使用babel解析器时,Eslint禁用严格模式

时间:2017-08-09 07:20:39

标签: javascript reactjs parsing babel eslint

我使用eslint来检查React项目中的有效JavaScript。但是,当我同时使用 - rule' strict:0' - parser = babel-eslint 时,我遇到了一个问题。 例如:

没有巴贝尔解析器的Eslint:

eslint --no-eslintrc file.js

不显示输出,因为它没有找到错误。

带有babel-parser的Eslint:

eslint --no-eslintrc --parser=babel-eslint file.js

显示此错误:

file.js
1:1  error  Parsing error: Octal literal in strict mode
> 39 |  language.french.value           = ' caract\350res';

我尝试使用 - rule' strict:0' 禁用严格模式,但失败了。我仍然得到先例错误。

您是否知道使用babel-parser禁用严格模式的方法?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,最后发现an answer on github。 您可以通过将.eslintrc文件中的sourceType更改为script来关闭全局严格模式:

{
  ...
  parser: 'babel-eslint',
  parserOptions: {
    sourceType: 'script'
  }
  ...
}

或者,如果您想通过cli进行设置,则只需:

eslint --no-eslintrc --parser=babel-eslint --parser-options=sourceType:script file.js

答案 1 :(得分:0)

要解决问题,我们需要先了解问题。



您收到的错误消息来自解析器。输出如下:

file.js
1:1  error  Parsing error: Octal literal in strict mode
> 39 |  language.french.value           = ' caract\350res';


当错误消息被正确实施时,它们是找出困难错误根本原因的重要资源。上面的错误消息不是最详细的错误消息,但它一针见血——该消息有 2 条相关信息需要注意。

  1. 它是一个 Parsing error,表示解析器在解析 JS 文件时发生错误。

  2. 而且,第二个错误是因为 Octal literal 位于 strict mode 中运行的脚本中。

放在一起,就一目了然了。解析器抛出错误,因为在 strict mode 中运行的脚本中使用了八进制。

我认为错误消息很明显,但如果您没有意识到,strict mode 中不允许使用八进制。不管有没有 ESLint,这都是真的。仅供参考。


问题不是严格模式——问题是模块类型

同时代的ECMAScripts 已经实现了一种叫做ES-ModulesESM 的东西。它们非常酷,但我不会解释它们比ECMAS 支持的模块更进一步的内容,这是前端 JS 相对较新的东西。另一方面,Node 已经有很长时间的模块了,但是 Node.js Modules 不是标准的 ECMAS JavaScript。使用节点,您现在可以创建 ESM 模块或 CJS 模块。



问?

这些与我们的问题有什么关系?

答:

好吧,因为 'use strict';Strict Mode 是 ESM 标准,并且所有 ES Modules以严格模式解析,因此;当 ESLint 解析类型为 ESM 的模块时,一些非严格结构,如上面的八进制文字,会导致解析错误。类型为 CJSCommon-JS Modules 的模块通常依赖于那些“严格模式非法构造”(如八进制文字),如果你依赖它们,你的包就会爆炸。我们对此无能为力。

配置 ESLint 解析器以解析正确类型的模块很重要:

// 使用 babel 解析器你会这样做

  {
    "parser": "@babel/eslint-parser",
    "parserOptions": {
      "sourceType": "script"
    },
  }

模块类型通常定义为ScriptsModules,这是因为就ECMAS 而言,JavaScript 文件要么是标准JS 脚本,要么是ESM Module。如果您使用 package.json 文件,您还应该配置它。

{
 // package.json

  type: module /* or script */
}