NPM 7 Workspaces 安装多个版本的 React

NPM 7 Workspaces installing multiple versions of react

我们有一个 mono-repo,我正在迁移到 npm 7 的工作区。

当前文件夹组织:

\React
  - package.json (defines workspaces for \apps and \packages)
  \apps
    \someApp
      - React 17.0.1 (Dependency)
    \otherApp
  \packages
    \component-library
      - React 16.14.0 || 17.0.0 (Peer)
      - Storybook (6.1)
      - Storybook MUI Add On
    \framework
      - React 16.14.0 || 17.0.0 (Peer)

React 文件夹中的

运行 npm ci 在 \React\node_modules 中安装 React 16.14,在 \React\apps\someApp\node_modules 中安装 React 17.0.0。当尝试 运行 应用程序时,由于安装了多个版本,我们会收到预期的挂钩错误。但是我找不到任何 明确 需要 React 16.14?

如果您使用的是 webpack,并且您的配置是半基于 create-react-app,您可以调整模块路径,至少这对我有用:

          modules: [path.join(__dirname, '../node_modules'), 'node_modules', paths.appNodeModules].concat(modules.additionalModulePaths || []),

假设您的 webpack.config.js 在 apps/someapp/config 目录中

这个问题中的具体问题看起来可能是 NPM 7 早期(大概)版本中的众多树艺师错误之一 - 在 NPM 8 及更高版本中,它应该看到 React 17 得到所有支持,因此应该选择那个。


对于使用较新版本的 NPM 有类似问题的任何人 - 在 NPM >=8.3.0 中,您可以使用 overrides 强制使用特定版本。

重要提示:

  1. overrides 只能在 repo 的根 package.json 中设置,而不是单独的工作区 package.json 文件。
  2. 您可能需要在添加覆盖后刷新 node_modules 和 package-lock.json(希望 fix to this issue 尽快修复)
  3. 您有责任确保您应用的覆盖不会破坏事物:许多 具有 "react": "^16.x.x" 依赖项的包实际上与 React 17 兼容并且只是还没有更新,但不是全部;有些可能合法地与 React 17 不兼容。小心并在您正在覆盖其 "^16.x.x" 依赖项的包的回购协议中寻找问题。您甚至可以应用直接支持 React 17 的新版本或替代版本。
  4. 您可能还需要覆盖 react-dom 以及 react 以确保两者不会不同步。

像这样的东西应该在根中工作 package.json:

  "overrides": {
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
  }