Переваги bundledDependencies перед нормальними залежностями в npm


85

npm дозволяє нам вказати bundledDependencies, але в чому переваги цього? Думаю, якщо ми хочемо бути абсолютно впевненими, що отримаємо правильну версію, навіть якщо модуль, на який ми посилаємось, буде видалено, або, можливо, є зв’язок з перевагою швидкості?

Хтось знає переваги bundledDependenciesнад звичайними залежностями?


16
'Якщо це пишеться "bundleDependencies", то це також почесно.' Чудова документація!
Colonel Panic

10
І все-таки, якось, виправляючи це просто читати "це також честь", це сумно. У важкому місці, якщо я замовив самурая чи лицаря на допомогу, я точно хотів би, щоб він прийшов у комплекті зі сумісною зброєю та обладунками - і був би почесним.
Джон Кумбс,

3
"Я думаю, якщо ми хочемо повністю переконатися, що отримаємо правильну версію, навіть якщо модуль, на який ми посилаємось,
joews 24.03.16

Відповіді:


49

Однією з найбільших проблем зараз з Node є те, як швидко він змінюється. Це означає, що виробничі системи можуть бути дуже неміцними і npm updateможуть легко зламати речі.

Використання bundledDependencies - це спосіб обійти цю проблему, переконавшись, як ви правильно передбачаєте, що ви завжди будете доставляти правильні залежності, незалежно від того, що ще може змінюватися.

Ви також можете використовувати це, щоб об’єднати власні приватні пакети та доставити їх під час встановлення.


1
Як це завжди забезпечує правильні залежності? Чи означає це, що це npm updateне вплине на будь-які залежності в bundledDependencies?
Kevin Ghadyani

2
Так, правильно. Зверніть увагу, що включені в комплект залежності можуть бути "правильними" якимось основним чином. Вони якраз і були правильними в тому, що людина, яка займається зв’язком SAID, була правильною.
Джуліан Найт,

7
Може, тому, що ви дивитесь на відповідь, якій п'ять з половиною років ! Сума, яку за цей час перемістив Node.JS, феноменальна. Можливо, ви хотіли б додати замість цього щось корисне як коментар?
Джуліан Найт

105

Для швидкого читача : це ОК йде про package.json поле bundledDependencies, НЕ про пакеті .

Що роблять bundledDependencies

"bundledDependencies" - це саме те, що випливає з їх назви. Залежності, які мають бути всередині вашого проекту. Отже, функціональність в основному така ж, як і звичайні залежності. Вони також будуть упаковані під час бігу npm pack.

Коли їх використовувати

Звичайні залежності зазвичай встановлюються з реєстру npm. Таким чином, пакетні залежності корисні, коли:

  • ви хочете повторно використовувати сторонню бібліотеку, яка не походить з реєстру npm або яка була змінена
  • ви хочете повторно використовувати власні проекти як модулі
  • ви хочете поширити деякі файли разом із модулем

Таким чином, вам не потрібно створювати (і підтримувати) власне сховище npm, але отримувати ті самі переваги, що і ви отримуєте від пакетів npm.

Коли не використовувати пов'язані залежності

При розробці я не думаю, що головне - запобігати випадковим оновленням. Для цього ми маємо кращі інструменти, а саме сховища коду (git, mercurial, svn ...) або тепер блокуємо файли.

Щоб закріпити версії пакета, ви можете використовувати:

  • Варіант 1: Використовуйте новішу версію NPM 5, яка постачається з вузлом 8. Він використовує package-lock.jsonфайл (див. Блог вузлів та випуск вузла 8)

  • Варіант 2: використовувати пряжу замість npm. Це менеджер пакетів з facebook, швидший за npmі використовує yarn.lockфайл. В package.jsonіншому випадку використовується те саме .

Це можна порівняти з файлами блокування в інших менеджерах пакетів, таких як Bundler або Cargo. Він схожий на npm-npm-shrinkwrap.json, проте він не втрачає і створює відтворювані результати.

npmнасправді скопіював цю функцію yarn, серед іншого.

  • Варіант 3: це був раніше рекомендований підхід, який я вже не рекомендую. Ідея полягала в тому, щоб використовувати npm shrinkwrapбільшу частину часу, а іноді розміщувати все це, включаючи папку node_module, у ваше сховище коду. Або, можливо, використовувати термоусадочний пакет . Тоді найкращі практики обговорювались у блозі node.js та на веб-сайтах розробників радості .

Дивитися також

Це трохи поза сферою питання, але я хотів би згадати останній тип залежностей (про які я знаю): залежності від однолітків . Також перегляньте це пов'язане запитання SO та, можливо, документи yarnon bundledDependencies .


6
"включаючи папку node_module" - це досить дивна річ, яка забруднює ваше репо згенерованим кодом ... особливо, коли ви працюєте з власними модулями ...
Олександр

@Olexandr Між тим і ризиком того, що пакет зламає вам додаток, я думаю, вибір простий. Зверніть увагу, що ви можете помістити в окрему гілку (якщо, наприклад, використовуєте git). Погоджено, це далеко не ідеальне рішення.
нха

3
Я б не рекомендував перевіряти node_modules через такі пакети, як phantomjs, наприклад, які встановлюють відповідний двійковий файл для поточної системи. Це означає, що якщо один Dev запустить npm install на Linux і перевірить node_modules - це не буде працювати для іншого Dev, який клонує репо в Windows. Краще перевірити в tarballs, які npm встановлюють завантаження, і вказувати на них npm-shrinkwrap.json. Ви можете автоматизувати цей процес за допомогою npm install -g shrinkpackінструменту.
Джеймі Мейсон,

1
Дякую @nha, ви також можете бути захищені від цього за допомогою shrinkpack, оскільки мітки для реєстру будуть у вашому сховищі проектів.
Джеймі Мейсон,

1
@fold_left так, справді, дякую, що вказав на нього (і за те, що зробив термоусадочний пакет). Я просто говорив, що всього цього можна було б уникнути, якби реєстр npm діяв як незмінний магазин даних.
нха

22

Інша перевага полягає в тому, що ви можете помістити туди свої внутрішні залежності (компоненти програми), а потім просто вимагати їх у своєму додатку, ніби це незалежні модулі, замість того, щоб захаращувати вашу бібліотеку / та публікувати їх у npm.

Якщо / коли вони дозріють до такої міри, що вони можуть жити як окремі модулі, ви можете легко розмістити їх на npm, не змінюючи свій код.


3

Я здивований, що я вже не бачив цього тут, але при ретельному відборі bundledDependenciesйого можна використовувати для створення розповсюджуваного пакету, npm packякий буде працювати в системі, де npmне налаштовано. Це корисно, якщо у вас є, наприклад, система, яка не підключена до мережі / не в Інтернеті: перенесіть свій пакет на флеш-накопичувач (або що завгодно) і розпакуйте tarball, тоді npm runабо node index.jsі він просто працює.

Можливо, є кращий спосіб згрупувати вашу програму для запуску "в автономному режимі", але якщо вона є, я її не знайшов.


0

В операційному відношенні я розглядаю bundledDependencies як приватний модуль сховища модуля, де залежності є більш загальнодоступними, вирішуються між вашим модулем та його залежностями (і підзалежностями). Ваш модуль може покладатися на стару версію, скажімо, реагувати, але для залежності потрібні найновіші і найвищі. Ваш пакет / установка призведе до закріпленої версії node_modules/$yourmodule/node_modules/react, тоді як ваша залежність отримає свою версію node_modules/react(або node_modules/$dependency/node_modules/reactякщо вони настільки схильні).

Застереження: нещодавно я зіткнувся із залежністю, яка неправильно налаштувала свою залежність від реакції, а реагування в bundledDependencies призвело до того, що цей залежний модуль вийшов з ладу під час виконання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.