Node.js v12.13.0 REPL中可选链语法报错问题咨询
解决Node.js v12.13.0中可选链语法报错的问题
嘿,这个问题我之前也踩过坑!你遇到的报错是因为可选链(?.)是ES2020新增的语法特性,而Node.js v12.13.0默认并没有启用这个特性,而React项目里能正常运行是因为有转译工具帮忙处理了。
问题原因
Node.js对ES新特性的支持是分阶段推进的:
- 可选链在Node.js v14及以上版本才被默认支持
- v12.x版本中,这个特性还处于实验性阶段,必须手动开启才能使用
解决方案
给你三个可行的办法:
升级Node.js版本(最推荐)
直接把Node.js升级到v14.x或更高的LTS版本,这样可选链语法就会被默认支持,不管是REPL还是项目代码都能直接用,不用额外配置。在v12.13.0中开启实验性支持
如果你暂时不想升级版本,可以启动REPL的时候加上特定参数来启用可选链:
node --harmony-optional-chaining
启动后再输入你的代码:
const adventurer = { name: 'Alice', cat: { name: 'Dinah' } }; const dogName = adventurer.dog?.name; console.log(dogName); // 输出: undefined console.log(adventurer.someNonExistentMethod?.()); // 输出: undefined
这样就能正常运行了。
- 如果是项目代码,用转译工具处理
和React项目一样,如果你在v12.x的Node项目里想用可选链,可以用Babel或者TypeScript做转译:
- Babel需要安装
@babel/plugin-proposal-optional-chaining插件并配置 - TypeScript只要把
target设置为ES2020或更低(比如ES5),编译时会自动转译
为什么React项目里能用?
React项目一般会集成Babel(比如通过Create React App),Babel会把ES2020的新语法转换成低版本JavaScript能识别的代码,比如把adventurer.dog?.name转译成:
var dogName = adventurer.dog === null || adventurer.dog === void 0 ? void 0 : adventurer.dog.name;
所以即使Node版本低,转译后的代码也能正常运行。
内容的提问来源于stack exchange,提问作者Harsha Limaye
相关产品推荐
相关产品推荐

