You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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:

  1. 确保安装了@babel/register:
    npm install --save-dev @babel/register
    
  2. 修改Mocha命令,让它通过Babel转译代码:
    mocha --require @babel/register src/**/*.spec.js
    
  3. 修改你的.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模块:

  1. 在package.json中添加:
    "type": "module"
    
  2. 调整Mocha命令(Mocha v10+支持Node.js的ES模块):
    mocha src/**/*.spec.js
    
    注意:此时你的测试文件如果是.js会被当作ES模块,所有require语句需要改成import;如果要保留CommonJS语法的测试文件,需将其扩展名改为.cjs。

内容的提问来源于stack exchange,提问作者Marco Faustinelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:20:31