NPM 7 Workspaces 安装多个版本的 React

6

我们有一个单一代码库,我正在将其迁移至 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 16.14到\React\node_modules目录下,并在\React\apps\someApp\node_modules目录下安装17.0.0版本。尝试运行应用程序时,由于安装了多个版本,我们得到了预期的钩子错误。但是我找不到任何明确要求使用React 16.14的内容?

我也遇到了与npm 7工作区完全相同的问题。 - ali
在我的packages/component-library文件夹内,我尝试了npm link ../../node_modules/react。它抛出了一个错误,显示npm ERR!无法解决依赖项: npm ERR!来自@ reach / router@1.3.4的同级反应@"15.x || 16.x || 16.4.0-alpha.0911da3"看起来storybook需要使用 @react/router,它使用 react 16.14 - ali
做了一些更多的谷歌搜索,看起来这是一个未解决的问题 https://github.com/storybookjs/storybook/issues/14119 - ali
2个回答

0
如果你正在使用webpack,并且你的配置是基于create-react-app的,你可以调整模块路径,至少这对我有效:
          modules: [path.join(__dirname, '../node_modules'), 'node_modules', paths.appNodeModules].concat(modules.additionalModulePaths || []),

假设你的 webpack.config.js 文件在 apps/someapp/config 目录下。

0
问题中的具体问题似乎是NPM 7早期版本中的许多树专家错误之一 - 在NPM 8及更高版本中,它应该看到React 17被所有支持,因此应该选择它。

对于那些遇到最新版本 NPM 相似问题的人来说,在 NPM >= 8.3.0 中,你可以使用 overrides 强制使用特定版本。

重要提示:

  1. overrides 只能在仓库的根目录下的 package.json 中设置,而不能在单个工作区的 package.json 文件中设置。
  2. 在添加 overrides 后,你可能需要清除 node_modules 和 package-lock.json(希望通过 修复此问题 得到解决)。
  3. 确保应用的 overrides 不会破坏其它功能是你的责任:许多 带有 "react": "^16.x.x" 依赖项的包实际上与 React 17 兼容,并且只是没有更新,但不是 所有;有些可能确实不兼容 React 17。请小心并查找那些你正在覆盖 "^16.x.x" 依赖项的包的存储库的问题。甚至可能有新版本或替代品可以直接支持 React 17。
  4. 你可能还需要覆盖 react-domreact 以确保两者不会失去同步。

在根目录下的 package.json 中类似这样的内容应该可以正常工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接