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

