Npm Jest和ES2015导入。使jest尊重package.json中的pkg.module声明

Npm Jest和ES2015导入。使jest尊重package.json中的pkg.module声明,npm,module,ecmascript-6,node-modules,jestjs,Npm,Module,Ecmascript 6,Node Modules,Jestjs,我正在通过我的应用程序中的npm导入。环境包括webpack、babel、typescript、react、redux、jest 我设法使Jest在ES2015导入中正常工作,但Jest拒绝使用es.js版本的deepmerge(请参阅以获取参考) 简单地说,deepmerge使用了一个名为的包,该包为CommonJS兼容环境和库(如RequireJS)编译ES2015发行版和其他发行版。然后在deepmerge的package.json中引用它们,如下所示: "main": "dist/u

我正在通过我的应用程序中的npm导入。环境包括webpack、babel、typescript、react、redux、jest

我设法使Jest在ES2015导入中正常工作,但Jest拒绝使用es.js版本的deepmerge(请参阅以获取参考)

简单地说,deepmerge使用了一个名为的包,该包为CommonJS兼容环境和库(如RequireJS)编译ES2015发行版和其他发行版。然后在deepmerge的package.json中引用它们,如下所示:

  "main": "dist/umd.js",
  "module": "dist/es.js"
这样,当在应用程序中导入deepmerge时,编译器应该足够明智,根据其运行的环境使用正确的文件

这可能过于简单了,但你应该明白这一点

现在,我的应用程序正在解析一切,并且正在编译脚本的正确版本(
es.js
)。相反,Jest导入了错误的文件(
umd.js
),从而破坏了测试(
TypeError:deepmerge_1.default不是函数

我已经找到了解决办法,比如在import语句中指定正确文件的路径,而不是依赖于从“deepmerge”导入deepmerge。但是我觉得应该有一种更好的方法,以防包的维护人员决定更改路径、文件名或其他任何东西,这种方法更适合未来

有什么想法吗


jest.config.json

{
  "transformIgnorePatterns": [
    "<rootDir>/node_modules/(?!deepmerge)"
  ],
  "transform": {
    ".(js|ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
  "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json"]
}

编辑:稍作调整,使其使用包的模块字段。由于jest.mock的原因,他无法生成一个helper函数,不得不将该名称重复三次

jest.mock('modulename', () => require('modulename/' + require('modulename/package.json').module));

原始答复:

我在导入我们自己的一个使用package.module的内部库时遇到了同样的问题。我的理解是,因为JEST是在节点中运行的(我们的测试不通过WebPack),所以会忽略package.module,而使用package.main

我能够在测试中使用模拟解决这个问题:

jest.mock('modulename', () => require('modulename/builds/es'));
对于每个使用pkg.module的模块来说,这样做很乏味,但比手动模拟其内容要好,而且我可以保持测试代码的导入完好无损

另一种方法是编写一个转换,将模块的es版本映射/代理到commonjs版本,但这并没有让我走得太远

我希望将来有更好的解决办法

jest.mock('modulename', () => require('modulename/builds/es'));