安装多个版本的 React 的 NPM 7 工作区

Pat*_*nch 6 npm reactjs npm-workspaces

我们有一个 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)

Run Code Online (Sandbox Code Playgroud)

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

use*_*ca8 0

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


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

重要笔记:

  1. overrides只能在存储库的 root 中设置package.json,而不是在单个工作区package.json文件中设置。
  2. 添加覆盖后,您可能需要刷新 node_modules 和 package-lock.json (希望通过修复此问题尽快修复)
  3. 您有责任确保您应用的覆盖不会破坏事物:许多具有依赖项的包"react": "^16.x.x"实际上与 React 17 兼容,只是尚未更新,但不是全部;有些可能与 React 17 不兼容。请小心并查找您要覆盖其依赖项的包的存储库上的问题"^16.x.x"。您甚至可能可以应用直接支持 React 17 的新版本或替代方案。
  4. 您可能还需要覆盖react-domreact确保两者不会不同步。

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

  "overrides": {
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
  }
Run Code Online (Sandbox Code Playgroud)