如何在Node.js中无需修改配置或扩展名运行.js文件为ES模块
解决思路与方案
1. 不修改package.json的前提下兼容测试与build脚本
核心是让Node.js区分测试文件和build.js的模块规范,无需全局修改type字段:
方案A:给测试文件指定ES模块后缀
将所有测试文件的后缀改为.mjs,Node.js会自动将这类文件当作ES模块解析,而原有的build.js(.js后缀)保持CommonJS解析逻辑,完全互不影响。
如果测试代码依赖浏览器环境API(如window、document),需要额外安装jsdom并在测试文件头部模拟环境:
import { JSDOM } from 'jsdom'; const dom = new JSDOM('<!DOCTYPE html>'); global.window = dom.window; global.document = dom.window.document;
方案B:用Babel转译测试代码
通过Babel将测试文件中的ES模块语法转译为CommonJS,让Node.js可以直接执行:
- 安装依赖:
npm install --save-dev @babel/core @babel/cli @babel/preset-env
- 新建
.babelrc配置文件:
{ "presets": [["@babel/preset-env", { "targets": { "node": "current" } }]] }
- 修改测试命令(在package.json的scripts中):
"test": "babel test --out-dir dist-test && node dist-test/**/*.test.js"
如果使用Jest等测试框架,可直接配置Jest启用Babel转译,无需手动处理转译输出。
2. 修复Webpack失效问题
如果之前修改了package.json的type字段导致Webpack报错,大概率是Webpack配置文件的模块规范不兼容:
- 将Webpack配置文件的后缀改为
.cjs(如webpack.config.cjs),这样即使package.json设置了"type": "module",Node.js仍会按CommonJS解析该配置文件,Webpack可以正常读取。 - 若坚持使用
.js后缀,需将配置文件中的module.exports改为ES模块的export default语法,同时确保Webpack版本支持ES模块配置(Webpack 5+已支持)。
内容的提问来源于stack exchange,提问作者KernelDeimos
相关产品推荐
相关产品推荐

