Node.js使用ES6/7/8特性报ERR_MODULE_NOT_FOUND错误如何解决?
问题产生原因
- 你使用的
es2015预设早已被官方废弃,它仅支持转译ES2015(ES6)版本的语法,无法兼容ES7、ES8及更高版本的新特性,也没有适配Node.js运行环境的专属配置。 - Babel基础配置缺少模块解析规则:Node.js原生默认遵循CommonJS规范,如果你代码中使用了ES Module的
import/export语法,且没有配置Babel将ESM转译为CommonJS格式,就会触发模块找不到的报错。 - 仅配置了
.babelrc文件,但没有安装对应的转译、运行依赖包,配置无法生效。
解决方法
方案一:使用Babel转译兼容低版本Node.js
- 先卸载废弃的旧依赖,安装最新的Babel相关组件:
npm uninstall babel-preset-es2015 npm install @babel/core @babel/preset-env @babel/node -D
- 替换
.babelrc的配置内容为以下内容:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ] }
该配置会自动匹配你当前使用的Node.js版本,转译所有该版本不支持的ES新特性,同时默认将ESM语法转为Node.js兼容的CommonJS格式。
3. 调整项目启动命令,将原本直接用node xxx.js的启动方式改为用babel-node启动,也可以先通过babel命令全量转译源码后再运行转译后的文件。
示例package.json启动配置:
{ "scripts": { "start": "babel-node ./src/index.js" } }
配置完成后执行npm start即可正常运行项目。
4. 如果项目用到了装饰器、类私有属性等ES7+的高级语法,还需要按需安装@babel/plugin-proposal-decorators、@babel/plugin-proposal-class-properties等对应插件,添加到.babelrc的plugins数组中即可。
方案二:高版本Node.js原生支持(无需Babel)
如果你使用的是Node.js 13.2.0及以上版本,可以直接在项目根目录的package.json中添加"type": "module"配置,Node.js就会原生支持ES Module语法,注意这种场景下import本地文件时需要补全后缀名,比如需要写import utils from './utils.js',不能省略.js后缀。
内容的提问来源于stack exchange,提问作者Hamilton Xavier
相关产品推荐
相关产品推荐

