要解决问题,首先要了解问题。
您收到的错误消息来自解析器。输出如下:
file.js
1:1 error Parsing error: Octal literal in strict mode
> 39 | language.french.value = ' caract\350res';
当错误消息被正确实施时,它们是一个很好的资源,可以用来找出困难错误的根本原因。上面的错误消息不是最冗长的错误消息,但它一针见血——该消息有 2 条相关信息需要注意。
-
它是Parsing error,表示解析器在解析 JS 文件时出错。
-
并且,第二个错误是因为Octal literal 位于strict mode 中正在运行的脚本中。
把它放在一起,它就变得清晰了。解析器抛出错误,因为在 strict mode 中运行的脚本中使用了八进制。
我认为从错误消息中可以明显看出,但如果您还没有意识到,strict mode 中不允许使用八进制。不管有没有 ESLint,这都是真的。仅供参考。
问题不是严格模式——问题是模块类型
当代 ECMAScripts 已经实现了称为 ES-Modules 或 ESM 的东西。它们非常酷,但我不打算解释它们比 ECMAS 支持的模块更进一步,这对于前端 JS 来说是相对较新的东西。另一方面,Node 已经有很长时间的模块了,但是 Node.js Modules 不是标准的 ECMAS JavaScript。使用 node,您现在可以创建 ESM 模块或 CJS 模块。
问?
这与我们的问题有什么关系?
答:
因为 'use strict'; 或 Strict Mode 是 ESM 标准,并且所有 ES Modules 都在严格模式下解析,因此;当 ESLint 解析类型为 ESM 的模块时,一些非严格的结构,比如上面的八进制文字,会导致解析错误。 CJS 或 Common-JS Modules 类型的模块通常依赖于那些“严格模式非法构造”(如八进制文字),如果你依赖它们,你的包就会崩溃。我们对此无能为力。
配置您的 ESLint 解析器以解析正确类型的模块非常重要:
// 使用 babel 解析器你会这样做
{
"parser": "@babel/eslint-parser",
"parserOptions": {
"sourceType": "script"
},
}
模块类型通常定义为Scripts 或Modules,这是因为就ECMAS 而言,JavaScript 文件要么是标准JS 脚本,要么是ESM Module。如果您使用的是 package.json 文件,您还应该配置它。
{
// package.json
type: module /* or script */
}