Node 14使用可选链报语法错误,Babel依赖相关问题如何解决?
问题根源
- 你当前使用的所有Babel核心依赖都是6.x版本,该版本发布时可选链语法还未进入ES标准,没有内置对应的转译规则,无法识别
?.语法就会抛出语法错误 babel-core是babel-cli@6.x的内置依赖,所以你没有显式安装也会被连带安装babel-node是Babel提供的即时转译执行工具,你启动脚本里的配置是用它实时转译src目录下的代码再交给Node执行,转译失败就会直接阻断服务启动
解决方案
方案1:移除babel-node(推荐,适配你当前Node版本)
Node.js v14.17.5已经原生支持可选链、空值合并等ES2020特性,不需要额外转译,完全可以安全移除Babel相关依赖,步骤如下:
- 卸载所有Babel相关依赖:
npm uninstall @babel/helper-hoist-variables babel-cli babel-eslint babel-plugin-transform-async-to-module-method babel-plugin-transform-es2015-modules-commonjs babel-plugin-transform-flow-strip-types babel-plugin-transform-object-rest-spread babel-preset-latest eslint-plugin-babel
- 修改package.json的启动脚本,直接用node执行即可:
"scripts": { "start": "nodemon ./src/index.js --watch ./src | bunyan" }
- 如果你的代码里用到了Flow类型注解、ES Modules转CommonJS之类的特殊需求,要么改用TypeScript,要么开启Node原生的ES Modules支持(在package.json中添加
"type": "module")即可。
方案2:保留babel-node,升级Babel配置适配可选链
如果你的项目有其他依赖Babel转译的场景(比如要兼容更低Node版本、用到特殊Babel插件),可以升级Babel到7.x版本并添加可选链转译规则:
- 卸载旧版Babel依赖:
npm uninstall babel-cli babel-preset-latest babel-plugin-transform-async-to-module-method babel-plugin-transform-es2015-modules-commonjs babel-plugin-transform-object-rest-spread
- 安装新版Babel相关依赖:
npm install --save-dev @babel/cli @babel/core @babel/node @babel/preset-env @babel/plugin-proposal-optional-chaining
- 项目根目录新增
.babelrc配置文件:
{ "presets": ["@babel/preset-env"], "plugins": ["@babel/plugin-proposal-optional-chaining"] }
- 原有启动脚本不需要修改,重启服务即可正常识别可选链语法。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

