求助:使用Mocha加载.mjs文件并运行测试失败的解决方法
解决Mocha加载.mjs文件报错的问题
问题核心
你的测试环境是CommonJS模式(.js测试文件,未设置package.json的type: module),但加载了node_modules里的ES模块文件xlsx.mjs,Node.js默认不会转译node_modules中的代码,导致识别不了export语法。下面是几种可行的解决方法:
方案1:直接导入xlsx的CommonJS兼容入口
这是最简单的解决方案,xlsx包本身提供了CommonJS版本的导出,修改测试代码中的导入语句即可:
// 替换原来的.mjs导入 import * as XLSX from 'xlsx';
Webpack能正常处理.mjs是因为它会统一转译模块,但测试环境可以直接用包的默认入口,避开ES模块加载问题。
方案2:让Babel转译xlsx模块
如果必须使用.mjs入口,需要配置Babel转译node_modules中的xlsx:
- 确保安装了
@babel/register:npm install --save-dev @babel/register - 修改Mocha命令,让它通过Babel转译代码:
mocha --require @babel/register src/**/*.spec.js - 修改你的
.babelrc,添加ignore规则,让Babel不忽略xlsx模块:{ "presets": [ "@babel/preset-env", "@babel/preset-react" ], "plugins": [ "@babel/plugin-transform-runtime", "react-hot-loader/babel", ["module-resolver", { "alias": { "@src": "./src" } }] ], "ignore": [ "/node_modules/(?!xlsx/)" // 除xlsx外,忽略其他node_modules文件 ], "env": { "coverage": { "plugins": [ "istanbul" ] } } }
这样Babel会把xlsx的ES模块代码转译为CommonJS,Mocha就能正常加载了。
方案3:将项目切换为ES模块模式
如果你的项目整体可以切换为ES模块:
- 在
package.json中添加:"type": "module" - 调整Mocha命令(Mocha v10+支持Node.js的ES模块):
注意:此时你的测试文件如果是mocha src/**/*.spec.js.js会被当作ES模块,所有require语句需要改成import;如果要保留CommonJS语法的测试文件,需将其扩展名改为.cjs。
内容的提问来源于stack exchange,提问作者Marco Faustinelli
相关产品推荐
相关产品推荐

