【问题标题】:Node v13 / Jest / ES6 — native support for modules without babel or esmNode v13 / Jest / ES6 — 原生支持没有 babel 或 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还是有必要的。

标签: node.js ecmascript-6 jestjs


【解决方案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://stackoverflow.com/a/61653104/1850276中的步骤是正确的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多