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

配置type:module后Jest仍报Cannot use import错误如何解决

报错核心原因

你遇到的是Jest低版本对ES模块的兼容性问题,原理如下:

  1. 你在package.json中配置的"type": "module",作用是告诉Node.js运行时,所有.js后缀的文件默认使用ES模块规范解析(也就是支持import/export语法)。但你使用的Jest 27版本默认只适配CommonJS模块规范,会默认把所有测试文件当做CommonJS处理,所以碰到import语句就会抛出语法错误。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:03