Node.js v18+Babel:模块导入省略扩展名及构建后运行问题
解决方案
问题1:开发环境省略模块导入的.js扩展名
Node.js ES模块规范默认要求导入自定义模块时必须添加扩展名,要省略的话,改用babel-node配合nodemon处理开发环境,Babel会自动补全模块扩展名:
- 安装依赖:
npm install --save-dev @babel/node
- 修改
package.json的dev脚本:
{ "scripts": { "dev": "nodemon --exec babel-node src/app.js" } }
问题2:生产环境转译后CommonJS与ES模块冲突
方案A:让Babel输出ES模块(推荐,适配Node.js 18原生ES模块支持)
修改babel.config.json,给@babel/preset-env添加modules: false,禁止转译ES模块为CommonJS:
{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "18" }, "debug": true, "useBuiltIns": "usage", "corejs": 3, "modules": false // 新增:保留ES模块格式 } ] ] }
这样转译后的build目录文件仍为ES模块,配合根目录"type": "module"可正常运行,不会出现require is not defined错误。
方案B:给build目录单独配置CommonJS
在build目录下新建package.json,指定该目录下文件为CommonJS:
{ "type": "commonjs" }
根目录package.json的"type": "module"仅作用于src目录,build目录的文件会被识别为CommonJS,兼容Babel转译后的代码。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

