节点v13 / Jest / ES6 —对没有babel或esm的模块的本机支持

时间:2020-02-24 09:23:46

标签: node.js ecmascript-6 jestjs

是否可以在没有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模块也可以本机使用吗?

4 个答案:

答案 0 :(得分:11)

是的,可以从jest@25.4.0开始。从此版本开始,ESM具有原生支持,因此您不再需要使用babel来转换代码。

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

  • 通过在Jest配置文件中设置import,确保您不会变换transform: {}语句
  • 使用node@^12.16.0 || >=13.2.0标志运行--experimental-vm-modules
  • 使用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"
}

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

除了@Radovan Kuka的答案外,以下是使用npx通过ES模块运行Jest的方法:

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

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

答案 3 :(得分:1)

请注意,这仍处于试验阶段,但是我们已经记录了如何进行测试,因此希望可以减少混乱。

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

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

相关问题