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 вы можете использоватьфорсировать конкретную версию.

Важные заметки:

  1. overridesможет быть установлен только в корне репозитория, а не в отдельных файлах рабочей области.
  2. Возможно, вам придется сбросить node_modules и package-lock.json после добавления переопределений (надеюсь, скоро это будет исправлено исправлением этой проблемы)
  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",
  }
Другие вопросы по тегам