您可以在28版+

问题描述 投票:0回答:1

从我观察到的内容,情况恰恰相反。例如,

的问题是,它仅导出ESM(用于浏览器),但Jest需要CJ。我用本地软件包对此进行了测试:

uuid

package.json
unit-testing jestjs
1个回答
4
投票

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

	

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.