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