[英]Jest es6 modules: unexpected module import
我正在尝试测试需要导入 es6 模块的文件,如下所示:
看来我缺少一些配置以使其正常工作。
如果您可以使用另一个单元测试框架轻松实现这一点,我也很感兴趣。
预先感谢您的帮助。
yarn add --dev babel-jest @babel/core @babel/preset-env
或者
npm install --save-dev babel-jest @babel/core @babel/preset-env
babel.config.js
并将其粘贴到那里:// babel.config.js
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
node: 'current',
},
},
],
],
};
package.json
和jest.config.js
中的所有 jest 设置都设置为默认值。由于 node 不支持模块,因此您必须使用 Babel 编译文件。 查看有关如何配置 Jest 和 Babel 的文档
我对 npm 包 'rgb-hex' 和 'hex-rgb' 也有类似的问题,因为它们的主要导出是以 ES6 格式完成的。 我在 Jest 中使用了一个 Typescript 项目。 我认为错误来自 Jest 端而不是 Typescript,因为 Jest 在正确转译的 javascript 上工作(根据其自己的配置)。 潜在的问题是这些 ES6 风格的主要导出会导致 Jest 出现问题(不是 tsc 或 Typescript 链),因为您需要告诉 Jest 进行转译。
我找到了一个可用的配置,使用 package 'ts-jest' 和以下配置,基于简单的预设(唯一需要注意的是忽略模式):
tsconfig.json:
{
"compilerOptions": {
"esModuleInterop": true,
"module": "es2020",
"moduleResolution": "nodenext",
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"rootDir": "./",
"allowJs": true
},
"ts-node": {
"esm": true
},
"include": ["./ts-src/**/*"]
}
玩笑.config.cjs
module.exports = {
verbose: true,
preset: 'ts-jest/presets/js-with-babel-esm',
testEnvironment: 'node',
transformIgnorePatterns: ['/node_modules/(?!(hex\-rgb|rgb\-hex)/)']
};
注意:根据“ts-jest”的文档,上面的预设设置很重要,你想要带有 esm 的 babel。
babel.config.cjs(完全是香草,但包含在内,我认为有必要)
module.exports = {
presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
};
注意来自 node_modules 的内容的忽略模式。 您在正则表达式中使用带有分组的否定来告诉它“是的,除了这些特定的 package 模式之外,忽略 node_modules 进行转译”。 Jest 出现这些东西的原因是 node_modules 中的包通常不使用从它们的主文件 index.js 文件(或类似文件)导出的 ES6。 Jest通常不会转换它们,因为那样它就必须扫描所有的 node_modules。 因此,您使用那些忽略模式(带有一些违反直觉的正则表达式)来转换 node_modules 中的特定内容。
编辑:.cjs 扩展是因为我的整个项目在 package.json 中使用了"type": "module"
。 如果您将这些文件保留为 .js,您将得到一个非常具有描述性的错误。 .cjs 扩展告诉 Node 放轻松,只使用框架使用的当前规范格式的配置(这不是 ES6 ......大声笑 JS 永远不会改变)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.