Node v13 / Jest / ES6 — 对没有 babel 或 esm 的模块的原生支持

phi*_*ipp 25 node.js ecmascript-6 jestjs

是否可以在不使用esm或不使用 Jest 的情况下使用 Jest 测试 ES6 模块babel?由于node v13本机支持 es6 已经尝试过:

//package.json
{
  …
  "type": "module"
  …
}



//__tests__/a.js
import Foo from '../src/Foo.js';


$ npx jest

Jest encountered an unexpected token
…
Details:

/home/node/xxx/__tests__/a.js:1
import Foo from '../src/Foo.js';
^^^^^^

SyntaxError: Cannot use import statement outside a module
Run Code Online (Sandbox Code Playgroud)

当 babel 添加一个转译器时,它可以工作,但是 es6 模块也可以在本地使用吗?

Rad*_*uka 21

是的,可以从jest@25.4.0. 从这个版本开始,有一个对 esm 的原生支持,所以你不必再用 babel 转译你的代码。

它尚未记录在案,但根据此问题,您必须执行 3 个简单的步骤来实现这一点(在撰写此答案时):

  • 确保不要import通过transform: {}在 jest 配置文件中设置来转换语句
  • node@^12.16.0 || >=13.2.0--experimental-vm-modules旗奔跑
  • 使用jest-environment-node或运行您的测试jest-environment-jsdom-sixteen

所以你的笑话配置文件应该至少包含这个:

export default {
    testEnvironment: 'jest-environment-node',
    transform: {}
    ...
};
Run Code Online (Sandbox Code Playgroud)

要设置--experimental-vm-modules标志,您必须package.json按如下方式运行 Jest (我希望将来会改变):

"scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
}
Run Code Online (Sandbox Code Playgroud)

我希望,这个答案对你有帮助。

  • 使用节点 14 和玩笑 26 对我来说不起作用。如果我删除“transform”,我会收到以下错误“SyntaxError:无法在模块外部使用 import 语句” (7认同)
  • 对 jest 配置的更改对我来说不是必需的。只需在 package.json 中指定 `"type": "module"` 并使用 `--experimental-vm-modules` 运行节点就足够了(Jest 26.6.3 和 Node v14.15.4)。还有一种更简洁的方式来指定测试命令: `"test": "NODE_OPTIONS=--experimental-vm-modules jest"` (7认同)
  • 不要忘记在 package.json 中设置 "type": "module" (3认同)
  • 我尝试过这个,但效果并不是很好。“jest”名称在测试模块中不可用。我确信根据链接的问题还存在其他问题。遗憾的是,目前看来 Babel 是正确的选择。 (2认同)
  • 我一直在努力解决 @sdt 描述的问题,但我最终发现 `jest` 对象“也可以通过 `import {jest} from '@jest/globals'` 显式导入” https://jestjs.io/文档/en/jest-object (2认同)

Sim*_*enB 6

请注意,这仍然是实验性的,但我们已经记录了如何测试它,因此希望减少混乱。

https://jestjs.io/docs/en/ecmascript-modules

/sf/answers/4315717311/中的步骤是正确的