Zalety bundledDependencies w porównaniu z normalnymi zależnościami w npm

85

npm pozwala nam określić bundledDependencies, ale jakie są zalety takiego działania? Wydaje mi się, że jeśli chcemy mieć absolutną pewność, że otrzymamy odpowiednią wersję, nawet jeśli moduł, do którego się odwołujemy, zostanie usunięty, czy może istnieje korzyść związana z szybkością tworzenia pakietów?

Czy ktoś zna zalety bundledDependenciesponad normalnych zależności?

balupton
źródło
16
„Jeśli to jest zapisane jako„ bundleDependencies ”, to również jest honorowe”. Świetna dokumentacja!
Panika pułkownika
10
A jednak, w jakiś sposób, naprawianie tego tak, by po prostu przeczytać „jest zaszczycony”, jest smutne. W trudnej sytuacji, gdybym zamówił samuraja lub rycerza na pomoc, na pewno chciałbym, aby przyjechał w pakiecie z odpowiednią bronią i zbroją - i był honorowy.
Jon Coombs
3
„Myślę, że jeśli chcemy mieć absolutną pewność, że otrzymamy właściwą wersję, nawet jeśli moduł, do którego się odwołujemy, zostanie usunięty” nagle ma duże znaczenie: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
joews

Odpowiedzi:

49

Jednym z największych obecnie problemów z Node jest szybkość zmian. Oznacza to, że systemy produkcyjne mogą być bardzo delikatne i npm updatemogą łatwo zepsuć rzeczy.

Korzystanie z bundledDependencies jest sposobem na obejście tego problemu poprzez zapewnienie, jak słusznie przypuszczasz, że zawsze będziesz dostarczać poprawne zależności, bez względu na to, co jeszcze może się zmienić.

Możesz również użyć tego do spakowania własnych, prywatnych pakietów i dostarczenia ich podczas instalacji.

Julian Knight
źródło
1
W jaki sposób zawsze dostarcza poprawne zależności? Czy to oznacza, npm updateże nie wpłynie to na żadne zależności w bundledDependencies?
Kevin Ghadyani
2
Tak, poprawnie. Zauważ, że dołączone zależności mogą nie być „poprawne” w żaden fundamentalny sposób. Są po prostu tym, co osoba robiąca łączenie SAID miała rację.
Julian Knight
7
Może dlatego, że szukasz odpowiedzi, która ma pięć i pół roku ! Stopień, w jakim Node.JS poczynił w tym czasie, jest fenomenalny. Może zamiast tego chciałbyś dodać coś pożytecznego jako komentarz?
Julian Knight
105

Dla czytelnika : takontrolajakości dotyczy pola package.json bundledDependencies, a nie samego pakietu .

Co robią bundledDependencies

„BundledDependencies” jest dokładnie tym, co sugeruje ich nazwa. Zależności, które powinny znajdować się w Twoim projekcie. Więc funkcjonalność jest w zasadzie taka sama jak normalne zależności. Będą również spakowane podczas biegu npm pack.

Kiedy ich używać

Zwykłe zależności są zwykle instalowane z rejestru npm. W ten sposób powiązane zależności są przydatne, gdy:

  • chcesz ponownie użyć biblioteki innej firmy, która nie pochodzi z rejestru npm lub została zmodyfikowana
  • chcesz ponownie wykorzystać własne projekty jako moduły
  • chcesz rozpowszechniać niektóre pliki ze swoim modułem

W ten sposób nie musisz tworzyć (i utrzymywać) własnego repozytorium npm, ale uzyskasz te same korzyści, które otrzymujesz z pakietów npm.

Kiedy nie używać dołączonych zależności

Podczas programowania nie sądzę jednak, aby głównym celem było zapobieganie przypadkowym aktualizacjom. Mamy do tego lepsze narzędzia, a mianowicie repozytoria kodu (git, mercurial, svn ...) lub teraz pliki blokujące.

Aby przypiąć wersje pakietów, możesz użyć:

  • Opcja 1: Użyj nowszej wersji NPM 5, która jest dostarczana z węzłem 8. Używa package-lock.jsonpliku (zobacz blog węzła i wydanie węzła 8)

  • Opcja 2: użyj przędzy zamiast npm. Jest to menedżer pakietów z Facebooka, szybszy niż npmi używa yarn.lockpliku. W package.jsonprzeciwnym razie używa tego samego .

Jest to porównywalne z plikami blokującymi w innych menedżerach pakietów, takich jak Bundler lub Cargo. Jest podobny do npm-shrinkwrap.json npm, jednak nie jest stratny i tworzy powtarzalne wyniki.

npmw rzeczywistości skopiował tę funkcję yarn, między innymi.

  • Opcja 3: to było wcześniej zalecane podejście, którego już nie polecam. Pomysł polegał na tym, aby używać przez npm shrinkwrapwiększość czasu, a czasami umieszczać całość, w tym folder node_module, w repozytorium kodu. Lub ewentualnie użyj shrinkpack . Najlepsze praktyki w tamtym czasie zostały omówione na blogu node.js oraz na radosnych witrynach deweloperskich .

Zobacz też

To trochę wykracza poza zakres pytania, ale chciałbym wspomnieć o ostatnim rodzaju zależności (o których wiem): zależności równorzędnych . Zobacz także to powiązane pytanie SO i prawdopodobnie dokumentację yarndotyczącą bundledDependencies .

nha
źródło
6
„w tym folder node_module” - to dość dziwna rzecz, która zanieczyszcza repozytorium wygenerowanym kodem ... zwłaszcza gdy pracujesz z modułami natywnymi ...
Oleksandr
@Olexandr Pomiędzy tym a ryzykiem, że pakiet zepsuje Twoją aplikację, myślę, że wybór jest łatwy. Zauważ, że możesz umieścić osobną gałąź (na przykład jeśli używasz git). Zgoda, to dalekie od idealnego rozwiązania.
nha
3
Odradzałbym sprawdzanie node_modules z powodu pakietów takich jak na przykład phantomjs, które instalują odpowiedni plik binarny dla bieżącego systemu. Oznacza to, że jeśli jeden deweloper uruchomi instalację npm w systemie Linux i sprawdzi w node_modules - nie zadziała to dla innego dewelopera, który sklonuje repozytorium w systemie Windows. Lepiej jest sprawdzić w paczkach tar, które instalują pliki npm i wskazać na nie npm-shrinkwrap.json. Możesz zautomatyzować ten proces za pomocą npm install -g shrinkpacknarzędzia.
Jamie Mason
1
Dzięki @nha, bądź przed tym chroniony dzięki shrinkpack również, ponieważ paczki z rejestrem byłyby w repozytorium twojego projektu.
Jamie Mason
1
@fold_left, rzeczywiście, dziękuję za wskazanie go (i za zrobienie shrinkpack). Mówiłem tylko, że można by tego wszystkiego uniknąć, gdyby rejestr npm działał jak niezmienny magazyn danych.
nha
22

Inną zaletą jest to, że możesz umieścić tam swoje wewnętrzne zależności (komponenty aplikacji), a następnie po prostu wymagać ich w swojej aplikacji tak, jakby były niezależnymi modułami, zamiast zaśmiecać bibliotekę / i publikować je w npm.

Jeśli / kiedy dojrzeją do tego stopnia, że ​​mogą żyć jako oddzielne moduły, możesz je łatwo umieścić na npm, bez modyfikowania kodu.

Boris Egorov
źródło
3

Dziwię się, że nie widziałem tego już tutaj, ale po starannym wybraniu bundledDependenciesmożna go użyć do stworzenia pakietu dystrybucyjnego, npm packktóry będzie działał na systemie, w którym npmnie jest skonfigurowany. Jest to przydatne, jeśli masz np. System, który nie jest podłączony do sieci / nie jest w Internecie: przenieś swój pakiet na pendrive (lub cokolwiek innego) i rozpakuj archiwum, wtedy npm runlub node index.jsi po prostu działa.

Może jest lepszy sposób na spakowanie aplikacji, aby działała „offline”, ale jeśli tak, to nie znalazłem.

Coderer
źródło
0

Pod względem operacyjnym patrzę na bundledDependencies jako na prywatny magazyn modułów modułu, w którym zależności są bardziej publiczne, rozwiązane wśród twojego modułu i jego zależności (i zależności podrzędnych). Twój moduł może polegać na starszej wersji, powiedzmy, reaguj, ale zależność wymaga najnowszego i najlepszego. Twój pakiet / instalacja spowoduje, że Twoja przypięta wersja zostanie wprowadzona node_modules/$yourmodule/node_modules/react, podczas gdy Twoja zależność otrzyma swoją wersję node_modules/react(lub node_modules/$dependency/node_modules/reactjeśli są tak skłonni).

Ostrzeżenie: ostatnio natknąłem się na zależność, która nie skonfigurowała poprawnie swojej zależności od reagowania, a reagowanie w bundledDependencies spowodowało awarię tego zależnego modułu w czasie wykonywania.

mushuweasel
źródło