NPM 7 Workspaces с установкой нескольких версий
У нас есть монорепозиторий, который я переношу на рабочие пространства npm 7.
Текущая папка org:
\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)
Бег
npm ci
в папке React устанавливает React 16.14 в \React \node_modules и 17.0.0 в \React \apps \someApp \node_modules. При попытке запустить приложение мы получаем ожидаемую ошибку перехвата из-за того, что установлено несколько версий. Но я не могу найти ничего, что явно требует React 16.14?
2 ответа
Если вы используете 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
может быть установлен только в корне репозитория, а не в отдельных файлах рабочей области. - Возможно, вам придется сбросить node_modules и package-lock.json после добавления переопределений (надеюсь, скоро это будет исправлено исправлением этой проблемы)
- Вы несете ответственность за то, чтобы применяемые вами переопределения ничего не ломали: многие пакеты с
"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",
}