{
"private": true,
"devDependencies": {
"jest": "^29.0.3",
"jest-environment-jsdom": "^29.0.3",
"my-pkg": "file:./my-pkg"
}
}
:
jest.config.js
module.exports = {
testEnvironment: 'jsdom',
}
:
my-pkg/package.json
{
"name": "my-pkg",
"version": "0.1.0",
"exports": {
".": {
"browser": {
"require": "./browser-require.js",
"import": "./browser-import.js"
}
}
}
}
:
my-pkg/browser-require.js
module.exports = 'browser require'
:
my-pkg/browser-import.js
最后,测试:export default 'browser import'
测试通过,这意味着玩笑选择了CJS版本。如果我从
const myPkg = require('my-pkg')
test('test', () => {
expect(myPkg).toBe('browser require')
})
中删除CJS导出,则JEST会失败。我认为,只有在启用实验性ESM支持时,JEST才会使用ESM导出。如果是my-pkg
,它们有一个Cannot find module 'my-pkg'
导出,因为它在ESM中,开玩笑将无法将其解析为CJ,从而导致他们描述的错误。P.S。即使在Babel Jest仍将使用CJ,Babel也只会在进行测试之前将ESM汇编为CJ。而且只有您的源和测试代码,而不是依赖性,因此不会编译
uuid
。
没有,默认情况下,Jest更喜欢Commonjs模块。但是,它也能够使用ES模块,因为它在引擎盖下使用了babel(
"default"
,jest的推荐设置)来转换其在其测试环境中执行的所有代码。
Jest可以使用babel将新的JS语法转换为常见的JS,以便它可以运行它,默认情况下它可以运行。
这可能是一个问题的唯一时间是,如果您的软件包处于变压器忽略的路径中,例如
my-pkg
您可能需要像So这样调整那条路
babel-jest
https://jestjs.io/docs/configuration#transformignorepatterns-arraystring