如何在旧版JavaScript项目中使用mocha和chai避免找不到模块错误
问题修复方案
- 修正导入路径拼写和后缀问题
你要测试的文件路径是/public/scripts/world.js,测试用例里的导入语句存在两处错误:目录名拼写少了末尾的s(写了script实际是scripts),且ES模块(你在package.json中设置了"type": "module")导入本地文件必须补全后缀名。
修正后的导入语句为:
- 修正导入路径拼写和后缀问题
import { myTestFunction } from "../../public/scripts/world.js";
- 修复模块导出混用问题
你的world.js同时使用了ES模块的export语法和CommonJS的module.exports语法,会导致导出异常,统一调整为ES模块规范即可:
删掉末尾的module.exports = { myTestFunction };,将函数定义改为ES导出写法:
- 修复模块导出混用问题
export function myTestFunction() { return {}; }
原有代码中的export var相关写法不需要修改。
- 新增Babel配置适配ES5遗留代码
在项目根目录新增.babelrc配置文件,内容如下:
- 新增Babel配置适配ES5遗留代码
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ] }
- 调整测试命令和依赖适配ES模块
你当前使用的@babel/register默认不支持ESM规范,先安装对应loader依赖:
- 调整测试命令和依赖适配ES模块
npm install @babel/esm-loader --save-dev
再修改package.json中的test命令:
"scripts": { "test": "mocha \"./tests/js/*.test.js\" --recursive --experimental-specifier-resolution=node --loader @babel/esm-loader" }
- 处理绝对路径导入解析问题
你的world.js中存在/script/bap/building.js这类以/开头的绝对路径导入,node环境默认会将其识别为系统根路径,需要安装路径映射插件处理:
先安装依赖:
- 处理绝对路径导入解析问题
npm install babel-plugin-module-resolver --save-dev
再修改.babelrc添加插件配置:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ], "plugins": [ ["module-resolver", { "root": ["./public"], "alias": { "/script": "./public/script", "/assets": "./public/assets" } }] ] }
内容的提问来源于stack exchange,提问作者mattwallace
相关产品推荐
相关产品推荐

