配置type:module后Jest仍报Cannot use import错误如何解决
报错核心原因
你遇到的是Jest低版本对ES模块的兼容性问题,原理如下:
- 你在package.json中配置的
"type": "module",作用是告诉Node.js运行时,所有.js后缀的文件默认使用ES模块规范解析(也就是支持import/export语法)。但你使用的Jest 27版本默认只适配CommonJS模块规范,会默认把所有测试文件当做CommonJS处理,所以碰到import语句就会抛出语法错误。 - ES模块规范要求导入本地自定义文件时必须补全文件后缀,你测试代码中
import app from '../app'缺少.js后缀,也是后续会触发的隐藏问题。
解决步骤
1. 适配Jest的ES模块支持
推荐直接升级Jest到28及以上版本(原生支持ES模块),同时修改测试启动命令:
- 升级Jest到最新稳定版:
npm install --save-dev jest@latest
- 修改package.json的
scripts.test字段,添加ES模块支持参数:
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
参数说明:
--experimental-vm-modules是Node.js提供的实验性标志,用来启用VM模块API的ES模块支持,是当前Jest运行ES模块测试的必要配置。
2. 修复测试文件的导入语法
把tests/server.test.js第一行的导入语句补全后缀:
import app from '../app.js'
3. 修正错误的测试断言
你的/messages接口直接返回消息数组,不是返回{messages: 数组}的对象,原有断言expect(res.body).toHaveProperty('messages')会失败,修改测试用例:
it('GET /messages should show all messages', async () => { const res = await requestWithSupertest.get('/messages'); expect(res.status).toEqual(200); expect(res.type).toEqual(expect.stringContaining('json')); expect(res.body).toEqual(['hello', 'hi', 'its working']); });
验证
运行npm run test即可看到测试正常执行并通过。
内容的提问来源于stack exchange,提问作者Santosh Kumar
相关产品推荐
相关产品推荐

