2013-02-26 12 views
157

Wie vergleichen Sie npm, bower und volo?JavaScript-Abhängigkeitsverwaltung: Npm vs. Bower vs Volo

Alle drei können verwendet werden, um JavaScript-Abhängigkeiten für ein UI-Projekt zu installieren. Ich verstehe npm ist mehr Knoten spezifisch.

Also, wann was zu verwenden?

npm steht immer noch weit entfernt, aber bower und volo scheinen genau das gleiche Problem zu lösen, auch wenn ich nicht in der Lage bin, eine Grenze zwischen npm und bower-volo zu ziehen.

+0

http://stackoverflow.com/questions/18641899/difference-between-bower-and-npm – Stefan

+0

Wenn Sie hier diese Frage lesen und eine Antwort von 2015 wollen, finden Sie in meiner aktualisierten Antwort. – gustavohenke

+1

[Bower könnte in npm] (https://github.com/bower/bower/issues/1520) eher bald zusammengeführt werden. –

Antwort

104

Eine Beschreibung, die den Unterschied zwischen npm und bower am besten beschreibt, ist: npm verwaltet JavaScript-Module, Pakete genannt, und Bower verwaltet Front-End-Komponenten (d. H. Css, html und JavaScript). Npm wird auch verwendet, um Bower zu installieren. Hier ist eine expansive article on npm and bower (deckt nicht volo) es geht in viele Details.

+87

Dies ist keine sehr gute Beschreibung. Npm kann sicherlich verwendet werden, um Frontend-Komponenten zu installieren. –

+0

Obwohl ich bemerkt habe, dass einige "Frontend" -Bibliotheken auf Npm zugunsten ihrer Bower-Gegenstücke aufgegeben wurden. Nehmen Sie zum Beispiel [Ember] (https://www.npmjs.org/package/ember), die seit einem Jahr nicht mehr veröffentlicht wurde. – briangonzalez

+0

@BT Sicher kann es sein, aber es heißt npm, das für Knoten-Paket-Manager steht Ich glaube wirklich impliziert Knoten-Module nicht, dass es nicht für Front-End verwendet werden kann. –

72

Bower

Es ist immer noch sehr beliebt bei den Entwicklern Front-End, auch wenn es nur sehr wenige Funktionen. Jedes Frontend-Paket nutzt es. Es gibt auch eine initiative to merge bower into npm.

Bower ist für die Client-Seite optimiert und unterstützt nur flache Abhängigkeitsbäume, d. H. each library must be used only once (da es teuer ist, verschiedene Versionen derselben Bibliothek an den Client zu liefern), und die Abhängigkeitsbeschränkungen müssen vom Benutzer gelöst werden.

Sie können erwarten, dass alle Front-End-bezogenen in der Bower-Registrierung (bower search <some keyword>) finden - meiner Meinung nach, das ist der größte Vorteil der Bower in Bezug auf andere Paket-Manager.

volo

Ich habe nicht noch für mehr als 5 Minuten in Jahren verwendet. Ich weiß es nicht, but from what I can see es enthält einige Build-Tool, die Grunt-Benutzer sehr vertraut ist.

npm

Ja, npm steht für Manager-Knoten-Paket. Aber heutzutage kannst du es für alles verwenden; Menschen sind nicht mehr nur npm install Dinge und erwarten, dass sie funktionieren nur in der Knotenumgebung. Zum Beispiel gibt es viele npm packages for Twitter Bootstrap.

Npm ist für die serverseitige Verwendung mit einer verschachtelten Abhängigkeitsstruktur optimiert. Jede Abhängigkeit kann ihre eigenen Abhängigkeiten haben, die ihre eigenen haben können, und so weiter. Dies beseitigte Abhängigkeitsversionskonflikte, da jede Abhängigkeit ihre eigene Version von z. Unterstreichen. Die nächsten npm version 3 will flatten the dependency tree:

Mit npm @ 3, wird Ihr Knoten modules viel flacher sein. Alle Ihre Abhängigkeiten und die meisten Ihrer Subabhängigkeiten (und (Unter-) + Abhängigkeiten) sitzen auf der obersten Ebene nebeneinander. Nur wenn Konflikte auftreten, werden Module auf tieferen Ebenen installiert. Dies sollte Windows-Benutzern die Arbeit erleichtern.

Einige Vorteile ich mit npm sehen:

  • Es wird von allen anderen Paketmanager verwendet wird (Komponente, Bower, volo, JSPM, usw.);
  • Ermöglicht die Verwendung von Build-Skripts;
  • Viele Werkzeuge sind für introspecting npm-basierte Pakete

npm ist für JavaScript, um die Paket-Manager.

npmjs.com screenshot


Ab Februar 2013 war meiner Meinung nach die folgenden. Bitte nicht mehr berücksichtigen.

npm

Es ist besser, mit ihm zu haften, wenn Sie mit einem Knoten Projekt sind, es nur sehr wenige Projekte gibt, die auch für Browser zur Verfügung stehen ...

Bower

Bower ist die Pop-Typ jetzt. Sie haben viele Projekte unter ihrer 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 nicht volo, da so für mehr als 5 Minuten versucht, aber von dem, was ich es aussieht sehen konnte, flexibler zu sein als Bower.

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

+19

Es gibt Tausende von Modulen auf npm, die entweder nur in Browsern funktionieren 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. Das meiste auf Bower et all ist wahrscheinlich auf npm. – substack

+0

Ich verstehe nicht die Notwendigkeit für Projekt wie ngBoilerplate, Bower zu verwenden, während es bereits von npm für die Installation abhängt – lolski

+5

Was ist ein "Pop-Typ"? Ist "Pop" eine Abkürzung. für "beliebt"? –

24

Sie scheinen das gleiche Problem zu lösen, aber für verschiedene Umgebungen/Welten. NPM für Nodejs und Volo, Bower für den Browser.

Die Wahrheit ist, dass Sie NPM auch verwenden können, um Javascript und CSS für den Browser zu verwalten. Es gibt nichts, was dich daran hindern könnte. In diesem Sinne fühlt sich NPM für mich natürlicher an, als zwei verschiedene Tools für denselben Zweck zu verwalten.

Es scheint, dass Bower mehr Pakete zur Verfügung haben, zumindest für die beliebtesten. Aber bald werden jQuery will be also be available in NPM directly und wahrscheinlich alle anderen Bibliotheken dem gleichen Trend folgen.

Meiner Meinung nach, da gibt es Tools wie browserify und webmake gibt, dass Hilfe Verwendung Knotenmodule im Browser, ist es nicht mehr ein echter Bedarf an Bower oder volo, es sei denn, sie bieten Sie etwas anderes für Sie an (ein bestimmtes Modul, das nur in ihren Registern existiert). Beide

Volo und Bower ist auch gut, aber aus meiner Sicht, wenn Sie bereits NPM verwenden, könnte es besser sein, dabei zu bleiben.

Bitte beachten Sie, dass Sie NPM verwenden können, um Ihre Clientabhängigkeiten zu verwalten, auch ohne browserify oder webmake zu verwenden. In den meisten Projekten, an denen ich gerade arbeite, führe ich nach der Installation der npm-Module ein Skript aus, um sie an dem Ort bereitzustellen, an dem meine Client-Anwendung sie verwendet. Manchmal verwende ich grunt, um diese Datei mit anderen js-Dateien zu verketten, und manchmal referenziere ich direkt aus den Vorlagendateien meiner Web-Apps. In jedem Fall ist dies eine persönliche Vorliebe. Andere könnten Bower oder Volo einfacher verwenden, da sie in ihren Arbeitsabläufen natürlicher sind.

+1

Es ist gut, konkurrierende Lösungen für das gleiche Problem zu haben. Irgendeine Idee warum '' yeoman' 'Projekt sich entschied einen neuen Paketmanager zu entwickeln, als wir schon 'npm' hatten? (Es war reif, berühmt und funktionsreich) Dieser Gedanke lässt mich fühlen, dass ich immer noch den eigentlichen Punkt vermisse. –

+1

Nicht wirklich, aber wie Sie gesagt haben, ist manchmal lustig, das Rad neu zu erfinden, nur weil Sie können, und manchmal, indem Sie es tun einige Verbesserungen gemacht werden, während Sie versuchen, das gleiche Problem zu lösen. Nicht wirklich, warum sie sich entscheiden, ein neues zu machen, abgesehen davon, dass es für Entwickler einfacher ist, Pakete zu finden. Nicht alle Frontend-Entwickler haben Knotenerfahrung, das ist der Hauptgrund für Projekte wie Bower. Versuchen Sie es für Nicht-Knoten-Benutzer einfacher zu machen, ich rate nur hier. –

+0

Ich denke, sie wollten den Aufwand von 'npm 'zugunsten von Frontend-Einfachheit trennen. Daher für die Frontend-Entwicklung. –

5

Ich weiß, das ist nicht im Rahmen der Frage, aber es gibt auch eine andere Alternative. Jam JS - http://jamjs.org/ Eine Sache interessant ist, dass es Grunzen Fähigkeiten in Marmelade hat:

jam compile output.js 

Jemand sollte noch ein weiteres Paket-Manager machen und nennen Sie es: yapm :)

+5

Ihr Wunsch ist gewährt: https://github.com/rlidwka/yapm: P – alex

+1

Nun, ich dachte für Browser-Abhängigkeits-Manager, aber ich denke, das funktioniert für beide: p Deshalb kann ich Start-ups tun, alle meine Ideen waren dachte schon. –

+0

@BruceLim Ja, jedes Mal, wenn wir denken, dass wir eine gute Idee haben, gibt es immer einige andere Leute, die es schon haben. –

15

Bowers großen Vorteil gegenüber NPM ist, dass die Abhängigkeit Das Management erzwingt die Verwendung einer einzelnen Version einer Komponente (während NPM unterschiedliche Kopien/Versionen als Subabhängigkeiten verschiedener Module verwendet). Dies ist Eine sehr gute Sache weil es verhindert, dass Ihre Client-Seite Javascript aufgebläht wird durch die Notwendigkeit, mehrere Kopien einer Komponente in verschiedenen Versionen enthalten. Die Einbindung mehrerer Kopien eines Moduls ist von zentraler Bedeutung für die Funktionsweise des NPM-Abhängigkeitsmanagements, weshalb NPM für das clientseitige Paketmanagement völlig ungeeignet ist.

Eine Konsequenz der oben genannten ist, dass Bower Package Maintainer und Verbraucher mehr darauf achten müssen, ihre Versionsnummern zu erhalten, um Konflikte zu vermeiden, aber es ist ein Preis wert, zu zahlen. Und ich finde NPM-Module sind oft schlampig in der Ausgabe von Major-, Minor- und Patch-Releases, so dass NPM-Abhängigkeitsmanagement auch nicht gerade ein Bett aus Rosen ist.

+3

Dies gilt nur, wenn Sie Ihren Frontend-Code direkt aus dem Ordner bereitstellen, in den der Paketmanager diese Dateien gestellt hat. In meinem Fall habe ich entweder ein Skript zum Verarbeiten der less/js-Dateien oder browserify, um aus diesen Dateien ein Bündel zu erstellen. Das ist in meinem Fall kein großes Problem. Der Code, der verteilt wird, hat immer die richtigen Versionen, selbst wenn andere Unterkomponenten während der Entwicklung Duplikate enthalten, werden sie nie in die Produktion gelangen. –

+0

auch wenn Sie unabsichtlich (als Subabhängigkeiten) zwei verschiedene Versionen der gleichen Abhängigkeit benötigen? Ich denke in diesem Fall irren Sie sich – wheresrhys

+0

Ich benötige normalerweise keine Module, die ich nicht kontrolliere, also sind sie immer die Richtigen ... wenn ein Modul versehentlich versucht, ein bestimmtes Modul aus den Shimmed-Modulen zu verlangen Build wird fehlschlagen. Kein Punkt bei der Verwendung von Bower in meinem Fall kein Vorteil hinzugefügt –

Verwandte Themen