Was ist der grundlegende Unterschied zwischen bower
und npm
? Ich will nur etwas Schlichtes und Einfaches. Ich habe einige meiner Kollegen Gebrauch gesehen bower
und npm
austauschbar in ihrer Projekte.
javascript
npm
bower
Spiele Brainiac
quelle
quelle
Antworten:
Alle Paketmanager haben viele Nachteile. Sie müssen nur auswählen, mit wem Sie leben können.
Geschichte
npm begann mit der Verwaltung von node.js-Modulen (aus diesem Grund werden
node_modules
standardmäßig Pakete verwendet ), funktioniert jedoch auch für das Front-End, wenn es mit Browserify oder Webpack kombiniert wird .Bower wurde ausschließlich für das Frontend erstellt und ist in diesem Sinne optimiert.
Größe des Repos
npm ist viel, viel größer als bower, einschließlich JavaScript
country-data
für allgemeine Zwecke (z. B. für Länderinformationen odersorts
zum Sortieren von Funktionen, die im Front-End oder im Back-End verwendet werden können).Bower hat eine viel geringere Anzahl von Paketen.
Umgang mit Stilen usw.
Bower enthält Stile usw.
npm konzentriert sich auf JavaScript. Stile werden entweder separat heruntergeladen oder von so etwas benötigt
npm-sass
oder benötigtsass-npm
.Abhängigkeitsbehandlung
Der größte Unterschied besteht darin, dass npm verschachtelte Abhängigkeiten ausführt ( standardmäßig jedoch flach ist), während Bower einen flachen Abhängigkeitsbaum benötigt (dies belastet den Benutzer mit der Auflösung der Abhängigkeit). .
Ein verschachtelter Abhängigkeitsbaum bedeutet, dass Ihre Abhängigkeiten ihre eigenen Abhängigkeiten haben können, die ihre eigenen haben können, und so weiter. Auf diese Weise können zwei Module unterschiedliche Versionen derselben Abhängigkeit erfordern und weiterhin funktionieren. Beachten Sie, dass der Abhängigkeitsbaum seit npm v3 standardmäßig flach ist (Platz spart) und nur dort verschachtelt wird, wo dies erforderlich ist, z. B. wenn zwei Abhängigkeiten eine eigene Version von Underscore benötigen.
Einige Projekte verwenden beides, indem sie Bower für Front-End-Pakete und npm für Entwicklertools wie Yeoman, Grunt, Gulp, JSHint, CoffeeScript usw. verwenden.
Ressourcen
quelle
Diese Antwort ist eine Ergänzung zur Antwort von Sindre Sorhus. Der Hauptunterschied zwischen npm und Bower besteht darin, wie sie rekursive Abhängigkeiten behandeln. Beachten Sie, dass sie zusammen in einem einzelnen Projekt verwendet werden können.
Auf der npm FAQ : (archive.org Link vom 6. September 2015)
Auf der Bower- Homepage:
Kurz gesagt, npm strebt nach Stabilität. Bower strebt eine minimale Ressourcenbelastung an. Wenn Sie die Abhängigkeitsstruktur zeichnen, sehen Sie Folgendes:
npm:
Wie Sie sehen, werden einige Abhängigkeiten rekursiv installiert. Abhängigkeit A hat drei installierte Instanzen!
Laube:
Hier sehen Sie, dass sich alle eindeutigen Abhängigkeiten auf derselben Ebene befinden.
Warum also npm verwenden?
Möglicherweise erfordert Abhängigkeit B eine andere Version von Abhängigkeit A als Abhängigkeit C. npm installiert beide Versionen dieser Abhängigkeit, sodass sie trotzdem funktioniert, aber Bower führt zu einem Konflikt weil es keine Duplizierung mag (weil das Laden derselben Ressource auf eine Webseite ist sehr ineffizient und kostspielig, es kann auch einige schwerwiegende Fehler geben). Sie müssen manuell auswählen, welche Version Sie installieren möchten. Dies kann dazu führen, dass eine der Abhängigkeiten unterbrochen wird. Dies müssen Sie jedoch trotzdem beheben.
Die übliche Verwendung ist also Bower für die Pakete, die Sie auf Ihren Webseiten veröffentlichen möchten (z. B. Laufzeit , wo Sie Doppelarbeit vermeiden), und npm für andere Dinge wie Testen, Erstellen, Optimieren, Überprüfen usw. (z. B. Entwicklungszeit) , wo die Vervielfältigung weniger wichtig ist).
Update für npm 3:
npm 3 macht die Dinge immer noch anders als Bower. Die Abhängigkeiten werden global installiert, jedoch nur für die erste Version, auf die sie stoßen. Die anderen Versionen werden in der Baumstruktur installiert (das übergeordnete Modul, dann node_modules).
dep A v1.0(verwendet Root-Version)Für weitere Informationen empfehle ich, die Dokumente von npm 3 zu lesen
quelle
npm
oder eine minimale Ressourcenlast mit wählenbower
.TL; DR: Der größte Unterschied im täglichen Gebrauch sind nicht verschachtelte Abhängigkeiten ... es ist der Unterschied zwischen Modulen und globalen.
Ich denke, die vorherigen Poster haben einige der grundlegenden Unterschiede gut abgedeckt. (Die Verwendung verschachtelter Abhängigkeiten durch npm ist in der Tat sehr hilfreich bei der Verwaltung großer, komplexer Anwendungen, obwohl ich nicht denke, dass dies die wichtigste Unterscheidung ist.)
Ich bin jedoch überrascht, dass niemand einen der grundlegendsten Unterschiede zwischen Bower und npm explizit erklärt hat. Wenn Sie die obigen Antworten lesen, wird das Wort "Module" häufig im Zusammenhang mit npm verwendet. Aber es wird beiläufig erwähnt, als ob es nur ein Syntaxunterschied wäre.
Diese Unterscheidung zwischen Modulen und Globalen (oder Modulen und Skripten) ist jedoch möglicherweise der wichtigste Unterschied zwischen Bower und npm. Der npm-Ansatz, alles in Module zu integrieren, erfordert, dass Sie die Art und Weise, wie Sie Javascript für den Browser schreiben, mit ziemlicher Sicherheit zum Besseren ändern.
Der Bower-Ansatz: Globale Ressourcen wie
<script>
TagsBei root geht es bei Bower darum, einfache alte Skriptdateien zu laden. Was auch immer diese Skriptdateien enthalten, Bower lädt sie. Was im Grunde bedeutet , dass Bower ist genau wie mit allen Ihren Skripte in Klar alten
<script>
‚s in denen<head>
Ihren HTML.Der gleiche grundlegende Ansatz, den Sie gewohnt sind, aber Sie erhalten einige nette Automatisierungskomfort:
bower install
und sofort das tun , was er vor Ort benötigt.bower.json
angibt, werden diese auch für Sie heruntergeladen.Aber darüber hinaus ändert Bower nichts daran, wie wir Javascript schreiben . An den von Bower geladenen Dateien muss sich nichts ändern. Dies bedeutet insbesondere, dass die Ressourcen, die in von Bower geladenen Skripten bereitgestellt werden (normalerweise, aber nicht immer), weiterhin als definiert sind globale Variablen werden , die von überall im Kontext der Browserausführung verfügbar sind.
Der npm-Ansatz: Allgemeine JS-Module, explizite Abhängigkeitsinjektion
Der gesamte Code im Knotenland (und damit der gesamte über npm geladene Code) ist als Module strukturiert (insbesondere als Implementierung des CommonJS-Modulformats oder jetzt als ES6-Modul). Wenn Sie also NPM verwenden, um browserbezogene Abhängigkeiten zu behandeln (über Browserify oder etwas anderes, das denselben Job ausführt), strukturieren Sie Ihren Code auf dieselbe Weise wie Node.
Klügere Leute als ich haben die Frage "Warum Module?" In Angriff genommen, aber hier ist eine Zusammenfassung der Kapseln:
window.variable
. Der einzige Unfall, der immer noch auftritt, ist das Zuweisenthis.variable
, ohne zu bemerken, dass diesthis
tatsächlich der Fall istwindow
um den aktuellen Kontext handelt.)Für mich läuft die Verwendung von Modulen für Front-End-Code darauf hinaus, in einem viel engeren Kontext zu arbeiten, der einfacher zu überlegen und zu testen ist, und mehr Sicherheit darüber zu haben, was vor sich geht.
Das Erlernen der Verwendung der CommonJS / Node-Modulsyntax dauert nur etwa 30 Sekunden. In einer bestimmten JS-Datei, die ein Modul sein wird, deklarieren Sie zunächst alle externen Abhängigkeiten, die Sie verwenden möchten, wie folgt:
var React = require('react');
Innerhalb der Datei / des Moduls tun Sie, was Sie normalerweise tun würden, und erstellen ein Objekt oder eine Funktion, die Sie externen Benutzern zur Verfügung stellen möchten, und rufen sie möglicherweise auf
myModule
.Am Ende einer Datei exportieren Sie alles, was Sie mit der Welt teilen möchten, wie folgt:
module.exports = myModule;
Um einen CommonJS-basierten Workflow im Browser zu verwenden, verwenden Sie Tools wie Browserify, um alle diese einzelnen Moduldateien abzurufen, ihren Inhalt zur Laufzeit zu kapseln und sie nach Bedarf ineinander zu injizieren.
UND da ES6-Module (die Sie wahrscheinlich mit Babel oder ähnlichem auf ES5 übertragen werden) breite Akzeptanz finden und sowohl im Browser als auch in Node 4.0 funktionieren, sollten wir einen guten Überblick erwähnen über diese .
Weitere Informationen zu Mustern für die Arbeit mit Modulen in diesem Deck .
BEARBEITEN (Februar 2017): Facebooks Garn ist heutzutage ein sehr wichtiger potenzieller Ersatz / eine wichtige Ergänzung für npm: schnelles, deterministisches Offline-Paketmanagement, das auf dem aufbaut, was npm Ihnen bietet. Es ist einen Blick wert für jedes JS-Projekt, zumal es so einfach ist, es ein- und auszutauschen.
EDIT (Mai 2019) "Bower ist endgültig veraltet . Ende der Geschichte." (h / t: @DanDascalescu, unten, für eine markige Zusammenfassung.)
Und während Yarn noch aktiv ist , verlagerte sich ein Großteil der Dynamik auf npm zurück, sobald einige der Hauptmerkmale von Yarn übernommen wurden.
quelle
2017-Okt Update
Bower ist endgültig veraltet . Ende der Geschichte.
Ältere Antwort
Von Mattias Petter Johansson, JavaScript-Entwickler bei Spotify :
(Beachten Sie, dass Webpack und Rollup ab August 2016 allgemein als besser als Browserify angesehen werden.)
quelle
Bower verwaltet eine einzelne Version von Modulen und versucht nur, Ihnen bei der Auswahl der richtigen / besten für Sie zu helfen.
NPM ist besser für Knotenmodule, da es ein Modulsystem gibt und Sie lokal arbeiten. Bower ist gut für den Browser, da es derzeit nur den globalen Bereich gibt und Sie sehr wählerisch bei der Version sein möchten, mit der Sie arbeiten.
quelle
Mein Team ist von Bower weggezogen und auf npm umgestiegen, weil:
Weitere Informationen finden Sie unter "Warum mein Team npm anstelle von bower verwendet" .
quelle
Diese nützliche Erklärung finden Sie unter http://ng-learn.org/2013/11/Bower-vs-npm/
quelle
npm dedupe
ist dies ein bisschen veraltet. Siehe Mattias 'Antwort .Für viele Leute, die mit node.js arbeiten, besteht ein Hauptvorteil von bower darin, Abhängigkeiten zu verwalten, die überhaupt kein Javascript sind. Wenn sie mit Sprachen arbeiten, die mit Javascript kompiliert werden, kann npm verwendet werden, um einige ihrer Abhängigkeiten zu verwalten. Es werden jedoch nicht alle Abhängigkeiten Node.js-Module sein. Einige von denen, die mit Javascript kompiliert werden, haben möglicherweise eine seltsame quellsprachenspezifische Verfälschung, die das Weitergeben an Javascript zu einer uneleganten Option macht, wenn Benutzer Quellcode erwarten.
Nicht alles in einem npm-Paket muss benutzerorientiertes Javascript sein, aber für npm-Bibliothekspakete sollte zumindest ein Teil davon vorhanden sein.
quelle