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

Posted

技术标签:

【中文标题】Node v13 / Jest / ES6 — 原生支持没有 babel 或 esm 的模块【英文标题】:Node v13 / Jest / ES6 — native support for modules without babel or esm 【发布时间】:2020-06-07 21:33:57 【问题描述】:

是否可以在没有 esmbabel 的情况下使用 Jest 测试 ES6 模块?由于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

babel 加了转译器就可以了,但是 es6 模块也可以原生使用吗?

【问题讨论】:

Foo 是默认从 '../src/Foo.js' 导出的吗? 是的,就是这样。 根据issue#9430,(以及本期引用提及的其他问题),似乎是babel或esm还是有必要的。 【参考方案1】:

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

尚未记录,但根据this issue,您必须执行 3 个简单的步骤才能实现(在撰写此答案时):

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

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

export default 
    testEnvironment: 'jest-environment-node',
    transform: 
    ...
;

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

"scripts": 
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"

希望这个回答对你有帮助。

【讨论】:

我试过了,但效果不是很好。 jest 名称在测试模块中不可用。根据链接的问题,我确定还有其他问题。可悲的是,现在看来 Babel 是要走的路。 使用节点 14 和 jest 26 对我不起作用。如果我删除 transform,我会收到以下错误 SyntaxError: Cannot use import statement outside a module 我一直在努力解决@sdt 描述的问题,但我终于发现jest 对象“也可以通过import jest from '@jest/globals' 显式导入”jestjs.io/docs/en/jest-object 不要忘记在 package.json 中设置 "type": "module" 对我来说不需要更改 jest 配置。只需在 package.json 中指定 "type": "module" 并使用 --experimental-vm-modules 运行节点就足够了(Jest 26.6.3 和节点 v14.15.4)。还有一种更简洁的方式来指定测试命令:"test": "NODE_OPTIONS=--experimental-vm-modules jest"【参考方案2】:

我按照接受的答案中提供的提示进行操作,但我在 package.json 中添加了属性 "type": "module" 以便开玩笑正常工作。这就是我所做的:

package.json:

"devDependencies": 
    "jest": "^26.1.0",
    "jest-environment-jsdom-sixteen": "^1.0.3",
    "jest-environment-node": "^26.1.0"
  ,
  "scripts": 
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
  ,
  "type": "module",
  "jest": 
    "transform": ,
    "testEnvironment": "jest-environment-jsdom-sixteen"
  

【讨论】:

如here 所述,我不需要更改 jest 配置。【参考方案3】:

除了@Radovan Kuka 的回答,这里是如何使用 ES 模块运行 Jest,使用 npx

"test:monitoring": "npx --node-arg=--experimental-vm-modules jest -f monitoring.test.js --detectOpenHandles",

好处是不需要提供绝对的node_modules 路径。

【讨论】:

在 27.0.0-next.8 中,我将 npx 从命令中取出,一切正常。【参考方案4】:

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

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

https://***.com/a/61653104/1850276中的步骤是正确的

【讨论】:

以上是关于Node v13 / Jest / ES6 — 原生支持没有 babel 或 esm 的模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在Webpack中使用Jest和ES6功能

Discord.js:错误:更新到 v13 后“找不到模块 'node:events'”

babel-jest 不处理模块内的 ES6

Jest - 测试一个 ES6 类

Jest 是不是支持 ES6 导入/导出?

使用 React、Typescript 和 ES6 进行 Jest 测试