提问者:小点点

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


是否可以在没有< code>esm或< code>babel的情况下使用Jest测试ES6模块?由于< code >节点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模块也可以原生使用吗?


共3个答案

匿名用户

是的,可以通过<code>jest@25.4.0。从这个版本开始,有一个esm的本地支持,所以您不再需要使用babel来传输代码。

它还没有被记录下来,但根据这个问题,你必须做3个简单的步骤来实现这一点(在撰写这个答案时):

  • 确保不要通过在开玩笑的配置文件中设置 transform: {} 来转换导入语句
  • 运行 node@^12.16.0 ||

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

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

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

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

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

匿名用户

请注意,这仍然是实验性的,但我们已经记录了如何测试这一点,所以希望能减少混乱。

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

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

匿名用户

我遵循了接受答案中提供的提示,但我在包中添加了属性“type”:“module”。json以便jest正常工作。这就是我所做的:

pack. 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"
  }