JavaScript-Abhängigkeitsmanagement: npm vs. bower vs. volo [geschlossen]

160

Wie vergleichen Sie npm, bowerund volo?

Alle drei können verwendet werden, um JavaScript-Abhängigkeiten für ein UI-Projekt zu installieren. Ich verstehe npmist knotenspezifischer.

Also, wann was verwenden?

npmsteht immer noch weit entfernt, aber bowerund voloscheint genau das gleiche Problem zu lösen, auch wenn ich nicht in der Lage bin eine Linie zu ziehen zwischen der npmund bower-volo.

Yugal Jindle
quelle
1
Wenn Sie diese Frage hier lesen und eine Antwort aus dem Jahr 2015 wünschen, lesen Sie meine aktualisierte Antwort.
Gustavohenke
2
Bower könnte ziemlich bald in npm verschmolzen werden .
Dan Dascalescu

Antworten:

104

Eine Beschreibung, die den Unterschied zwischen npm und bower am besten beschreibt, lautet: npm verwaltet JavaScript-Module, die als Pakete bezeichnet werden, und Bower verwaltet Front-End-Komponenten (dh CSS, HTML und JavaScript), die als Komponenten bezeichnet werden. npm wird auch zum Installieren der Laube verwendet. Hier ist ein ausführlicher Artikel über npm und bower (deckt nicht volo ab), der ausführlich behandelt wird.

Strangeloops
quelle
88
Dies ist keine sehr gute Beschreibung. Npm kann sicherlich zur Installation von Front-End-Komponenten verwendet werden.
BT
Obwohl ich bemerkt habe, dass einige "Frontend" -Bibliotheken auf npm zugunsten ihrer Bower-Gegenstücke aufgegeben wurden. Nehmen wir zum Beispiel Ember , der seit einem Jahr nicht mehr veröffentlicht wurde.
Briangonzalez
4
@Nate Der Name ist einfach dort, wo er begonnen hat. NPM ist jetzt ein sehr universelles Paketverwaltungssystem. Ich verwende regelmäßig npm, um Front-End-Module zu installieren. Es gibt keinen Unterschied bei der Verwendung von NPM für CommonJS-Module gegenüber AMD und anderen Elementen. Sie können npm auch für Nicht-Javascript-Module verwenden. Daher ist das einfach kein Unterschied zwischen npm und Laube. Unabhängig davon, ob Sie sie Pakete oder Komponenten nennen, sind sie insofern identisch, als sie beide Sammlungen beliebiger Dateien sind.
BT
2
Dies ist eine sehr irreführende Antwort, wenn man bedenkt, dass Bower keine Richtlinien für den Umgang mit HTML, CSS und Javascript hat. npm hat auch keine Richtlinie, außer dass fast alles auf npm so geschrieben ist, dass es zumindest CommonJs und gelegentlich andere Formate unterstützt. Sie können HTML und CSS in npm-Paketen einfügen, genau wie Sie es mit bower können. Es gibt viele Frontend-Pakete auf npm, einschließlich Paketen, die CSS und HTML enthalten.
Substack
3
Wenn Sie browserify verwenden , ist npm der perfekte Paketmanager. Ich denke nicht, dass es wichtig ist, welchen Paketmanager Sie verwenden, aber ich würde mich persönlich an nur einen pro Projekt halten.
Eruant
72

Laube

Es ist immer noch sehr beliebt bei Front-End-Entwicklern, obwohl es nur sehr wenige Funktionen hat. Jedes Front-End-Paket verwendet es. Es gibt auch eine Initiative, um Laube in npm zusammenzuführen .

Bower ist clientseitig optimiert und unterstützt nur flache Abhängigkeitsbäume, dh jede Bibliothek darf nur einmal verwendet werden (da es teuer ist, verschiedene Versionen derselben Bibliothek an den Client zu senden), und die Abhängigkeitsbeschränkungen müssen vom Benutzer gelöst werden .

Sie können erwarten, dass in der Bower-Registrierung ( bower search <some keyword>) alles gefunden wird, was mit dem Front-End zu tun hat - meiner Meinung nach ist dies der größte Vorteil von Bower im Vergleich zu anderen Paketmanagern.

volo

Ich habe es seit Jahren immer noch nicht länger als 5 Minuten benutzt. Ich weiß nichts darüber, aber soweit ich sehen kann , enthält es ein Build-Tool, das Grunt-Benutzern sehr vertraut ist.

npm

Ja, npm steht für Node Package Manager. Aber heutzutage kann man es für alles verwenden; Menschen tun nicht mehr nur npm installDinge und erwarten, dass sie nur in der Knotenumgebung funktionieren . Zum Beispiel gibt es viele npm-Pakete für Twitter Bootstrap .

Npm ist für die serverseitige Verwendung mit einem verschachtelten Abhängigkeitsbaum optimiert. Jede Abhängigkeit kann ihre eigenen Abhängigkeiten haben, die ihre eigenen haben können, und so weiter. Dadurch wurden Konflikte mit Abhängigkeitsversionen beseitigt, da jede Abhängigkeit ihre eigene Version von z. B. Unterstrich verwenden kann. Die kommende npm-Version 3 wird jedoch den Abhängigkeitsbaum reduzieren :

Mit npm @ 3 wird Ihr node_modules-Verzeichnis viel flacher. Alle Ihre Abhängigkeiten und die meisten Ihrer Unterabhängigkeiten (und (Unter-) + Abhängigkeiten) befinden sich nebeneinander auf der obersten Ebene. Nur bei Konflikten werden Module auf tieferen Ebenen installiert. Dies sollte Windows-Benutzern die Arbeit erheblich erleichtern.

Einige Vorteile, die ich bei der Verwendung von npm sehe:

  • Es wird von allen anderen Paketmanagern (Komponente, Laube, Volo, JSPM usw.) verwendet.
  • Ermöglicht die Verwendung von Build-Skripten.
  • Für die Überprüfung von npm-basierten Paketen stehen viele Tools zur Verfügung

npm ist der Paketmanager für JavaScript.

Screenshot von npmjs.com


Ab Februar 2013 war meine Meinung die folgende. Bitte berücksichtigen Sie es nicht mehr.

npm

Es ist besser, sich daran zu halten, wenn Sie mit einem Node-Projekt arbeiten. Es gibt nur sehr wenige Projekte, die auch Browsern zur Verfügung stehen ...

Laube

Bower ist gerade der Pop-Typ. Sie haben viele Projekte unter der Haube, und die Projektbetreuer halten sie gerne im Bower-Register auf dem Laufenden ...

Es ist eine Schande, dass er manchmal ein kleiner Buggy ist.

volo

Ich habe Volo seitdem nicht mehr als 5 Minuten lang ausprobiert, aber soweit ich sehen konnte, scheint es flexibler zu sein als Laube.

Ein negativer Punkt für volo ist, dass ihre Projekte sehr veraltet sind.

gustavohenke
quelle
19
Es gibt Tausende von Modulen auf npm, die entweder nur in Browsern oder sowohl in Knoten als auch in Browsern funktionieren. Viele von ihnen haben sogar CI-Abzeichen, die Ihnen genau sagen, in welchen Browsern sie arbeiten. Fast alles auf bower et all ist wahrscheinlich auf npm.
Substack
Ich verstehe nicht, dass ein Projekt wie ngBoilerplate Bower verwenden muss, während es für die Installation bereits von npm abhängt
lolski
5
Was ist ein "Pop-Typ"? Ist "Pop" eine Abkürzung. für "beliebt"?
Bryan Oakley
4
In Ihrem Screenshot steht npm für Nuklearplanungshandbuch;)
Jim Jones
24

Sie scheinen das gleiche Problem zu lösen, jedoch für verschiedene Umgebungen / Welten. NPM für NodeJS und Volo, Laube für den Browser.

Die Wahrheit ist, dass Sie NPM auch zum Verwalten von Javascript und CSS für den Browser verwenden können. Nichts hindert Sie daran. In diesem Sinne ist es für mich natürlicher, NPM zu verwenden, als zwei verschiedene Tools für denselben Zweck verwalten zu müssen.

Es scheint, dass Bower mehr Pakete zur Verfügung hat, zumindest für die populäreren. Aber bald wird jQuery auch direkt in NPM verfügbar sein und wahrscheinlich werden alle anderen Bibliotheken dem gleichen Trend folgen.

Da es Tools wie browserify und webmake gibt, die bei der Verwendung von Knotenmodulen im Browser helfen, besteht meiner Meinung nach kein wirklicher Bedarf an Bower oder Volo mehr , es sei denn, sie bieten etwas anderes für Sie (ein bestimmtes Modul, das nur in vorhanden ist ihre Register).

Sowohl Volo als auch Bower sind ebenfalls gut, aber aus meiner Sicht ist es möglicherweise besser, sich daran zu halten, wenn Sie bereits NPM verwenden.

Bitte beachten Sie, dass Sie NPM verwenden können, um Ihre Client-Abhängigkeiten zu verwalten, auch ohne browserify oder webmake zu verwenden . In den meisten Projekten, an denen ich arbeite, führe ich nach der Installation der npm-Module ein Skript aus, um sie an dem Ort bereitzustellen, an dem meine Client-App sie verwendet. Manchmal verwende ich grunt, um diese Datei mit anderen js-Dateien zu verketten, und manchmal verweise ich direkt auf die Vorlagendateien meiner Webanwendungen. In jedem Fall ist dies eine persönliche Präferenz. Andere finden Bower oder Volo möglicherweise einfacher zu verwenden, da sie natürlicher in ihre Arbeitsabläufe passen.

Roy Riojas
quelle
1
Es ist gut, konkurrierende Lösungen für das gleiche Problem zu haben. Irgendeine Idee, warum das yeomanProjekt einen neuen Paketmanager entwickelt hat, als wir es bereits hatten npm? (Es war ausgereift, berühmt und reich an Funktionen) Dieser Gedanke gibt mir das Gefühl, dass mir immer noch der eigentliche Punkt fehlt.
Yugal Jindle
1
Nicht wirklich, aber wie Sie sagten, ist es manchmal lustig, das Rad neu zu erfinden, nur weil Sie es können, und manchmal werden dadurch einige Verbesserungen vorgenommen, während versucht wird, dasselbe Problem zu lösen. Nicht wirklich, warum sie sich für ein neues entscheiden, abgesehen davon, dass es Frontend-Entwicklern leichter fällt, Pakete zu finden. Nicht alle Frontend-Entwickler haben Erfahrung mit Knoten. Ich denke, das ist der Hauptgrund für Projekte wie Bower. Versuchen Sie, es Nicht-Knoten-Benutzern einfacher zu machen, ich rate hier nur.
Roy Riojas
Ich denke, sie wollten den Ärger npmzugunsten der Einfachheit des Frontends trennen . Daher für die Frontend-Entwicklung.
Yugal Jindle
15

Bowers großer Vorteil gegenüber NPM besteht darin, dass das Abhängigkeitsmanagement die Verwendung einer einzelnen Version einer Komponente erzwingt (während NPM unterschiedliche Kopien / Versionen als Unterabhängigkeiten verschiedener Module verwendet). Dies ist SEHR GUT, da es verhindert, dass Ihr clientseitiges Javascript aufgebläht wird, da mehrere Kopien einer Komponente in verschiedenen Versionen enthalten sein müssen. Das Einfügen mehrerer Kopien eines Moduls ist für die Funktionsweise des Abhängigkeitsmanagements von NPM von zentraler Bedeutung. Daher ist NPM für die clientseitige Paketverwaltung völlig ungeeignet.

Eine Konsequenz aus dem oben Gesagten ist, dass Bower-Paketbetreuer und Verbraucher ihre Abhängigkeitsversionsnummern besser beachten müssen, um Konflikte zu vermeiden, aber es ist ein Preis, den es sich zu zahlen lohnt. Und ich finde, dass NPM-Module bei der Herausgabe von Major-, Minor- und Patch-Releases oft schlampig sind, sodass das NPM-Abhängigkeitsmanagement auch nicht gerade ein Rosenbeet ist.

whereesrhys
quelle
3
Dies gilt nur, wenn Sie Ihren Frontend-Code direkt aus dem Ordner bereitstellen, in dem der Paketmanager diese Dateien abgelegt hat. In meinem Fall habe ich entweder ein Build-Skript, um die less / js-Dateien zu verarbeiten, oder browserify, um aus diesen Dateien ein Bundle zu erstellen. Das ist in meinem Fall also kein großes Problem. Der verteilte Code hat immer die richtigen Versionen, auch wenn andere Unterkomponenten während der Entwicklung möglicherweise Duplikate aufweisen, gelangen sie nie zur Produktion.
Roy Riojas
auch wenn Sie versehentlich (als Unterabhängigkeiten) zwei verschiedene Versionen derselben Abhängigkeit benötigen? Ich denke, in diesem Fall liegen Sie falsch
wo ist der
Normalerweise benötige ich keine Module, die ich nicht kontrolliere, daher sind sie immer die richtigen. Wenn ein Modul versehentlich versucht, ein bestimmtes Modul von den angepassten zu benötigen, schlägt der Build fehl. Kein
Grund
Daher kann npm nur dann als sicher bezeichnet werden, dass das Duplizieren von Modulen in Ihrem clientseitigen Code vermieden wird, wenn Sie die Kontrolle über Ihren gesamten Abhängigkeitsbaum haben. Dies ist sicherlich nicht der Fall bei den meisten Dingen, an denen ich arbeite, und wahrscheinlich nicht bei den meisten Projekten, bei denen ein Abhängigkeitsmanager verwendet wird, um clientseitige Module einzuschließen.
Wheresrhys
1
Wenn Sie nicht an Mashups arbeiten, wird Ihr Abhängigkeitsbaum zumindest für Code von Drittanbietern nicht so kompliziert sein. Die meisten js-Bibliotheken exportieren eine einzelne globale Version. Mit browserify-shim können Sie also sicherstellen, dass Sie sie aus dem globalen Bereich verwenden können, daher immer eine Version, die Sie steuern. Mein Punkt ist, dass Sie dasselbe erreichen können, ohne dass ein weiterer Paketmanager zusätzlich zu einem bereits vorhandenen erforderlich ist. Am Ende könnte es eine Präferenzfrage sein. Es sind immer Kompromisse einzugehen.
Roy Riojas
5

Ich weiß, dass dies nicht im Rahmen der Frage liegt, aber es gibt auch eine andere Alternative. Jam JS - http://jamjs.org/ Eine interessante Sache ist, dass es Grunzfähigkeiten in Jam hat:

jam compile output.js

Jemand sollte noch einen Paketmanager erstellen und ihn nennen: yapm :)

Bruce Lim
quelle
5
Ihr Wunsch wird
alex
1
Nun, ich habe über den Browserseiten-Abhängigkeitsmanager nachgedacht, aber ich denke, diese Arbeit funktioniert für beide: p Aus diesem Grund kann ich keine Startups durchführen, alle meine Ideen wurden bereits berücksichtigt.
Bruce Lim
@BruceLim Ja, jedes Mal, wenn wir denken, wir haben eine gute Idee, gibt es immer einige andere Leute, die sie bereits haben.
Evan Hu