Как предотвратить вложенные node_modules внутри node_modules

Я создал свой собственный пакет npm, назовем его XYZ, он имеет зависимость от @material-ui в файле package.json.

Когда я устанавливаю его в проекте A, у меня есть вложенные node_modules внутри папки XYZ (так что это A\node_modules\XYZ\node_modules\@material-ui), но когда я устанавливаю его в проекте B, у меня нет вложенной папки node_modules. Оба проекта A и B имеют @material-ui в своих файлах package.json с одинаковыми версиями.

Как заставить мой пакет XYZ использовать @material-ui из A\node_modules?

Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
22
0
10 445
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Есть положительный момент в том, что меньше вложенных папок, а в обратную сторону - больше папок непосредственно в папке node_modules, а также проблемы с контролем версий.

Используйте правильную версию npm

Правильные yarn и npm (например, npm v3) не должны иметь такой проблемы со структурой. Он всегда должен сглаживать всю конструкцию, где это возможно, и иметь вложенные node_modules только в том случае, если версии несовместимы с предыдущей.

Проверить версии

Так что, если он правильно работает в одном проекте, а не в другом, это, вероятно, связано с версией. Проверьте, является ли @material-ui одной и той же версией на обоих устройствах. Возможно, в какой-то момент два разных пакета конфликтуют друг с другом.

Проверьте, как вы их устанавливаете

Из вашего вопроса говорится, что это та же версия. Однако вы не упомянули, как вы установили свой пакет в обоих проектах. Если вы устанавливаете с yarn link или npm link, он должен правильно установить зависимости, как и ожидалось.

Проверьте, используете ли вы разные пакеты

Если вы проверите пакет, то недавно material-ui устарел, а в уведомлении говорится о необходимости обновления до @material-ui/core. Возможно, некоторые пакеты внутри этой папки не совпадают. В любом случае, так происходит всякий раз, когда возникает конфликт зависимостей. Загляните в папку @material-ui.

Сгладить их вручную (опасно)

Есть несколько пакетов для принудительного решения этой проблемы. Они пройдут через вложенные папки node_modules и объединят их в одну папку.

flatten-packages

  • Установить с помощью npm install -g flatten-packages.
  • Запустите исполняемый файл flatten-packages, чтобы переставить все пакеты в папке node_modules в каталоге проекта.
  • Flatten удалит старую версию пакета. Вам следует позаботиться об ошибках, связанных с критическими изменениями версии.

Спасибо за объяснение. Я дважды проверю в понедельник и приму, решило ли это мою проблему

Jacoslaw 10.08.2018 15:15

Ответьте, что сработало, а что нет, чтобы мы могли понять, что произошло. :)

Md. Abu Taher 10.08.2018 15:17

Похоже, у меня была такая же версия @ material-ui / core, но @ material-ui / значки были другими, поэтому у меня были вложенные node_modules. Спасибо!

Jacoslaw 13.08.2018 07:28

Почему бы не использовать npm dedupe (не опасно) для сглаживания дерева зависимостей?

murf 12.04.2019 09:55

Для этого вы можете использовать команду npm dedupe.

Вы можете поместить команду в сценарий postinstall в package.json, и каждый раз, когда NPM устанавливает пакет, команда npm dedupe будет сглаживать все дублированные пакеты одной и той же версии для вас.

Для получения дополнительной информации см. https://docs.npmjs.com/cli/dedupe.

сценарий постинсталляции npm

Это отлично работает для вложенных зависимостей одного уровня. Для следующего сценария он не работает - node_modules/dependency1/node_moduels/dependency2/node_modul‌​es/dependency_not_be‌​ing_removed любые предложения по удалению на этом уровне

Suchin 24.03.2021 13:46

У меня была такая же проблема в приложении React Native с моим пакетом NPM. Проблема заключалась в том, что в проекте A использовалась версия React Native (0,59,5) ниже версии, используемой в моем пакете (0,59,8). При установке пакета в новый проект (B), конечно, использовалась последняя версия React Native на тот момент, которая была такой же, как и мой пакет (0.59.8).

У меня есть еще одно дополнение к принятому ответу:

Очистить кеш папки Local node_modules

rm -rf node_modules

Обращаться осторожно: Иногда перенос проектов на новые модули npm может вызвать странные проблемы с кешем внутри папки node_modules, особенно те, которые существуют уже некоторое время или имеют более новые версии пакетов, установленных во вложенных зависимостях, который отличается от установленной версии в корневом каталоге.

После удаления прямых зависимостей через зависимости package.json пакеты будут удалены с <root>/node_modules. Это может вызвать ошибку, при которой новые модули по-прежнему вложены в вашу зависимость, а не перемещаются в корневой каталог, как ожидалось.

Таким образом, с помощью уничтожение ваших локальных node_modules вы можете выполнить чистую переустановку и позволить выравниванию работать.

Другие вопросы по теме