Node.js v15.8启用esm标识时无法识别可选链(?)语法报错求助
问题根因
报错核心是第三方esm加载器不支持ES2020新增的可选链语法,和Node.js版本无关:启动命令中-r esm参数加载的是社区第三方ES模块兼容包,该包已停止维护,未适配可选链、空值合并运算符等后续新增的JS语法,因此会提前抛出语法解析错误。
可行解决方案
方案1:切换为Node.js原生ESM支持(最推荐)
Node.js 12+版本已经内置稳定的ESM模块支持,完全兼容可选链等新语法,不需要第三方加载器,操作步骤:
- 在项目根目录的
package.json中新增配置项:"type": "module" - 修改启动命令,删除
-r esm参数即可,修改后命令为:
run.env -p ../../.env nodemon --watch ../../.env --watch ./src/ ./src/index.js
方案2:保留第三方esm包,新增babel转译配置
如果项目暂时无法切换原生ESM,可通过给esm配置babel转译支持可选链:
- 安装必要依赖:
npm install @babel/plugin-proposal-optional-chaining --save-dev
- 在
package.json中新增esm配置段:
{ "esm": { "babel": { "plugins": ["@babel/plugin-proposal-optional-chaining"] } } }
方案3:使用babel-node全局转译
如果项目存在大量新旧语法混用场景,可直接用babel-node替代node启动:
- 安装依赖:
npm install @babel/core @babel/node @babel/preset-env @babel/plugin-proposal-optional-chaining --save-dev
- 在项目根目录新增
.babelrc配置文件:
{ "presets": ["@babel/preset-env"], "plugins": ["@babel/plugin-proposal-optional-chaining"] }
- 修改启动命令中的node为babel-node即可。
内容的提问来源于stack exchange,提问作者dredtrake
相关产品推荐
相关产品推荐

