Node可正常运行的代码为何被ESLint报“Parsing error: Unexpected token =”语法错误?
我来帮你拆解这个问题的原因和解决方案:
为什么会出现Unexpected token =错误?
你用的ESLint v7.32.0默认解析器是Espree v9.x,而类公共字段语法(也就是doAnotherThing = () => {}这种写法)是ES2022才正式纳入标准的。虽然Node.js v14已经原生支持这个特性,但ESLint v7的默认解析器Espree在当时还没有完全适配ES2022的类字段语法,所以它会把这个=识别为非法语法,抛出解析错误。
为什么装@babel/eslint-parser能解决问题?
这其实是个常见的认知误区——你不需要用Babel转译代码,也可以用它的解析器帮ESLint识别语法。@babel/eslint-parser基于Babel的核心解析器,它对最新JavaScript语法的支持通常比ESLint的默认解析器更快、更全面,哪怕你没有任何Babel配置文件,它也能正确解析类字段这类较新的语法,让ESLint顺利完成检测。这不是ESLint的局限,而是不同工具对语法支持的时间差问题:Node.js先落地了特性支持,而ESLint的默认解析器跟进得稍慢一些。
适合纯Node.js环境的解决方案
你有两个可选方案,都不需要引入React相关工具:
方案1:升级ESLint到v8及以上版本
ESLint v8及之后的版本,默认的Espree解析器已经完全支持ES2022的类字段语法。你只需要执行:
npm install eslint@latest --save-dev
然后保持原有的ESLint配置不变,检测时就不会再报错了。
方案2:不升级ESLint,安装Babel解析器
如果因为项目限制不能升级ESLint,那就安装@babel/eslint-parser和@babel/core作为开发依赖:
npm install @babel/eslint-parser @babel/core --save-dev
接着修改你的ESLint配置文件,指定使用Babel解析器:
{ "env": { "node": true, "mocha": true }, "extends": "eslint:recommended", "parser": "@babel/eslint-parser", "parserOptions": { "ecmaVersion": "latest" } }
这里不需要额外创建Babel配置文件,默认配置就足够解析类字段语法了。
补充:为什么不能用常规method(){}写法?
你提到的点完全正确——普通的类方法在传入setTimeout后,调用时会丢失this上下文:setTimeout会把回调作为普通函数执行,此时this指向的是Node.js的globalThis,而不是你的Service实例,自然访问不到this.numbers。所以使用类字段箭头函数是保持this绑定的正确做法。
内容的提问来源于stack exchange,提问作者HappyZombies

