【问题标题】:Use scoped packages with Jest将作用域包与 Jest 一起使用
【发布时间】:2018-02-08 05:31:09
【问题描述】:

我正在使用 react-native 和 typescript 开发应用程序并使用 Jest 进行测试,但是当我使用范围包 (@assets) 时遇到问题,jest 找不到路径并给出错误。

目录结构如下:

project/
  assets/
    img/
      foo.png
    package.json
  src/
    Foo.ts
  build/
    Foo.js


// assets/package.json
{
  "name": "@assets" // My @assets scope
}

// build/Foo.js
const image = require('@assets/img/foo.png'); // <- error in Jest

所以当我开玩笑的时候:

npm run jest build/

找不到'@assets/img/foo.png'并抛出错误:

无法从“Foo.js”中找到模块“@assets/img/logo.png”

如何在 Jest 中使用范围包?

Jest 版本:20.0.4

谢谢

【问题讨论】:

  • 呃。如果您在 node_modulesnpm installed / linked 中没有 package.json ,它不会关心您是否在子文件夹中有 package.json 。你仍然可以通过 webpack 别名让它工作,见webpack.js.org/configuration/resolve
  • @DimitarChristoff,谢谢老兄,我找到了moduleNameMapper,我可以把它放在开玩笑的配置中。

标签: reactjs typescript scope package jestjs


【解决方案1】:

对于那些在作用域组织下使用私有包的人,我是这样解决这个问题的:

"jest": {
  "moduleNameMapper": {
    "^@org-name/(.*)$": "<rootDir>/node_modules/@org-name/$1/dist/$1.es5.js"
  }
}

这假设所有作用域包都具有与其导出模块相似的路径。如果没有,您可以单独指定它们:

"jest": {
  "moduleNameMapper": {
    "^@org-name/package-one$": "<rootDir>/node_modules/org-name/package-one/dist/package.js",
    "^@org-name/package-two$": "<rootDir>/node_modules/org-name/package-two/build/index.js"
  }
}

【讨论】:

  • 或简称:"^@org-name/(.*)$": "&lt;rootDir&gt;/node_modules/@org-name/$1"
【解决方案2】:

只需要在 jest config 中定义moduleNameMapper

// package.json
"jest": {
  "moduleNameMapper": {
      "^@assets.+\\.(png)$": "<rootDir>/assetsTransformer.js"
  },
}

// assetsTransformers.js
const path = require('path');

module.exports = {
  process(src, filename, config, options) {
    return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
  },
};

感谢this comment :-)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 2018-04-04
  • 2018-08-09
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2021-09-17
相关资源
最近更新 更多