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

Vue/Nuxt项目从Jest切换至Mocha+Chai开展TDD时出现"Cannot use import statement outside a module"错误的原因排查

问题原因及解决方案

这个错误的核心原因很明确:Node.js 默认将 .js 文件视为 CommonJS 模块,而你在测试代码中使用了 ES 模块的 import 语法,Mocha 在默认配置下会遵循 Node 的模块规则,所以无法识别 import 语句,从而抛出语法错误。

另外还有个小细节需要注意:你的测试文件后缀是 .spec.json,这会让 Mocha 把它当作 JSON 数据文件处理,而不是可执行的测试脚本,这也会导致执行异常,首先要把后缀改成 .spec.js。

接下来给你几个可行的解决办法,你可以根据项目情况选择:

方法一:将整个项目设置为 ES 模块

在项目根目录的 package.json 中添加 "type": "module" 字段:

{
  "type": "module",
  // 其他现有配置...
  "scripts": {
    "test": "mocha"
  }
}

这样 Node 会把所有 .js 文件都当作 ES 模块处理,你就可以正常使用 import 语法了。不过要注意,如果项目中还有使用 require() 的 CommonJS 代码,可能需要一并调整为 ES 模块语法(比如改成 import),否则会出现新的兼容性问题。

方法二:给测试文件使用 ES 模块专属后缀

把测试文件的后缀从 .spec.js 改成 .spec.mjs,Node 会自动识别 .mjs 文件为 ES 模块,不需要修改项目整体配置。这种方式适合只在测试代码中使用 ES 模块,而项目主体还是 CommonJS 的场景。

方法三:使用 CommonJS 语法导入 Chai

如果你不想调整模块配置,也可以直接把测试代码中的 import 改成 CommonJS 的 require 语法:

const { expect } = require('chai');
describe('test', function () {
  it('should be rendered', function () {
    const comp = [1, 2, 3];
    expect(Math.max(...comp)).to.be.above(1);
  });
});

(另外注意你的断言里少了个 be,应该是 .to.be.above(1),否则也会报错哦)

最后,执行 npm test 应该就能正常运行测试了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:42:29