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 【问题描述】:是否可以在没有 esm
或 babel
的情况下使用 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-node
或jest-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 的模块的主要内容,如果未能解决你的问题,请参考以下文章