【问题标题】:"Cannot find module" when running unit tests on node.js with react as peer dependency in common package在 node.js 上运行单元测试时“找不到模块”,反应为公共包中的对等依赖项
【发布时间】:2020-01-07 05:32:04
【问题描述】:

我有以下应用结构:

  • Application A
  • Application B
  • Common package

现在Application ABpackage.json 中添加了通用包:

{
  dependencies: {
      "commonPackage": "file:../../../commonPackage"
  }
}

这两个应用程序都使用 React,以及 common 包,都添加了带有 npm 的 React,并且在我们开始使用 React 钩子之前它工作正常。

因为当我们开始的时候,我们得到了一个Invalid Hook Call Warning,因为有“多个 React 的副本”,所以为了避免这种情况,在 common 包中,react 依赖被移动到了peerDependencies,以便 react 实例使用来自应用程序而不是来自包。

当我们运行 AB 这两个应用程序时,它在浏览器中运行良好,但是当我在控制台中运行 mocha 测试时,我得到:

ERROR in ../commonPackage/~/@uifabric/utilities/lib/customizations/Customizer.js
   Module not found: Error: Can't resolve 'react' in 'D:\myProject\commonPackage\node_modules\@uifabric\utilities\lib\customizations'

这是来自我们使用的office-ui-fabric-react 包,但它似乎是一个更普遍的依赖解析问题。

项目是TypeScript,我们使用webpack为浏览器编译应用程序,tsc为单元测试编译。

我找到了一些答案,建议将公共包中的npm link react 到应用程序node_modules 中的react 包,但似乎不对,因为公共包被两个应用程序使用,只能解决问题一个。

【问题讨论】:

  • 如果您的 mocha 测试在 commonPackage 中,并且您需要 React 来共同进行测试,您可以使用 devDependency

标签: node.js typescript npm webpack office-ui-fabric


【解决方案1】:

在上面的案例中,我们终于找到了一个解决方案

  • 将 react 作为 devDependency 添加到 Common package
  • 使用esm 包来帮助我们的测试运行了解fabric 包附带的es6 模块导出/导入。只需使用mocha --require esm ...
  • Application 中弹出webpack.config.js 并添加别名

        alias: {
            'react': path.resolve('./node_modules/react')
        }
    

应用程序 A、B 和挂钩现在可以工作了。

【讨论】:

  • 是的!这对我有用。我只在我的应用程序中使用了fabric(到目前为止),而不是通用包,所以我不需要--require esm 部分,但是最后一步,将alias 添加到我的resolve 部分@987654331 @ 让我再次工作。
猜你喜欢
  • 2022-08-15
  • 2016-02-19
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2017-05-13
  • 2018-03-05
  • 2013-07-07
  • 2012-12-01
相关资源
最近更新 更多