Vorteile von bundledDependencies gegenüber normalen Abhängigkeiten in npm

83

Mit npm können wir angeben bundledDependencies, aber was sind die Vorteile davon? Ich denke, wenn wir unbedingt sicherstellen wollen, dass wir die richtige Version erhalten, auch wenn das Modul, auf das wir verweisen, gelöscht wird, oder wenn die Bündelung einen Geschwindigkeitsvorteil bietet?

Kennt jemand die Vorteile bundledDependenciesgegenüber normalen Abhängigkeiten?

Balupton
quelle
16
"Wenn dies" bundleDependencies "heißt, ist das auch ehrenwert." Tolle Dokumentation!
Colonel Panic
10
Und doch fühlt es sich irgendwie traurig an, es so zu fixieren, dass es nur "wird auch geehrt" lautet. Wenn ich auf engstem Raum einen Samurai oder Ritter zur Hilfe befehle, möchte ich auf jeden Fall, dass er mit kompatiblen Waffen und Rüstungen gebündelt wird - und ehrenwert ist.
Jon Coombs
3
"Ich denke, wenn wir unbedingt sicherstellen wollen, dass wir die richtige Version erhalten, auch wenn das Modul, auf das wir verweisen, gelöscht wird", hat plötzlich viel Gewicht: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
Joews

Antworten:

49

Eines der größten Probleme bei Node ist derzeit, wie schnell es sich ändert. Dies bedeutet, dass Produktionssysteme sehr zerbrechlich sein und npm updateleicht kaputt gehen können.

Die Verwendung von bundledDependencies ist eine Möglichkeit, dieses Problem zu umgehen, indem Sie, wie Sie richtig vermuten, sicherstellen, dass Sie immer die richtigen Abhängigkeiten bereitstellen, unabhängig davon, was sich sonst noch ändert.

Sie können dies auch verwenden, um Ihre eigenen, privaten Bundles zu bündeln und mit der Installation zu liefern.

Julian Knight
quelle
1
Wie liefert es immer die richtigen Abhängigkeiten? Bedeutet dies, npm updatedass keine Abhängigkeiten in bundledDependencies beeinflusst werden?
Kevin Ghadyani
2
Ja richtig. Beachten Sie, dass die gebündelten Abhängigkeiten möglicherweise in keiner grundlegenden Weise "korrekt" sind. Sie sind genau das, was die Person, die SAID bündelt, richtig gemacht hat.
Julian Knight
7
Vielleicht, weil Sie eine Antwort suchen, die fünfeinhalb Jahre alt ist ! Die Menge, die Node.JS in dieser Zeit bewegt hat, ist phänomenal. Vielleicht möchten Sie stattdessen etwas Nützliches als Kommentar hinzufügen?
Julian Knight
105

Für den schnellen Leser : In dieser Qualitätssicherung gehtes um dasFeld package.json bundledDependencies, nicht um das Paket .

Was bundledDependencies tun

"bundledDependencies" sind genau das, was ihr Name impliziert. Abhängigkeiten, die sich in Ihrem Projekt befinden sollten. Die Funktionalität entspricht also im Wesentlichen den normalen Abhängigkeiten. Sie werden auch beim Laufen verpackt npm pack.

Wann man sie benutzt

Normale Abhängigkeiten werden normalerweise aus der npm-Registrierung installiert. Daher sind gebündelte Abhängigkeiten nützlich, wenn:

  • Sie möchten eine Drittanbieter-Bibliothek wiederverwenden, die nicht aus der npm-Registrierung stammt oder die geändert wurde
  • Sie möchten Ihre eigenen Projekte als Module wiederverwenden
  • Sie möchten einige Dateien mit Ihrem Modul verteilen

Auf diese Weise müssen Sie kein eigenes npm-Repository erstellen (und verwalten), sondern erhalten dieselben Vorteile wie npm-Pakete.

Wann keine gebündelten Abhängigkeiten verwendet werden sollen

Bei der Entwicklung denke ich jedoch nicht, dass der Hauptpunkt darin besteht, versehentliche Updates zu verhindern. Wir haben dafür bessere Tools, nämlich Code-Repositorys (git, mercurial, svn ...) oder sperren jetzt Dateien.

Um Ihre Paketversionen zu pinnen, können Sie Folgendes verwenden:

  • Option 1: Verwenden Sie die neuere NPM-Version 5, die mit Knoten 8 geliefert wird . Sie verwendet eine package-lock.jsonDatei (siehe Knoten-Blog und Version von Knoten 8).

  • Option 2: Verwenden Sie Garn anstelle von npm. Es ist ein Paketmanager von Facebook, schneller als npmund es verwendet eine yarn.lockDatei. package.jsonAnsonsten wird dasselbe verwendet .

Dies ist vergleichbar mit Sperrdateien in anderen Paketmanagern wie Bundler oder Cargo. Es ähnelt npm's npm-shrinkwrap.json, ist jedoch nicht verlustbehaftet und führt zu reproduzierbaren Ergebnissen.

npmtatsächlich kopierte diese Funktion yarnunter anderem von.

  • Option 3: Dies war der zuvor empfohlene Ansatz, den ich nicht mehr empfehle. Die Idee war, die npm shrinkwrapmeiste Zeit zu verwenden und manchmal das Ganze, einschließlich des Ordners node_module, in Ihr Code-Repository zu stellen. Oder verwenden Sie möglicherweise Shrinkpack . Die damaligen Best Practices wurden im node.js-Blog und auf den freudigen Entwickler- Websites diskutiert .

Siehe auch

Dies liegt etwas außerhalb des Rahmens der Frage, aber ich möchte die letzte Art von Abhängigkeiten erwähnen (von denen ich weiß): Peer-Abhängigkeiten . Siehe auch diese verwandte SO-Frage und möglicherweise die Dokumente zu yarnon bundledDependencies .

nha
quelle
6
"einschließlich des Ordners node_module" - es ist eine ziemlich seltsame Sache, die Ihr Repo mit generiertem Code verschmutzt ... besonders wenn Sie mit nativen Modulen arbeiten ...
Oleksandr
@Olexandr Dazwischen und dem Risiko, dass ein Paket Ihre App kaputt macht, ist die Wahl wohl einfach. Beachten Sie, dass Sie einen separaten Zweig einfügen können (wenn Sie beispielsweise git verwenden). Einverstanden ist es alles andere als eine ideale Lösung.
nha
3
Ich würde davon abraten, node_modules einzuchecken, da beispielsweise Pakete wie phantomjs die entsprechende Binärdatei für das aktuelle System installieren. Dies bedeutet, dass wenn ein Entwickler npm install unter Linux ausführt und node_modules eincheckt, dies nicht für einen anderen Entwickler funktioniert, der das Repo unter Windows klont. Es ist besser, die Tarballs einzuchecken, auf denen npm Downloads installiert, und npm-shrinkwrap.json darauf zu zeigen. Sie können diesen Prozess mit dem npm install -g shrinkpackTool automatisieren .
Jamie Mason
1
Vielen Dank an @nha, Sie werden auch mit shrinkpack davor geschützt, da sich die Registrierungstarballs in Ihrem Projekt-Repository befinden würden.
Jamie Mason
1
@fold_left ja in der Tat, danke, dass du darauf hingewiesen hast (und Shrinkpack gemacht hast). Ich habe nur gesagt, dass all dies hätte vermieden werden können, wenn sich die npm-Registrierung wie ein unveränderlicher Datenspeicher verhalten hätte.
nha
22

Ein weiterer Vorteil ist, dass Sie Ihre internen Abhängigkeiten (Anwendungskomponenten) dort ablegen und sie dann einfach in Ihrer App benötigen können, als wären sie unabhängige Module, anstatt Ihre lib / zu überladen und sie in npm zu veröffentlichen.

Wenn sie bis zu dem Punkt gereift sind, an dem sie als separate Module leben könnten, können Sie sie einfach auf npm setzen, ohne Ihren Code zu ändern.

Boris Egorov
quelle
3

Ich bin überrascht, dass ich dies hier noch nicht gesehen habe, aber wenn es sorgfältig ausgewählt wird, bundledDependencieskann es verwendet werden, um ein verteilbares Paket daraus zu erstellen npm pack, das auf einem System ausgeführt wird, auf dem npmes nicht konfiguriert ist. Dies ist hilfreich, wenn Sie zB ein System haben, das nicht vernetzt ist / nicht im Internet: Bringen Sie Ihr Paket auf einen USB-Stick (oder was auch immer) und packen Sie den Tarball aus, dann npm runoder node index.jsund es funktioniert einfach.

Vielleicht gibt es eine bessere Möglichkeit, Ihre Anwendung so zu bündeln, dass sie "offline" ausgeführt wird, aber wenn ja, habe ich sie nicht gefunden.

Codierer
quelle
0

Operativ betrachte ich bundledDependencies als den privaten Modulspeicher eines Moduls, in dem Abhängigkeiten öffentlicher sind und zwischen Ihrem Modul und seinen Abhängigkeiten (und Unterabhängigkeiten) aufgelöst werden. Ihr Modul basiert möglicherweise auf einer älteren Version von beispielsweise "Reagieren", für eine Abhängigkeit ist jedoch die neueste und größte Version erforderlich. Ihr Paket / Ihre Installation führt zu Ihrer angehefteten Version node_modules/$yourmodule/node_modules/react, während Ihre Abhängigkeit ihre Version erhält node_modules/react(oder node_modules/$dependency/node_modules/reactwenn sie so geneigt sind).

Eine Einschränkung: Ich bin kürzlich auf eine Abhängigkeit gestoßen, die ihre Abhängigkeit von "Reagieren" nicht richtig konfiguriert hat, und nachdem ich in "BundledDependencies" reagiert habe, ist dieses abhängige Modul zur Laufzeit fehlgeschlagen.

Mushuweasel
quelle