Ich versuche, mein Wissen über die beliebtesten JavaScript-Paketmanager, Bundler und Task-Runner zusammenzufassen. Bitte korrigiere mich wenn ich falsch liege:
npm
&bower
sind Paketmanager. Sie laden nur die Abhängigkeiten herunter und wissen nicht, wie sie Projekte selbst erstellen sollen. Was sie wissen , ist zu nennenwebpack
/gulp
/grunt
nach alle Abhängigkeiten zu holen.bower
ist wienpm
, baut aber einen abgeflachten Abhängigkeitsbaum auf (im Gegensatz zu dem,npm
was es rekursiv tut). Bedeutungnpm
holt die Abhängigkeiten für jede Abhängigkeit (das gleiche ein paar Mal holen), währendbower
erwartet Sie manuell Unter Abhängigkeiten enthalten. Manchmalbower
undnpm
werden zusammen für Front-End bzw. Back-End verwendet (da jedes Megabyte im Front-End von Bedeutung sein kann).grunt
undgulp
sind Task-Läufer, um alles zu automatisieren, was automatisiert werden kann (dh CSS / Sass kompilieren, Bilder optimieren, ein Bündel erstellen und es minimieren / transpilieren).grunt
vs.gulp
(ist wiemaven
vs.gradle
oder Konfiguration vs. Code). Grunt basiert auf der Konfiguration separater unabhängiger Aufgaben. Jede Aufgabe öffnet / verarbeitet / schließt eine Datei. Gulp benötigt weniger Code und basiert auf Node-Streams, wodurch es Pipe-Ketten erstellen kann (ohne dieselbe Datei erneut zu öffnen) und schneller wird.webpack
(webpack-dev-server
) - Für mich ist es ein Task Runner mit heißem Nachladen von Änderungen, mit dem Sie alle JS / CSS-Beobachter vergessen können.npm
/bower
+ Plugins können Task Runner ersetzen. Ihre Fähigkeiten überschneiden sich häufig, sodass es unterschiedliche Auswirkungen gibt, wenn Siegulp
/grunt
overnpm
+ -Plugins verwenden müssen. Task-Läufer eignen sich jedoch definitiv besser für komplexe Aufgaben (z. B. "Erstellen Sie bei jedem Build ein Bundle, transpilieren Sie es von ES6 auf ES5, führen Sie es in allen Browser-Emulatoren aus, erstellen Sie Screenshots und stellen Sie es über FTP für Dropbox bereit").browserify
Ermöglicht das Packen von Knotenmodulen für Browser.browserify
vsnode
'srequire
ist eigentlich AMD vs CommonJS .
Fragen:
- Was ist
webpack
&webpack-dev-server
? Offizielle Dokumentation besagt, dass es ein Modulbündler ist, aber für mich ist es nur ein Task Runner. Was ist der Unterschied? - Wo würdest du verwenden
browserify
? Können wir das nicht auch mit Node / ES6-Importen machen? - Wann würden Sie
gulp
/grunt
overnpm
+ Plugins verwenden? - Bitte geben Sie Beispiele an, wenn Sie eine Kombination verwenden müssen
Antworten:
Webpack und Browserify
Webpack und Browserify erledigen fast den gleichen Job, bei dem Ihr Code für die Verwendung in einer Zielumgebung verarbeitet wird (hauptsächlich Browser, obwohl Sie auch auf andere Umgebungen wie Node abzielen können). Das Ergebnis einer solchen Verarbeitung sind ein oder mehrere Bündel - zusammengestellte Skripte, die für eine bestimmte Umgebung geeignet sind.
Angenommen, Sie haben ES6-Code geschrieben, der in Module unterteilt ist, und möchten ihn in einem Browser ausführen können. Wenn diese Module Knotenmodule sind, versteht der Browser sie nicht, da sie nur in der Knotenumgebung vorhanden sind. ES6-Module funktionieren auch in älteren Browsern wie IE11 nicht. Darüber hinaus haben Sie möglicherweise experimentelle Sprachfunktionen verwendet (nächste ES-Vorschläge), die Browser noch nicht implementiert haben, sodass das Ausführen eines solchen Skripts nur zu Fehlern führen würde. Tools wie Webpack und Browserify lösen diese Probleme, indem sie solchen Code in ein Formular übersetzen, das ein Browser ausführen kann . Darüber hinaus ermöglichen sie eine Vielzahl von Optimierungen für diese Bundles.
Webpack und Browserify unterscheiden sich jedoch in vielerlei Hinsicht. Webpack bietet standardmäßig viele Tools (z. B. Code-Aufteilung), während Browserify dies nur nach dem Herunterladen von Plugins tun kann, aber beide führt zu sehr ähnlichen Ergebnissen . Es kommt auf die persönlichen Vorlieben an (Webpack ist trendiger). Übrigens ist Webpack kein Task-Runner, sondern nur ein Prozessor Ihrer Dateien (es verarbeitet sie mit sogenannten Loadern und Plugins) und kann (unter anderem) von einem Task-Runner ausgeführt werden.
Webpack Dev Server
Webpack Dev Server bietet eine ähnliche Lösung wie Browsersync - einen Entwicklungsserver, auf dem Sie Ihre App während der Arbeit schnell bereitstellen und Ihren Entwicklungsfortschritt sofort überprüfen können. Der Entwicklungsserver aktualisiert den Browser automatisch bei Codeänderungen oder gibt sogar geänderten Code weiter zum Browser ohne Nachladen mit sogenanntem Hot Module Replacement.
Task Runner gegen NPM-Skripte
Ich habe Gulp für seine Prägnanz und das einfache Schreiben von Aufgaben verwendet, aber später herausgefunden, dass ich weder Gulp noch Grunt brauche. Alles, was ich jemals gebraucht habe, hätte mit NPM-Skripten durchgeführt werden können, um Tools von Drittanbietern über deren API auszuführen. Die Wahl zwischen Gulp-, Grunt- oder NPM-Skripten hängt vom Geschmack und der Erfahrung Ihres Teams ab.
Während Aufgaben in Gulp oder Grunt selbst für Leute, die mit JS nicht so vertraut sind, leicht zu lesen sind, ist es ein weiteres Werkzeug, das man benötigen und lernen muss, und ich persönlich bevorzuge es, meine Abhängigkeiten einzugrenzen und die Dinge einfach zu machen. Andererseits kann es schwieriger sein, diese Aufgaben durch die Kombination von NPM-Skripten und (wahrscheinlich JS-) Skripten zu ersetzen, auf denen diese Tools von Drittanbietern ausgeführt werden (z. B. Konfigurieren und Ausführen von Rimraf für Reinigungszwecke). In den meisten Fällen sind diese drei jedoch hinsichtlich ihrer Ergebnisse gleich.
Beispiele
Für die Beispiele schlage ich vor, dass Sie sich dieses React-Starterprojekt ansehen , das Ihnen eine schöne Kombination von NPM- und JS-Skripten zeigt, die den gesamten Erstellungs- und Bereitstellungsprozess abdecken. Sie finden diese NPM-Skripte im
package.json
Stammordner in einer Eigenschaft mit dem Namenscripts
. Dort werden Sie meist auf Befehle wie stoßenbabel-node tools/run start
. Babel-Node ist ein CLI-Tool (nicht für den Produktionsbetrieb gedacht), das zunächst die ES6-Dateitools/run
(run.js-Datei in Tools ) kompiliert - im Grunde ein Runner-Dienstprogramm. Dieser Runner nimmt eine Funktion als Argument und führt sie aus. In diesem Fall handelt es sich um einstart
weiteres Dienstprogramm (start.js
) verantwortlich für das Bündeln von Quelldateien (sowohl Client als auch Server) und das Starten der Anwendung und des Entwicklungsservers (der Entwicklungsserver wird wahrscheinlich entweder Webpack Dev Server oder Browsersync sein).Genauer gesagt,
start.js
erstellt sowohl clientseitige als auch serverseitige Bundles, startet einen Express-Server und initialisiert nach einem erfolgreichen Start die Browsersynchronisierung, die zum Zeitpunkt des Schreibens so aussah ( den neuesten Code finden Sie im React Starter-Projekt ).Der wichtige Teil ist
proxy.target
, wo sie die Serveradresse festlegen, die sie als Proxy verwenden möchten. Dies könnte http: // localhost: 3000 sein , und Browsersync startet einen Server, der http: // localhost: 3001 überwacht , wo die generierten Assets mit automatischer Änderung bereitgestellt werden Erkennung und Austausch heißer Module. Wie Sie sehen können, gibt es eine andere Konfigurationseigenschaftfiles
mit einzelnen Dateien oder Mustern. Die Browsersynchronisierung sucht nach Änderungen und lädt den Browser neu, wenn einige auftreten. Wie der Kommentar jedoch sagt, kümmert sich Webpack darum, js Quellen selbst mit HMR zu überwachen, sodass sie zusammenarbeiten Dort.Jetzt habe ich kein gleichwertiges Beispiel für eine solche Grunt- oder Gulp-Konfiguration, aber mit Gulp (und etwas ähnlich mit Grunt) würden Sie einzelne Aufgaben in gulpfile.js wie schreiben
wo Sie im Wesentlichen die gleichen Dinge tun würden wie im Starter-Kit, diesmal mit Task Runner, der einige Probleme für Sie löst, aber seine eigenen Probleme und einige Schwierigkeiten beim Erlernen der Verwendung und, wie ich sage, die Je mehr Abhängigkeiten Sie haben, desto mehr können schief gehen. Und das ist der Grund, warum ich solche Werkzeuge gerne los werde.
quelle
Update Oktober 2018
Wenn Sie sich über Front-End-Entwickler noch nicht sicher sind, können Sie hier einen kurzen Blick auf eine hervorragende Ressource werfen.
https://github.com/kamranahmedse/developer-roadmap
Update Juni 2018
Das Erlernen von modernem JavaScript ist schwierig, wenn Sie von Anfang an nicht dort waren. Wenn Sie der Neuling sind, denken Sie daran, diese ausgezeichnete Schrift zu überprüfen, um einen besseren Überblick zu erhalten.
https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
Update Juli 2017
Kürzlich habe ich vom Grab-Team einen wirklich umfassenden Leitfaden gefunden, wie man sich der Front-End-Entwicklung im Jahr 2017 nähert. Sie können ihn wie folgt überprüfen.
https://github.com/grab/front-end-guide
Ich habe auch schon seit einiger Zeit danach gesucht, da es viele Tools gibt, von denen jedes in einem anderen Aspekt für uns von Vorteil ist. Die Community ist aufgeteilt in Tools wie
Browserify, Webpack, jspm, Grunt and Gulp
. Sie könnten auch davon hörenYeoman or Slush
. Das ist nicht wirklich ein Problem, es ist nur verwirrend für alle, die versuchen, einen klaren Weg vorwärts zu verstehen.Jedenfalls möchte ich etwas beitragen.
1. Paketmanager
Paketmanager vereinfachen die Installation und Aktualisierung von Projektabhängigkeiten, bei denen es sich um Bibliotheken wie:
jQuery, Bootstrap
usw. handelt - alles, was auf Ihrer Site verwendet wird und nicht von Ihnen geschrieben wurde.Durchsuchen aller Bibliothekswebsites, Herunterladen und Entpacken der Archive, Kopieren von Dateien in die Projekte - all dies wird durch einige Befehle im Terminal ersetzt.
NPM
steht für:Node JS package manager
Hilft Ihnen bei der Verwaltung aller Bibliotheken, auf die sich Ihre Software stützt. Sie würden Ihre Anforderungen in einer Datei definieren, die aufgerufenpackage.json
undnpm install
in der Befehlszeile ausgeführt wird. Dann werden Ihre Pakete heruntergeladen und können verwendet werden. Könnte beide fürfront-end and back-end
Bibliotheken verwendet werden.Bower
: Für das Front-End-Paketmanagement ist das Konzept mit NPM identisch. Alle Ihre Bibliotheken werden in einer Datei mit dem Namen gespeichertbower.json
und dannbower install
in der Befehlszeile ausgeführt.NPM
Laube
Yarn
: Ein neuer Paket - Manager fürJavaScript
veröffentlicht durchFacebook
einige weitere Vorteile vor kurzem im Vergleich zuNPM
. Und mit Yarn können Sie weiterhin beideNPM
und dieBower
Registrierung verwenden, um das Paket abzurufen. Wenn Sie zuvor ein Paket installiert haben,yarn
wird eine zwischengespeicherte Kopie erstellt, die dies erleichtertoffline package installs
.jspm
: ist ein Paketmanager für denSystemJS
universellen Modullader, der auf dem dynamischenES6
Modullader aufbaut. Es ist kein völlig neuer Paketmanager mit eigenen Regeln, sondern funktioniert zusätzlich zu vorhandenen Paketquellen. Standardmäßig funktioniert es mitGitHub
undnpm
. Da die meistenBower
basierten Pakete auf basierenGitHub
, können wir diese Pakete auch mit installierenjspm
. Es verfügt über eine Registrierung, in der die meisten häufig verwendeten Front-End-Pakete zur einfacheren Installation aufgelistet sind.2. Modullader / Bündelung
Bei den meisten Projekten jeder Größenordnung wird der Code auf mehrere Dateien aufgeteilt. Sie können einfach jede Datei mit einem einzelnen
<script>
Tag versehen, jedoch<script>
eine neue http-Verbindung herstellen. Bei kleinen Dateien - was ein Ziel der Modularität ist - kann die Zeit zum Einrichten der Verbindung erheblich länger dauern als das Übertragen der Daten. Während die Skripte heruntergeladen werden, kann kein Inhalt auf der Seite geändert werden.Z.B
Z.B
Computer können das besser als Sie, und deshalb sollten Sie ein Tool verwenden, um alles automatisch in einer einzigen Datei zu bündeln.
Dann hörten wir von
RequireJS
,Browserify
,Webpack
undSystemJS
RequireJS
: ist einJavaScript
Datei- und Modullader. Es ist für die Verwendung im Browser optimiert, kann jedoch auch in anderen JavaScript-Umgebungen verwendet werdenNode
.ZB: myModule.js
In
main.js
können wirmyModule.js
als Abhängigkeit importieren und verwenden.Und dann
HTML
können wir in unserem auf die Verwendung mit verweisenRequireJS
.Browserify
: Legen Sie fest, dassCommonJS
formatierte Module im Browser verwendet werden sollen. FolglichBrowserify
ist es nicht so sehr ein Modullader wie ein Modulbündler: EsBrowserify
handelt sich ausschließlich um ein Tool zur Erstellung, das ein Codebündel erzeugt, das dann clientseitig geladen werden kann.Beginnen Sie mit einer Build-Maschine, auf der Node & npm installiert ist, und holen Sie sich das Paket:
Schreiben Sie Ihre Module im
CommonJS
FormatUnd wenn Sie zufrieden sind, geben Sie den Befehl zum Bündeln ein:
Browserify findet rekursiv alle Abhängigkeiten des Einstiegspunkts und fasst sie zu einer einzigen Datei zusammen:
Webpack
: Es bündelt alle Ihre statischen Assets, einschließlichJavaScript
Bilder, CSS und mehr, in einer einzigen Datei. Außerdem können Sie die Dateien über verschiedene Arten von Ladern verarbeiten. Sie können IhreJavaScript
With-CommonJS
oderAMD
Module-Syntax schreiben . Es greift das Build-Problem grundlegend integrierter und einfühlsamer an. In verwendenBrowserify
SieGulp/Grunt
und eine lange Liste von Transformationen und Plugins, um die Arbeit zu erledigen.Webpack
bietet sofort genug Strom, den Sie normalerweise nichtGrunt
oder überhaupt nicht benötigenGulp
.Die grundlegende Verwendung ist nicht einfach. Installieren Sie Webpack wie Browserify:
Und übergeben Sie dem Befehl einen Einstiegspunkt und eine Ausgabedatei:
SystemJS
: ist ein Modullader, der Module zur Laufzeit in einem der heute verwendeten gängigen Formate importieren kann (CommonJS, UMD, AMD, ES6
). Es basiert auf derES6
Polyfill des Modulladers und ist intelligent genug, um das verwendete Format zu erkennen und entsprechend zu handhaben.SystemJS
kann auch ES6-Code (mitBabel
oderTraceur
) oder andere Sprachen wieTypeScript
undCoffeeScript
mithilfe von Plugins transpilieren.3. Task Runner
Task-Runner und Build-Tools sind in erster Linie Befehlszeilen-Tools. Warum wir sie verwenden müssen: Mit einem Wort: Automatisierung . Je weniger Arbeit Sie leisten müssen, wenn Sie sich wiederholende Aufgaben wie Minimieren, Kompilieren, Komponententests oder Flusen ausführen , die uns früher viel Zeit gekostet haben, um mit der Befehlszeile oder sogar manuell zu arbeiten.
Grunt
: Sie können eine Automatisierung für Ihre Entwicklungsumgebung erstellen, um Codes vorzuverarbeiten oder Build-Skripte mit einer Konfigurationsdatei zu erstellen, und es scheint sehr schwierig zu sein, eine komplexe Aufgabe zu erledigen. Beliebt in den letzten Jahren.Jede Aufgabe
Grunt
besteht aus einer Reihe verschiedener Plugin-Konfigurationen, die einfach nacheinander streng unabhängig und sequentiell ausgeführt werden.Gulp
: Automatisierung genau wie,Grunt
aber anstelle von Konfigurationen können SieJavaScript
mit Streams schreiben, als wäre es eine Knotenanwendung. Bevorzugen Sie diese Tage.Dies ist eine
Gulp
Beispielaufgabendeklaration.4. Gerüstwerkzeuge
Slush and Yeoman
: Mit ihnen können Sie Starterprojekte erstellen. Sie planen beispielsweise, einen Prototyp mit HTML und SCSS zu erstellen und dann manuell Ordner wie scss, css, img und fonts zu erstellen. Sie können einfachyeoman
ein einfaches Skript installieren und ausführen. Dann alles hier für dich.Mehr hier .
Meine Antwort stimmt nicht wirklich mit dem Inhalt der Frage überein. Wenn ich jedoch bei Google nach diesem Wissen suche, wird die Frage immer oben angezeigt, sodass ich mich entschlossen habe, sie zusammenfassend zu beantworten. Hoffe ihr fand es hilfreich.
quelle
OK, sie haben alle einige Ähnlichkeiten, sie tun die gleichen Dinge für Sie auf unterschiedliche und ähnliche Weise. Ich teile sie wie folgt in 3 Hauptgruppen ein :
1) Modulbündler
webpack und browserify als beliebte, arbeiten wie Task-Runner, aber mit mehr Flexibilität, bündelt es auch alles als Ihre Einstellung, so dass Sie auf das Ergebnis als bundle.js verweisen können, zum Beispiel in einer einzigen Datei, einschließlich CSS und Javascript, z Weitere Details finden Sie in den folgenden Details:
Webpack
mehr hier
browserify
mehr hier
2) Aufgabenläufer
gulp und grunt sind Aufgabenläufer, im Grunde genommen das, was sie tun. Sie erstellen Aufgaben und führen sie aus, wann immer Sie möchten. Sie installieren beispielsweise ein Plugin, um Ihr CSS zu minimieren, und führen es dann jedes Mal aus, um es zu minimieren. Weitere Details zu jedem:
Schluck
mehr hier
grunzen
mehr hier
3) Paketmanager
Paketmanager verwalten Plugins, die Sie in Ihrer Anwendung benötigen, und installieren sie über github usw. mit package.json für Sie. Dies ist sehr praktisch, um Ihre Module zu aktualisieren, zu installieren und Ihre App zu teilen. Weitere Details für jedes:
npm
mehr hier
Laube
mehr hier
und der neueste Paketmanager, den man sich nicht entgehen lassen sollte, er ist jung und schnell in einer realen Arbeitsumgebung im Vergleich zu npm, die ich zuvor hauptsächlich verwendet habe. Für die Neuinstallation von Modulen wird der Ordner node_modules doppelt überprüft, um die Existenz des Moduls zu überprüfen. Außerdem scheint die Installation der Module weniger Zeit in Anspruch zu nehmen:
Garn
mehr hier
quelle
Einige technische Vergleiche finden Sie auf npmcompare
Vergleich von browserify vs. grunt vs. gulp vs. webpack
Wie Sie sehen können, ist das Webpack sehr gut gepflegt. Eine neue Version erscheint durchschnittlich alle 4 Tage. Aber Gulp scheint die größte Community von allen zu haben (mit über 20.000 Sternen auf Github). Grunt scheint ein bisschen vernachlässigt zu sein (im Vergleich zu den anderen).
Wenn ich also einen über den anderen wählen müsste, würde ich mich für Gulp entscheiden
quelle
Ein kleiner Hinweis zu npm: npm3 versucht, Abhängigkeiten flach zu installieren
https://docs.npmjs.com/how-npm-works/npm3#npm-v3-dependency-resolution
quelle
dedupe
Möglichkeit, dasselbe zu tunwebpack-dev-server ist ein Live- Reload- Webserver, mit dem Webpack- Entwickler sofort Feedback erhalten, was sie tun. Es sollte nur während der Entwicklung verwendet werden.
Dieses Projekt ist stark vom nof5- Unit-Test-Tool inspiriert .
Webpack wie der Name schon sagt ein erstellen SINGLE Pack Alter für das Web . Das Paket wird minimiert und zu einer einzigen Datei zusammengefasst (wir leben immer noch im HTTP 1.1-Alter). Webpack kombiniert die Ressourcen (JavaScript, CSS, Bilder) und fügt sie wie folgt ein :
<script src="assets/bundle.js"></script>
.Es kann auch als Modulbündler bezeichnet werden, da es die Modulabhängigkeiten verstehen muss und weiß, wie die Abhängigkeiten erfasst und gebündelt werden.
Sie können Browserify für genau dieselben Aufgaben verwenden, für die Sie Webpack verwenden würden . - Webpack ist jedoch kompakter.
Beachten Sie, dass die ES6 Modullader Merkmale in Webpack2 verwenden System.import , die keine einzigen Browser nativ unterstützt.
Sie können Gulp, Grunt, Brokoli, Brunch und Bower vergessen . Verwenden Sie stattdessen direkt npm-Befehlszeilenskripte, und Sie können zusätzliche Pakete wie diese hier für Gulp entfernen :
Sie können wahrscheinlich Gulp- und Grunt- Konfigurationsdateigeneratoren verwenden, wenn Sie Konfigurationsdateien für Ihr Projekt erstellen. Auf diese Weise müssen Sie Yeoman oder ähnliche Tools nicht installieren .
quelle
Yarn ist ein neuerer Paketmanager, der es wahrscheinlich verdient, erwähnt zu werden.
Also, hier ist es: https://yarnpkg.com/
Soweit ich weiß, kann es sowohl npm- als auch bower-Abhängigkeiten abrufen und hat andere geschätzte Funktionen.
quelle
Webpack
ist ein Bündler. WieBrowserfy
es in der Codebasis nach Modulanforderungen (require
oderimport
) sucht und diese rekursiv auflöst. Darüber hinaus können Sie konfigurierenWebpack
, dass nicht nur JavaScript-ähnliche Module, sondern auch CSS, Bilder, HTML und buchstäblich alles aufgelöst werden. Was mich besonders begeistert, istWebpack
, dass Sie sowohl kompilierte als auch dynamisch geladene Module in derselben App kombinieren können. So erhält man einen echten Leistungsschub, insbesondere über HTTP / 1.x. Wie genau Sie es tun, habe ich hier anhand von Beispielen beschrieben. Http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Als Alternative für Bundler kann man sich vorstellenRollup.js
( https://rollupjs.org/ ). , der den Code während der Kompilierung optimiert, aber alle gefundenen nicht verwendeten Chunks entfernt.Denn
AMD
stattdessenRequireJS
kann man mit native gehenES2016 module system
, aber geladen mitSystem.js
( https://github.com/systemjs/systemjs )Außerdem würde ich darauf hinweisen, dass
npm
oft als Automatisierungswerkzeug wiegrunt
oder verwendet wirdgulp
. Überprüfen Sie https://docs.npmjs.com/misc/scripts . Ich persönlich gehe jetzt mit npm-Skripten um und vermeide nur andere Automatisierungstools, obwohl ich mich in der Vergangenheit sehr dafür interessiert habegrunt
. Bei anderen Tools müssen Sie sich auf unzählige Plugins für Pakete verlassen, die oft nicht gut geschrieben sind und nicht aktiv gewartet werden.npm
kennt seine Pakete, so dass Sie eines der lokal installierten Pakete mit folgenden Namen aufrufen können:Tatsächlich benötigen Sie in der Regel kein Plugin, wenn das Paket CLI unterstützt.
quelle