Gulp ist ein Tool, das bei der Webentwicklung bei verschiedenen Aufgaben hilft. Es wird häufig für Frontend-Aufgaben wie die folgenden verwendet:
- Einen Webserver starten
- Den Browser automatisch neu laden, wenn eine Datei gespeichert wird
- Präprozessoren wie Sass oder LESS verwenden
- Assets wie CSS, JavaScript und Bilder optimieren
Wichtiger Hinweis! Dieser Artikel wurde für Gulp 3.x geschrieben, aber jetzt ist Gulp 4.x verfügbar und wird empfohlen. Wie bei jeder größeren Versionsänderung gibt es API-Änderungen, die nicht abwärtskompatibel sind. Wenn Sie Gulp 4 installieren und versuchen, einige der Dinge in diesem Artikel zu tun, funktionieren diese nicht. Wir werden hier Notizen einstreuen, um Sie daran zu erinnern. Dies scheint ein ziemlich guter Gulp 4-Starter zu sein.
Dies ist keine vollständige Liste dessen, was Gulp kann. Wenn Sie verrückt genug sind, können Sie mit Gulp sogar einen Generator für statische Websites erstellen (ich habe es getan!). Ja, Gulp ist extrem leistungsstark, aber Sie müssen lernen, wie Sie Gulp verwenden, wenn Sie Ihre eigenen angepassten Build-Prozesse erstellen möchten.
Dafür ist dieser Artikel gedacht. Er hilft Ihnen, die Grundlagen von Gulp so gut zu beherrschen, dass Sie beginnen können, alles andere selbst zu erkunden.
Bevor wir uns mit der Arbeit mit Gulp befassen, sprechen wir darüber, warum Sie Gulp anstelle anderer ähnlicher Tools verwenden sollten.
Warum Gulp?
Tools wie Gulp werden oft als „Build-Tools“ bezeichnet, weil es sich um Tools handelt, die die Aufgaben zum Erstellen einer Website ausführen. Die beiden beliebtesten Build-Tools sind derzeit Gulp und Grunt. (Chris hat hier einen Beitrag zum Einstieg in Grunt). Aber es gibt natürlich auch andere. Broccoli konzentriert sich auf die Asset-Kompilierung, eine der häufigsten Aufgaben von Build-Tools.
Es gibt bereits mehrere Artikel, die den Unterschied zwischen Grunt und Gulp behandeln und erklären, warum man das eine dem anderen vorziehen könnte. Sie können diesen Artikel, diesen oder diesen lesen, wenn Sie mehr erfahren möchten. Brunch konzentriert sich ebenfalls auf Assets und bündelt einige der gängigsten anderen Aufgaben wie einen Server und einen Dateiwächter.
Der Hauptunterschied besteht darin, wie Sie einen Workflow damit konfigurieren. Gulp-Konfigurationen sind in der Regel viel kürzer und einfacher als Grunt-Konfigurationen. Gulp läuft auch tendenziell schneller.
Lassen Sie uns nun fortfahren und herausfinden, wie man einen Workflow mit Gulp einrichtet.
Was wir einrichten
Am Ende dieses Artikels werden Sie einen Workflow haben, der die Aufgaben erledigt, die wir am Anfang dieses Artikels skizziert haben:
- Startet einen Webserver
- Kompiliert Sass zu CSS
- Aktualisiert den Browser automatisch, wenn Sie eine Datei speichern
- Optimiert alle Assets (CSS, JS, Schriftarten und Bilder) für die Produktion
Sie werden auch lernen, wie Sie verschiedene Aufgaben zu einfachen Befehlen verketten, die leicht zu verstehen und auszuführen sind.
Beginnen wir mit der Installation von Gulp auf Ihrem Computer.
Gulp installieren
Sie müssen Node.js (Node) auf Ihrem Computer installiert haben, bevor Sie Gulp installieren können.
Wenn Sie Node noch nicht installiert haben, können Sie es über die Node-Website herunterladen.
Wenn Sie die Installation von Node abgeschlossen haben, können Sie Gulp mit dem folgenden Befehl in der Befehlszeile installieren:
$ sudo npm install gulp -g
Hinweis: Nur Mac-Benutzer benötigen das Schlüsselwort sudo. (Siehe den ersten Kommentar von Pawel Grzybek, wenn Sie sudo nicht verwenden möchten). Und denken Sie daran, dass das „$“ im obigen Code nur die Eingabeaufforderung symbolisiert. Es ist nicht wirklich Teil des Befehls, den Sie ausführen.
Der Befehl npm install, den wir hier verwendet haben, ist ein Befehl, der Node Package Manager (npm) verwendet, um Gulp auf Ihrem Computer zu installieren.
Das Flag -g in diesem Befehl weist npm an, Gulp global auf Ihrem Computer zu installieren, sodass Sie den Befehl gulp überall auf Ihrem System verwenden können.
Mac-Benutzer benötigen das zusätzliche Schlüsselwort sudo im Befehl, da sie Administratorrechte benötigen, um Gulp global zu installieren.
Nachdem Sie Gulp installiert haben, erstellen wir ein Projekt, das Gulp verwendet.
Ein Gulp-Projekt erstellen
Zuerst erstellen wir einen Ordner namens project, der als Stammverzeichnis unseres Projekts dient, während wir dieses Tutorial durchgehen. Führen Sie den Befehl npm init in diesem Verzeichnis aus:
# ... from within our project folder
$ npm init
Der Befehl npm init erstellt eine package.json-Datei für Ihr Projekt, in der Informationen über das Projekt gespeichert werden, wie z. B. die im Projekt verwendeten Abhängigkeiten (Gulp ist ein Beispiel für eine Abhängigkeit).
npm init fragt Sie:

Sobald die Datei package.json erstellt ist, können wir Gulp mit dem folgenden Befehl in das Projekt installieren:
$ npm install gulp --save-dev
Dieses Mal installieren wir Gulp im Ordner project, anstatt es global zu installieren, weshalb es einige Unterschiede im Befehl gibt.
Sie werden sehen, dass das Schlüsselwort sudo nicht erforderlich ist, da wir Gulp nicht global installieren, sodass -g ebenfalls nicht notwendig ist. Wir haben --save-dev hinzugefügt, was dem Computer mitteilt, gulp als Entwicklungsabhängigkeit in package.json hinzuzufügen.

Wenn Sie den Projektordner überprüfen, nachdem der Befehl ausgeführt wurde, sollten Sie sehen, dass Gulp einen Ordner node_modules erstellt hat. Sie sollten auch einen gulp-Ordner innerhalb von node_modules sehen.

Wir sind fast bereit, mit der Arbeit mit Gulp zu beginnen. Zuvor müssen wir uns jedoch darüber im Klaren sein, wie wir Gulp für das Projekt verwenden werden, und dazu gehört die Entscheidung über eine Verzeichnisstruktur.
Ordnerstruktur festlegen
Gulp ist flexibel genug, um mit jeder Ordnerstruktur zu arbeiten. Sie müssen nur die inneren Abläufe verstehen, bevor Sie sie für Ihr Projekt anpassen.
Für diesen Artikel verwenden wir die Struktur einer generischen Webanwendung:
|- app/
|- css/
|- fonts/
|- images/
|- index.html
|- js/
|- scss/
|- dist/
|- gulpfile.js
|- node_modules/
|- package.json
In dieser Struktur verwenden wir den Ordner app für Entwicklungszwecke, während der Ordner dist (von „distribution“) optimierte Dateien für die Produktions-Website enthält.
Da app für Entwicklungszwecke verwendet wird, wird unser gesamter Code in app abgelegt.
Wir müssen diese Ordnerstruktur im Hinterkopf behalten, wenn wir an unseren Gulp-Konfigurationen arbeiten. Beginnen wir nun mit der Erstellung Ihrer ersten Gulp-Aufgabe in gulpfile.js, die alle Gulp-Konfigurationen speichert.
Ihre erste Gulp-Aufgabe schreiben
Der erste Schritt zur Verwendung von Gulp besteht darin, es im gulpfile zu requiren.
var gulp = require('gulp');
Die Anweisung require weist Node an, im Ordner node_modules nach einem Paket namens gulp zu suchen. Sobald das Paket gefunden wurde, weisen wir seinen Inhalt der Variablen gulp zu.
Wir können nun mit dieser gulp-Variable eine Gulp-Aufgabe schreiben. Die grundlegende Syntax einer Gulp-Aufgabe lautet:
gulp.task('task-name', async function() {
// Stuff here
});
task-name bezieht sich auf den Namen der Aufgabe, die immer dann verwendet wird, wenn Sie eine Aufgabe in Gulp ausführen möchten. Sie können dieselbe Aufgabe auch in der Befehlszeile ausführen, indem Sie gulp task-name eingeben.
Um es auszuprobieren, erstellen wir eine hello-Aufgabe, die Hello Zell! ausgibt.
gulp.task('hello', async function() {
console.log('Hello Zell');
});
Wir können diese Aufgabe mit gulp hello in der Befehlszeile ausführen.
$ gulp hello
Die Befehlszeile gibt ein Protokoll mit der Meldung Hello Zell! zurück.

Gulp-Aufgaben sind normalerweise etwas komplexer als das. Sie enthalten normalerweise zwei zusätzliche Gulp-Methoden sowie eine Vielzahl von Gulp-Plugins.
So könnte eine echte Aufgabe aussehen:
gulp.task('task-name', async function () {
return gulp.src('source-files') // Get source files with gulp.src
.pipe(aGulpPlugin()) // Sends it through a gulp plugin
.pipe(gulp.dest('destination')) // Outputs the file in the destination folder
})
Wie Sie sehen können, verwendet eine echte Aufgabe zwei zusätzliche Gulp-Methoden – gulp.src und gulp.dest.
gulp.src teilt der Gulp-Aufgabe mit, welche Dateien für die Aufgabe verwendet werden sollen, während gulp.dest Gulp mitteilt, wohin die Dateien ausgegeben werden sollen, sobald die Aufgabe abgeschlossen ist.
Versuchen wir, eine echte Aufgabe zu erstellen, bei der wir Sass-Dateien in CSS-Dateien kompilieren.
Präprozessieren mit Gulp
Wir können Sass mit Hilfe eines Plugins namens gulp-sass in Gulp in CSS kompilieren. Sie können gulp-sass in Ihr Projekt installieren, indem Sie den Befehl npm install verwenden, wie wir es für gulp getan haben.
Wir möchten auch das Flag --save-dev verwenden, um sicherzustellen, dass gulp-sass zu devDependencies in package.json hinzugefügt wird.
$ npm install gulp-sass --save-dev
Wir müssen gulp-sass aus dem Ordner node_modules requiren, genau wie wir es mit gulp getan haben, bevor wir das Plugin verwenden können.
var gulp = require('gulp');
// Requires the gulp-sass plugin
var sass = require('gulp-sass');
Wir können gulp-sass verwenden, indem wir aGulpPlugin() durch sass() ersetzen. Da die Aufgabe Sass in CSS kompilieren soll, nennen wir sie sass.
gulp.task('sass', async function(){
return gulp.src('source-files')
.pipe(sass()) // Using gulp-sass
.pipe(gulp.dest('destination'))
});
Wir müssen der sass-Aufgabe Quelldateien und ein Ziel zuweisen, damit die Aufgabe funktioniert. Erstellen wir also eine Datei styles.scss im Ordner app/scss. Diese Datei wird der sass-Aufgabe in gulp.src hinzugefügt.
Wir möchten die endgültige Datei styles.css in den Ordner app/css ausgeben, der das destination für gulp.dest wäre.
gulp.task('sass', async function(){
return gulp.src('app/scss/styles.scss')
.pipe(sass()) // Converts Sass to CSS with gulp-sass
.pipe(gulp.dest('app/css'))
});
Wir möchten testen, ob die sass-Aufgabe wie gewünscht funktioniert. Dazu können wir eine Sass-Funktion in styles.scss hinzufügen.
// styles.scss
.testing {
width: percentage(5/7);
}
Wenn Sie gulp sass in der Befehlszeile ausführen, sollten Sie jetzt sehen können, dass eine Datei styles.css in app/css erstellt wurde. Außerdem enthält sie den Code, bei dem percentage(5/7) zu 71.42857% ausgewertet wurde.
/* styles.css */
.testing {
width: 71.42857%;
}
So wissen wir, dass die sass-Aufgabe funktioniert!
Manchmal müssen wir mehr als eine .scss-Datei gleichzeitig in CSS kompilieren. Dies können wir mit Hilfe von Node-Globs tun.
Globbing in Node
Globs sind Suchmuster für Dateien, die es Ihnen ermöglichen, mehr als eine Datei in gulp.src hinzuzufügen. Es ist wie reguläre Ausdrücke, aber speziell für Dateipfade.
Wenn Sie einen Glob verwenden, überprüft der Computer Dateinamen und Pfade auf das angegebene Muster. Wenn das Muster vorhanden ist, wird eine Datei abgeglichen.
Die meisten Workflows mit Gulp erfordern in der Regel nur 4 verschiedene Globbing-Muster:
*.scss: Das Muster*ist ein Platzhalter, der mit jedem Muster im aktuellen Verzeichnis übereinstimmt. In diesem Fall gleichen wir alle Dateien ab, die mit.scssim Stammordner (project) enden.**/*.scss: Dies ist eine extremere Version des Musters*, die mit jeder Datei übereinstimmt, die mit.scssim Stammordner und in allen untergeordneten Verzeichnissen endet.!not-me.scss: Das!zeigt an, dass Gulp das Muster von seinen Übereinstimmungen ausschließen soll, was nützlich ist, wenn Sie eine Datei von einem übereinstimmenden Muster ausschließen mussten. In diesem Fall würdenot-me.scssvon der Übereinstimmung ausgeschlossen.*.+(scss|sass): Das Plus+und die Klammern()ermöglichen es Gulp, mehrere Muster abzugleichen, wobei die verschiedenen Muster durch das Pipe-Zeichen|getrennt sind. In diesem Fall gleicht Gulp alle Dateien ab, die mit.scssoder.sassim Stammordner enden.
Da wir jetzt Globbing kennen, können wir app/scss/styles.scss durch ein scss/**/*.scss-Muster ersetzen, das mit jeder Datei mit der Erweiterung .scss in app/scss oder einem untergeordneten Verzeichnis übereinstimmt.
gulp.task('sass', async function() {
return gulp.src('app/scss/**/*.scss') // Gets all files ending with .scss in app/scss and children dirs
.pipe(sass())
.pipe(gulp.dest('app/css'))
})
Jede andere Sass-Datei, die in app/scss gefunden wird, würde mit dieser Änderung automatisch in die sass-Aufgabe aufgenommen. Wenn Sie eine Datei print.scss zum Projekt hinzufügen, sehen Sie, dass print.css in app/css generiert wird.

Wir haben es jetzt geschafft, alle Sass-Dateien mit einem einzigen Befehl in CSS-Dateien zu kompilieren. Die Frage ist, was nützt es, wenn wir jedes Mal, wenn wir Sass in CSS kompilieren möchten, gulp sass manuell ausführen müssen?
Glücklicherweise können wir Gulp anweisen, die sass-Aufgabe automatisch auszuführen, wenn eine Datei gespeichert wird, durch einen Prozess namens „Watching“.
Auf Änderungen von Sass-Dateien achten
Hinweis! Gulp Watch hat sich von 3.x zu 4.x stark verändert. Siehe die Dokumentation.
Gulp bietet uns eine watch-Methode, die überprüft, ob eine Datei gespeichert wurde. Die Syntax für die watch-Methode lautet:
// Gulp 3.x watch syntax
gulp.watch('files-to-watch', ['tasks', 'to', 'run']);
// NOTE! Gulp 4.x watch syntax (all the rest of the examples would need to be like this for Gulp 4
gulp.watch('files-to-watch', gulp.series(['tasks', 'to', 'run']));
Wenn wir alle Sass-Dateien beobachten und die sass-Aufgabe ausführen möchten, wenn eine Sass-Datei gespeichert wird, müssen wir files-to-watch nur durch app/scss/**/*.scss und ['tasks', 'to', 'run'] durch ['sass'] ersetzen:
// Gulp watch syntax
gulp.watch('app/scss/**/*.scss', ['sass']);
Häufiger möchten wir jedoch mehrere Dateitypen gleichzeitig beobachten. Dazu können wir mehrere Watch-Prozesse zu einer watch-Aufgabe gruppieren:
gulp.task('watch', async function(){
gulp.watch('app/scss/**/*.scss', ['sass']);
// Other watchers
})
Wenn Sie den Befehl gulp watch jetzt ausführen, sehen Sie, dass Gulp sofort mit dem Beobachten beginnt.

Und dass es die sass-Aufgabe automatisch ausführt, wenn Sie eine .scss-Datei speichern.

Gehen wir noch einen Schritt weiter und lassen Gulp den Browser neu laden, wenn wir eine .scss-Datei speichern, mithilfe von Browser Sync.
Live-Neuladen mit Browser Sync
Browser Sync erleichtert die Webentwicklung, indem es einen Webserver startet, der uns beim Live-Neuladen hilft. Es hat auch andere Funktionen, wie z. B. das Synchronisieren von Aktionen auf mehreren Geräten.
Wir müssen zuerst Browser Sync installieren:
$ npm install browser-sync --save-dev
Möglicherweise ist Ihnen aufgefallen, dass es kein gulp--Präfix gibt, wenn wir Browser Sync installieren. Das liegt daran, dass Browser Sync mit Gulp funktioniert, sodass wir kein Plugin verwenden müssen.
Um Browser Sync zu verwenden, müssen wir Browser Sync requiren.
var browserSync = require('browser-sync').create();
Wir müssen eine browserSync-Aufgabe erstellen, damit Gulp einen Server mit Browser Sync starten kann. Da wir einen Server betreiben, müssen wir Browser Sync mitteilen, wo sich der Stammordner des Servers befinden soll. In unserem Fall ist es der Ordner app:
gulp.task('browserSync', async function() {
browserSync.init({
server: {
baseDir: 'app'
},
})
})
Wir müssen auch unsere sass-Aufgabe geringfügig ändern, damit Browser Sync neue CSS-Stile in den Browser injizieren (das CSS aktualisieren) kann, wenn die sass-Aufgabe ausgeführt wird.
gulp.task('sass', async function() {
return gulp.src('app/scss/**/*.scss') // Gets all files ending with .scss in app/scss
.pipe(sass())
.pipe(gulp.dest('app/css'))
.pipe(browserSync.reload({
stream: true
}))
});
Wir sind mit der Konfiguration von Browser Sync fertig. Jetzt müssen wir sowohl die watch- als auch die browserSync-Aufgabe gleichzeitig ausführen, damit das Live-Neuladen stattfindet.
Es wäre umständlich, zwei Befehlszeilenfenster zu öffnen und gulp browserSync und gulp watch separat auszuführen. Lassen wir Gulp sie also zusammen ausführen, indem wir der watch-Aufgabe mitteilen, dass browserSync abgeschlossen sein muss, bevor watch ausgeführt werden darf.
Wir können dies tun, indem wir der watch-Aufgabe ein zweites Argument hinzufügen. Die Syntax lautet:
gulp.task('watch', ['array', 'of', 'tasks', 'to', 'complete','before', 'watch'], async function (){
// ...
})
Und in diesem Fall fügen wir die browserSync-Aufgabe hinzu.
gulp.task('watch', ['browserSync'], async function (){
gulp.watch('app/scss/**/*.scss', ['sass']);
// Other watchers
})
Wir möchten auch sicherstellen, dass sass vor watch ausgeführt wird, damit das CSS bereits das neueste ist, wenn wir einen Gulp-Befehl ausführen.
gulp.task('watch', ['browserSync', 'sass'], async function (){
gulp.watch('app/scss/**/*.scss', ['sass']);
// Other watchers
});
Wenn Sie nun gulp watch in der Befehlszeile ausführen, sollte Gulp sowohl die sass- als auch die browserSync-Aufgabe gleichzeitig starten. Wenn beide Aufgaben abgeschlossen sind, wird watch ausgeführt.

Gleichzeitig sollte ein Browserfenster geöffnet werden, das auf app/index.html verweist. Wenn Sie die Datei styles.scss ändern, sehen Sie, dass der Browser automatisch neu geladen wird.

Es gibt noch eine Sache, bevor wir diesen Abschnitt zum Live-Neuladen beenden. Da wir bereits auf .scss-Dateien achten, um neu zu laden, warum nicht einen Schritt weiter gehen und den Browser neu laden, wenn eine HTML- oder JavaScript-Datei gespeichert wird?
Wir können dies tun, indem wir zwei weitere Watch-Prozesse hinzufügen und die Funktion browserSync.reload aufrufen, wenn eine Datei gespeichert wird:
gulp.task('watch', ['browserSync', 'sass'], async function (){
gulp.watch('app/scss/**/*.scss', ['sass']);
// Reloads the browser whenever HTML or JS files change
gulp.watch('app/*.html', browserSync.reload);
gulp.watch('app/js/**/*.js', browserSync.reload);
});
Bisher haben wir in diesem Tutorial drei Dinge erledigt:
- Starten eines Webservers für die Entwicklung
- Verwenden des Sass-Präprozessors
- Neuladen des Browsers, wenn eine Datei gespeichert wird
Gehen wir im nächsten Abschnitt auf die Optimierung von Assets ein. Wir beginnen mit der Optimierung von CSS- und JavaScript-Dateien.
CSS- und JavaScript-Dateien optimieren
Entwickler müssen zwei Aufgaben ausführen, wenn wir versuchen, CSS- und JavaScript-Dateien für die Produktion zu optimieren: Minifizierung und Verkettung.
Ein Problem, mit dem Entwickler bei der Automatisierung dieses Prozesses konfrontiert sind, ist die Schwierigkeit, ihre Skripte in der richtigen Reihenfolge zu verketten.
Angenommen, wir haben 3 Skript-Tags in index.html eingefügt.
<script src="js/lib/a-library.js"></script>
<script src="js/lib/another-library.js"></script>
<script src="js/main.js"></script>
Diese Skripte befinden sich in zwei verschiedenen Verzeichnissen. Es wird schwierig sein, sie mit herkömmlichen Plugins wie gulp-concatenate zu verketten.
Glücklicherweise gibt es ein nützliches Gulp-Plugin, gulp-useref, das dieses Problem löst.
Gulp-useref verkettet beliebig viele CSS- und JavaScript-Dateien in eine einzige Datei, indem es nach einem Kommentar sucht, der mit „<!--build:“ beginnt und mit „<!--endbuild-->“ endet. Die Syntax lautet:
... HTML Markup, list of script / link tags.
kann entweder js, css oder remove sein. Es ist am besten, type auf den Dateityp einzustellen, den Sie verketten möchten. Wenn Sie type auf remove einstellen, entfernt Gulp den gesamten Build-Block, ohne eine Datei zu generieren.
bezieht sich hier auf den Zielpfad der generierten Datei.
Wir möchten, dass die endgültige JavaScript-Datei im Ordner js als main.min.js generiert wird. Daher lautet das Markup:
<script src="js/lib/a-library.js"></script>
<script src="js/lib/another-library.js"></script>
<script src="js/main.js"></script>
Konfigurieren wir nun das gulp-useref-Plugin im gulpfile. Wir müssen das Plugin installieren und im gulpfile anfordern.
$ npm install gulp-useref --save-dev
var useref = require('gulp-useref');
Das Einrichten der useref-Aufgabe ähnelt den anderen Aufgaben, die wir bisher erledigt haben. Hier ist der Code:
gulp.task('useref', async function(){
return gulp.src('app/*.html')
.pipe(useref())
.pipe(gulp.dest('dist'))
});
Wenn Sie diese useref-Aufgabe jetzt ausführen, durchläuft Gulp die 3 Skript-Tags und verkettet sie zu dist/js/main.min.js.

Die Datei ist derzeit jedoch nicht minifiziert. Wir müssen das Plugin gulp-uglify verwenden, um JavaScript-Dateien zu minifizieren. Wir benötigen auch ein zweites Plugin namens gulp-if, um sicherzustellen, dass wir nur versuchen, JavaScript-Dateien zu minifizieren.
$ npm install gulp-uglify --save-dev
// Other requires...
var uglify = require('gulp-uglify');
var gulpIf = require('gulp-if');
gulp.task('useref', function(){
return gulp.src('app/*.html')
.pipe(useref())
// Minifies only if it's a JavaScript file
.pipe(gulpIf('*.js', uglify()))
.pipe(gulp.dest('dist'))
});
Gulp sollte jetzt automatisch die Datei main.min.js minifizieren, wenn Sie die useref-Aufgabe ausführen.
Eine tolle Sache, die ich noch nicht über Gulp-useref verraten habe, ist, dass es automatisch alle Skripte innerhalb von „<!--build:“ und „<!--endbuild-->“ in eine einzige JavaScript-Datei ändert, die auf js/main.min.js verweist.

Wunderbar, nicht wahr?
Wir können dieselbe Methode auch verwenden, um CSS-Dateien zu verketten (wenn Sie sich entschieden haben, mehr als eine hinzuzufügen). Wir folgen demselben Prozess und fügen einen build-Kommentar hinzu.
Wir können auch die verkettete CSS-Datei minifizieren. Wir müssen ein Paket namens gulp-cssnano verwenden, um uns bei der Minifizierung zu helfen.
$ npm install gulp-cssnano
var cssnano = require('gulp-cssnano');
gulp.task('useref', async function(){
return gulp.src('app/*.html')
.pipe(useref())
.pipe(gulpIf('*.js', uglify()))
// Minifies only if it's a CSS file
.pipe(gulpIf('*.css', cssnano()))
.pipe(gulp.dest('dist'))
});
Jetzt erhalten Sie eine optimierte CSS-Datei und eine optimierte JavaScript-Datei, wenn Sie die useref-Aufgabe ausführen.
Fahren wir nun fort und optimieren als Nächstes Bilder.
Bilder optimieren
Sie haben es wahrscheinlich schon erraten: Wir müssen gulp-imagemin verwenden, um uns bei der Optimierung von Bildern zu helfen.
$ npm install gulp-imagemin --save-dev
var imagemin = require('gulp-imagemin');
Wir können png, jpg, gif und sogar svg mit Hilfe von gulp-imagemin minifizieren. Erstellen wir eine images-Aufgabe für diesen Optimierungsprozess.
gulp.task('images', async function(){
return gulp.src('app/images/**/*.+(png|jpg|gif|svg)')
.pipe(imagemin())
.pipe(gulp.dest('dist/images'))
});
Da verschiedene Dateitypen unterschiedlich optimiert werden können, möchten Sie möglicherweise Optionen zu imagemin hinzufügen, um anzupassen, wie jede Datei optimiert wird.
Sie können beispielsweise interlaced GIFs erstellen, indem Sie den Optionsschlüssel interlaced auf true setzen.
gulp.task('images', async function(){
return gulp.src('app/images/**/*.+(png|jpg|jpeg|gif|svg)')
.pipe(imagemin({
// Setting interlaced to true
interlaced: true
}))
.pipe(gulp.dest('dist/images'))
});
Sie können auch mit anderen Optionen spielen, wenn Sie möchten.
Die Optimierung von Bildern ist jedoch ein extrem langsamer Prozess, den Sie nicht unnötig wiederholen möchten. Dazu können wir das Plugin gulp-cache verwenden.
$ npm install gulp-cache --save-dev
var cache = require('gulp-cache');
gulp.task('images', async function(){
return gulp.src('app/images/**/*.+(png|jpg|jpeg|gif|svg)')
// Caching images that ran through imagemin
.pipe(cache(imagemin({
interlaced: true
})))
.pipe(gulp.dest('dist/images'))
});
Wir sind fast fertig mit dem Optimierungsprozess. Es gibt noch einen Ordner, den wir aus dem Verzeichnis app in dist übertragen müssen, das Schriftarten-Verzeichnis. Tun wir das jetzt.
Schriftarten nach Dist kopieren
Da Schriftartdateien bereits optimiert sind, müssen wir nichts weiter tun. Wir müssen die Schriftarten nur in dist kopieren.
Wir können Dateien mit Gulp kopieren, indem wir einfach gulp.src und gulp.dest ohne Plugins angeben.
gulp.task('fonts', async function() {
return gulp.src('app/fonts/**/*')
.pipe(gulp.dest('dist/fonts'))
})
Jetzt kopiert Gulp fonts von app nach dist, wenn Sie gulp fonts ausführen.

Wir haben jetzt 6 verschiedene Aufgaben im Gulpfile, und jede von ihnen muss einzeln über die Befehlszeile aufgerufen werden, was etwas umständlich ist, also möchten wir alles zu einem einzigen Befehl zusammenfassen.
Bevor wir das tun, sehen wir uns an, wie man generierte Dateien automatisch bereinigt.
Generierte Dateien automatisch bereinigen
Da wir Dateien automatisch generieren, möchten wir sicherstellen, dass nicht mehr verwendete Dateien nirgendwo verbleiben, ohne dass wir es wissen.
Dieser Prozess wird als Bereinigen (oder einfacher ausgedrückt, Löschen von Dateien) bezeichnet.
Wir müssen del verwenden, um uns beim Bereinigen zu helfen.
npm install del --save-dev
var del = require('del');
Die Funktion del verwendet ein Array von Node-Globs, das ihr mitteilt, welche Ordner gelöscht werden sollen.
Die Einrichtung mit einer Gulp-Aufgabe ähnelt fast dem ersten „hello“-Beispiel, das wir hatten.
gulp.task('clean:dist', async function() {
return del.sync('dist');
})
Jetzt löscht Gulp den Ordner dist für Sie, wenn gulp clean:dist ausgeführt wird.
Hinweis: Wir müssen uns keine Sorgen um das Löschen des Ordners dist/images machen, da gulp-cache die Caches der Bilder bereits auf Ihrem lokalen System gespeichert hat.
Um die Caches von Ihrem lokalen System zu löschen, können Sie eine separate Aufgabe namens cache:clear erstellen:
gulp.task(‘cache:clear’, async function (callback) {
return cache.clearAll(callback)
})
Puh, das war eine Menge. Kombinieren wir nun alle unsere Aufgaben!
Gulp-Aufgaben kombinieren
Fassen wir zusammen, was wir getan haben. Bisher haben wir zwei verschiedene Sätze von Gulp-Aufgaben erstellt.
Der erste Satz ist für einen Entwicklungsprozess, bei dem wir Sass zu CSS kompiliert, auf Änderungen geachtet und den Browser entsprechend neu geladen haben.
Der zweite Satz ist für einen Optimierungsprozess, bei dem wir alle Dateien für die Produktions-Website vorbereiten. Wir haben Assets wie CSS, JavaScript und Bilder in diesem Prozess optimiert und Schriftarten von app nach dist kopiert.
Wir haben den ersten Satz von Aufgaben bereits zu einem einfachen Workflow mit dem Befehl gulp watch zusammengefasst:
gulp.task('watch', ['browserSync', 'sass'], function (){
// ... watchers
})
Der zweite Satz besteht aus Aufgaben, die wir ausführen müssen, um die Produktions-Website zu erstellen. Dazu gehören clean:dist, sass, useref, images und fonts.
Wenn wir derselben Logik folgen würden, könnten wir eine build-Aufgabe erstellen, um alles zusammenzufassen:
gulp.task('build', [`clean`, `sass`, `useref`, `images`, `fonts`], async function (){
console.log('Building files');
})
Leider könnten wir die build-Aufgabe nicht auf diese Weise schreiben, da Gulp alle Aufgaben im zweiten Argument gleichzeitig aktiviert.
Es besteht die Möglichkeit, dass useref, images oder sogar fonts abgeschlossen wird, bevor clean dies tut, was bedeutet, dass der gesamte Ordner dist gelöscht wird.
Um sicherzustellen, dass das Bereinigen vor dem Rest der Aufgaben abgeschlossen ist, müssen wir ein zusätzliches Plugin namens Run Sequence verwenden.
$ npm install run-sequence --save-dev
Hier ist die Syntax einer Aufgabenfolge mit Run Sequence:
var runSequence = require('run-sequence');
gulp.task('task-name', async function(callback) {
runSequence('task-one', 'task-two', 'task-three', callback);
});
Wenn task-name aufgerufen wird, führt Gulp zuerst task-one aus. Wenn task-one beendet ist, startet Gulp automatisch task-two. Wenn task-two abgeschlossen ist, führt Gulp schließlich task-three aus.
Run Sequence ermöglicht es Ihnen auch, Aufgaben gleichzeitig auszuführen, wenn Sie sie in einem Array platzieren:
gulp.task('task-name', async function(callback) {
runSequence('task-one', ['tasks','two','run','in','parallel'], 'task-three', callback);
});
In diesem Fall führt Gulp zuerst task-one aus. Wenn task-one abgeschlossen ist, führt Gulp jede Aufgabe im zweiten Argument gleichzeitig aus. Alle Aufgaben in diesem zweiten Argument müssen abgeschlossen sein, bevor task-three ausgeführt wird.
Wir können jetzt eine Aufgabe erstellen, die sicherstellt, dass clean:dist zuerst ausgeführt wird, gefolgt von allen anderen Aufgaben:
gulp.task('build', async function (callback) {
runSequence('clean:dist',
['sass', 'useref', 'images', 'fonts'],
callback
)
})
Um konsistent zu sein, können wir dieselbe Sequenz auch mit der ersten Gruppe erstellen. Verwenden wir dieses Mal default als Aufgabennamen:
gulp.task('default', async function (callback) {
runSequence(['sass','browserSync', 'watch'],
callback
)
})
Warum default? Denn wenn Sie eine Aufgabe namens default haben, können Sie sie einfach ausführen, indem Sie den Befehl gulp eingeben, was einige Tastenanschläge spart.
Schließlich, hier ist ein GitHub-Repo für all unsere Arbeit!
Zusammenfassung
Wir haben die absoluten Grundlagen von Gulp durchgearbeitet und einen Workflow erstellt, der Sass in CSS kompilieren kann, während er gleichzeitig HTML- und JS-Dateien auf Änderungen überwacht. Wir können diese Aufgabe mit dem Befehl gulp in der Befehlszeile ausführen.
Wir haben auch eine zweite Aufgabe, build, erstellt, die einen Ordner dist für die Produktions-Website erstellt. Wir haben Sass in CSS kompiliert, alle unsere Assets optimiert und die notwendigen Ordner in den Ordner dist kopiert. Um diese Aufgabe auszuführen, müssen wir nur gulp build in die Befehlszeile eingeben.
Zuletzt haben wir eine clean-Aufgabe, die alle erstellten Bild-Caches aus dem generierten dist-Ordner entfernt, sodass wir alle alten Dateien entfernen können, die versehentlich in dist aufbewahrt wurden.
Wir haben bisher einen robusten Workflow erstellt, der für die meisten Webentwickler ausreichend ist. Es gibt noch viel mehr über Gulp und Workflows zu entdecken, um diesen Prozess noch besser zu machen. Hier sind einige Ideen für Sie:
Für die Entwicklung:
- Verwenden von Autoprefixer, um anbieterfreien CSS-Code zu schreiben
- Hinzufügen von Sourcemaps für einfacheres Debuggen
- Erstellen von Sprites mit sprity
- Kompilieren nur geänderter Dateien mit gulp-changed
- Schreiben von ES6 mit Babel oder Traceur
- Modularisieren von Javascript-Dateien mit Browserify, webpack oder jspm
- Modularisieren von HTML mit Template-Engines wie Handlebars oder Swig
- Aufteilen des gulpfile in kleinere Dateien mit require-dir
- Automatisches Generieren eines Modernizr-Skripts mit gulp-modernizr
Für die Optimierung:
- Entfernen von ungenutztem CSS mit unCSS
- Weitere Optimierung von CSS mit CSSO
- Generieren von Inline-CSS für die Leistung mit Critical
Zusätzlich zu Entwicklungs- oder Optimierungsprozessen können Sie auch JavaScript-Unit-Tests mit gulp-jasmine schreiben und Ihren Ordner dist sogar automatisch mit gulp-rync auf Ihrem Produktionsserver bereitstellen.
Wie Sie sehen, kann noch viel mehr getan werden, auch wenn der von uns erstellte Workflow bereits einiges leistet. Die Erstellung eines Workflows, der Ihren Anforderungen entspricht, kann äußerst spannend und erfüllend sein, aber es kann viel zu verarbeiten sein, wenn Sie neu darin sind.
Es gibt so viel mehr über Gulp zu sagen, dass es unmöglich ist, es in diesem Blogbeitrag oder sogar in einer Reihe von Beiträgen abzudecken. Aus diesem Grund habe ich ein Buch über die Automatisierung Ihres Workflows geschrieben, und ich lade Sie ein, zehn Kapitel kostenlos herunterzuladen, wenn Sie mehr erfahren möchten :)
Lassen Sie mich in den Kommentaren unten wissen, was Sie von diesem Artikel halten! Oh ja, zögern Sie nicht, mich zu kontaktieren, wenn Sie Fragen zum Workflow haben. Ich antworte gerne!
Wie ich auf Zells Blog erwähnt habe, kann die Verwendung von 'sudo' zum Installieren globaler Pakete über npm gefährlich sein. Ich habe kürzlich einen Blogbeitrag darüber veröffentlicht:
http://studiorgb.uk/fix-priviliges-and-never-again-use-sudo-with-npm/
Dieselbe Lösung ist auf der npm-Website zu finden:
https://docs.npmjs.com/getting-started/fixing-npm-permissions
Cool. Danke, dass du darauf hingewiesen hast (schon wieder) :)
Hey! Ich liebe dieses Tutorial und ich plane, bald meinen eigenen Gulp-Workflow zu erstellen. Ich habe eine kurze Frage zur Browsersync-Watch-Funktion. Wenn ich an einem WordPress-Projekt arbeite, müsste ich auf Änderungen in meinen .php-Dateien achten, oder? Würde ich dies ändern:
gulp.watch(‘app/.html’, browserSync.reload);
zu diesem?:
gulp.watch(‘app/.php’, browserSync.reload);
Ich kann es kaum erwarten, mit Gulp zu beginnen :)
Ja, das ist richtig.
Es gibt noch eine Sache. Wenn Sie WordPress verwenden, verwenden Sie wahrscheinlich MAMP als Server, daher müssen Sie browserSync mit dem Schlüssel
proxyauf Ihren Server verweisen. Weitere Informationen finden Sie in den kostenlosen Musterkapiteln meines Buches :)Toller Artikel – viele nützliche Informationen, die so präsentiert werden, dass sie für Anfänger und erfahrene Entwickler gleichermaßen verständlich sein sollten.
Mir ist aufgefallen, dass Sie in den ersten paar Beispielen (z. B. den Sass-Sachen) nichts aus der
gulp-Aufgabe zurückgeben und das Callback-Argument nicht aufrufen. Indem Sie keines dieser beiden Dinge tun, weißgulpnicht, wann die Aufgabe wirklich abgeschlossen ist, was nicht gut ist, wenn sie als Abhängigkeit einer anderen Aufgabe verwendet wird.Im Allgemeinen sollten Sie immer einen Stream (oder Promise) zurückgeben oder das Callback-Argument aufrufen. Siehe Hinweise in der
gulp-Dokumentation.Mir ist auch aufgefallen, dass Sie
runSequenceverwenden, was normalerweise nicht notwendig ist (tatsächlich ist laut Autor das Ganze ein temporärer Hack). Für einen Anfänger ist es besonders wichtig zu verstehen, dassgulp-Aufgaben nur normale JavaScript-Funktionen sind. Sie können sie wie jede andere JavaScript-Funktion zusammensetzen:Das Wichtigste, woran man sich erinnern sollte, ist, wie bereits erwähnt, asynchrone Aufgaben richtig zu behandeln.
Eine weitere Überlegung ist die Organisation Ihrer gulpfile.js, insbesondere über verschiedene Projekte hinweg. Es ist möglich, Ihr eigenes npm-Paket zu erstellen, damit Sie Ihre gulpfile.js an einem zentralen Ort verwalten können, anstatt sie jedes Mal zu kopieren und einzufügen. Das haben wir mit unserer Asset-Pipeline gemacht, die als gutes Beispiel dienen kann, wenn Sie daran interessiert sind, Ihre eigene einzurichten. Ein weiteres großartiges Beispiel ist Laravel's Elixir.
Woot. Danke Agop.
Die Returns vergessen. Ich kontaktiere Chris, um es jetzt zu korrigieren.
Ja, ich verstehe, dass es ein Hack ist, aber es ist so viel einfacher als das asynchrone Beispiel, das du gerade geschrieben hast. Außerdem werden sie, wenn Gulp 4 herauskommt, eine ähnliche Syntax verwenden. Meiner Meinung nach schadet es nicht allzu sehr :)
Tolle Idee, NPM-Pakete für synchronisierte Gulpfiles zu veröffentlichen. Wunderbare Sache, an die ich nicht gedacht habe! Danke! :)
Vielen Dank für den Artikel. Er erklärt Gulp klar, ohne es mit seinem Konkurrenten Grunt zu vergleichen. Ich habe eine Frage. Warum wird Callback in einigen Aufgabenfunktionen verwendet und wie verwende ich task:varianttask? Ich bin neu bei Gulp.
Das Callback wird verwendet, um gulp.js mitzuteilen, dass die Aufgabe erledigt ist. Dies ist wichtig für asynchrone Aufgaben, die über die Dauer der Aufgabenfunktionen selbst hinausgehen können. Siehe die gulp.js-Dokumentation zu asynchronen Aufgaben.
taskundtask:subTasksind beides nur Aufgaben-Identifikatoren (der Doppelpunkt bedeutet nichts für gulp.js). Manche Leute verwenden gerne einen Doppelpunkt, um Aufgaben mit verwandten Aufgaben zu gruppieren.Genau richtig! Danke Agop
KEIN SUDO!! Sie sollten keine Root-Berechtigungen benötigen, um Benutzer-Software zu installieren. Hier ist ein Skript zum Deinstallieren von node und Neuinstallieren. Es ist sehr einfach und macht sudo überflüssig:
https://github.com/brock/node-reinstall
Toller Artikel! Gulp ist ein super nützliches Tool und ich denke, es ist viel schneller als Grunt.
Genau, Kumpel! Ich habe das oben auch erwähnt. Ich habe auch einen Beitrag darüber auf meinem Blog veröffentlicht: http://studiorgb.uk/fix-priviliges-and-never-again-use-sudo-with-npm/
Toller Artikel. Ich habe gerade gestern mein erstes gulpfile erstellt und dieser Artikel hat viele Dinge abgedeckt, die ich durch Herumsuchen bei Google gelernt habe. Haha. Vielen Dank für das Schreiben. Es hat mir einige gute Ideen für weitere Optimierungen gegeben. Ich kannte Grunt bereits, aber Gulp gefällt mir besser.
Gern geschehen. Ich bevorzuge Gulp auch, nachdem ich damit herumgespielt habe.
Vielleicht wiederhole ich mich, aber ja, wenn Homebrew installiert ist, ist kein sudo für npm -g-Installationen erforderlich. Ich bin ein Vollzeit-Grunt-Benutzer, aber ich schätze es, dass Sie Gulp ausführlich behandeln, falls ich in einem Projekt lande, das es im Build-Prozess verwendet. Gut gemacht!
Es sieht so aus, als gäbe es einen Tippfehler.
Die Struktur einer Webanwendung ist „app/scss“. Aber die Aufgabe ist „gulp.src('app/sass/styles.scss')“.
Wie auch immer, Sie haben großartige Arbeit geleistet. Vielen Dank!
Danke für das Entdecken, Sasha.
Hey Zell... Fantastischer Artikel... Fühlt sich an, als würde jemand neben mir sitzen und alle Details erklären... Folge dir auf Twitter!
Fantastisch! Vielleicht möchten Sie sich auch die 10 Kapitel meines Buches kostenlos ansehen. :)
Dieser Artikel ist so erstaunlich, dass es überwältigend ist O_O.
Danke fürs Schreiben.
Gern geschehen. :)
Sie könnten das automatische Laden der Gulp-Plugins hinzufügen, was sehr praktisch ist :D
Ich bin mir nicht sicher, ob ich etwas falsch gemacht habe, aber 'gulp build' gibt mir Folgendes aus:
Ansonsten ein großartiger Artikel, definitiv gut, mehr über Gulp zu erfahren :)
Hey, ich habe herausgefunden, dass
deleine breaking change (v2.0) hatte, nachdem ich diesen Artikel geschrieben hatte. Sie müssen stattdessen v1.2.1 installieren, anstatt die neueste Version von del mit diesem Befehl:Dann sollte alles funktionieren.
Vielen Dank für ein tolles Tutorial. Für mich haben Sie fast alles abgedeckt, was ich brauche :)
Seltsam, alles hat bis zur Aufgabe 'clean:dist' funktioniert. Wenn ich 'gulp clean:dist' ausführe, startet es die Aufgabe immer, aber beendet sie nie. Konsequenz: Die 'build'-Aufgabe funktioniert auch nicht.
Wenn ich Ihre Version von GitHub klone und die Aufgabe ausführe, funktioniert sie. Wenn ich Ihre gulpfile.js in meine Lösung kopiere, habe ich dasselbe Problem wie ich. Was übersehe ich?
Mein Repo ist unter https://github.com/tomknapen/GulpForBeginners
Können Sie bestätigen, ob das, was Mitranim gesagt hat, wahr ist? Ich habe selbst noch nicht mit gulp 4.0 gespielt, und ich bin mir nicht sicher, wie sehr es den Workflow beeinflusst, den ich hier beschrieben habe. (Wahrscheinlich nur der Run-Sequence-Teil)
Hey, ich habe herausgefunden, dass
deleine breaking change (v2.0) hatte, nachdem ich diesen Artikel geschrieben hatte. Sie müssen stattdessen v1.2.1 installieren, anstatt die neueste Version vondelmit diesem Befehl:Dann sollte alles funktionieren.
Hallo,
Ich kann die Aufgabe 'clean:dist' nicht zum Laufen bringen. Ich habe [email protected] installiert, wie Zell es erwähnt, aber die Aufgabe funktioniert nicht. Wenn ich 'gulp clean:dist' eingebe, löscht es alles im Verzeichnis 'dist', auch den Bilderordner.
Hat es jemand geschafft, das zu lösen?
Danke!
Bernat, haben Sie Ihre Clean-Aufgabe in der von mir erwähnten Reihenfolge angeordnet? Wenn ja, stellen Sie Ihr Repo auf Github ein und senden Sie mir einen Link. Ich werde es mir ansehen.
Hallo Zell,
Hier ist meine gulpfile.js: https://github.com/Zubrik/gulpfile/blob/master/gulpfile.js
Danke.
Gulpfile scheint korrekt zu sein. Senden Sie mir stattdessen einen Link zu Ihrem gesamten Repo? Ich muss es testen.
Sie sollten gulp 4.0 (alpha) und die Drittanbieterbibliothek
gulp-watchanstelle von gulp 3.x undgulp.watchverwenden, wie in diesem Beitrag empfohlen. Gulp 4.0 verfügt über integrierte Methoden zum expliziten sequenziellen oder parallelen Ausführen von Aufgaben, undgulp-watchbemerkt Dateien, die hinzugefügt werden, während das Build-System ausgeführt wird.Das ist großartig, Zell! Als glücklicher Korrekturleser deines Buches über die Automatisierung des Workflows finde ich, dass dieser Artikel eine gute Widerspiegelung des Inhalts deines Buches ist. Klar, präzise und ordentlich :-)
Das ist fantastisch! Eine Frage: Wie kann ich das kompilierte CSS mit gulp sass komprimieren? Ich habe mir die Dokumentation angesehen und es selbst versucht, aber das kompilierte CSS wird nicht komprimiert. So habe ich es versucht:
gulp.task(‘sass’ , function(){
return gulp.src(‘app/scss/style.scss’)
.pipe(sass({
style: ‘compressed’
}))
.pipe(gulp.dest(‘app/’))
.pipe(browserSync.reload({
stream:true
}))
})
Ja, das können Sie. Verwenden Sie
outputStyle: 'compressed'anstelle vonstyle: ‘compressed’.Umfassend und gründlich strukturiert, wie immer, vielen Dank Zell!
Habe ich etwas über gulp-sourcemaps trace verpasst? Löscht del diese lange Abrakadabra-Zeile am Ende der CSS-Datei vor der Minimierung?
Gulp-minify-css entfernt die Sourcemaps-Zeile aus produktionsreifem CSS :)
Fantastisch!! Danke fürs Schreiben.
„Zuerst erstellen wir einen Ordner namens project, der als Stammverzeichnis unseres Projekts dient, während wir dieses Tutorial durchgehen. Führen Sie den Befehl npm init in diesem Verzeichnis aus:“
Woher weiß dieser Bash-Befehl, wo sich der Ordner befindet? Brauchen Sie einen Pfadnamen? Wie Zell betont, verwenden Mac-Benutzer oft MAMP, aber ich kann in Ihrem Tutorial keine Informationen darüber finden, wie man diesen Befehl tatsächlich ausführt…
Holen Sie sich die 10 kostenlosen Kapitel, die ich am Ende des Beitrags bereitgestellt habe. Eines davon befasst sich mit dem Erlernen der Befehlszeile, damit Sie wissen, wie und wo Sie diese Bash-Befehle verwenden können.
Lassen Sie mich wissen, ob Sie nach dem Lesen immer noch Probleme haben.
Wie läuft die Aktualisierung von Plugins, wenn package.json veraltet ist? Ich habe $npm i und $npm i –save-dev ausprobiert. Alle Plugins meiner package.json bleiben die gleiche veraltete Version im Vergleich zu Ihren, etwas neueren…
Ich werde in einem separaten Beitrag darüber sprechen. Sie finden diese Informationen auch am Ende meines Buches.
Verwenden Sie im Grunde
npm updateoder das Paket npm-check-updates.Noch zwei Fragen, bitte:
1) Was macht die Funktion 'sass' in der Aufgabe 'build'? Zu diesem Zeitpunkt sollte alles kompiliert sein, meiner Meinung nach.
2) Sollte ich alle .html-Dateien im Stammordner „app“ haben, damit 'useref' korrekt ausgeführt wird? Kann ich alle .html-Dateien außer index.html in den html-Ordner legen?
Es kann vorkommen, dass Änderungen vorgenommen werden, aber noch nicht kompiliert sind. Das Platzieren von
sassin der Build-Aufgabe stellt sicher, dass es definitiv kompiliert wird.Ja, das können Sie, verwenden Sie einfach die Node-Globs, um es zu bekommen. Sie müssen jedoch vorsichtig mit den Pfaden zu Ihren CSS- und JavaScript-Dateien sein.
Hey, vielen Dank für dieses Tutorial, es war wirklich nützlich!
Ich konnte alles erfolgreich einrichten und eine Aufgabe 'gulp' für alles erstellen. Das einzige, was ich auf der Konsole sehe, ist, dass ich den Build-Prozess, wenn er läuft, nicht über Strg+C stoppen kann, wie ich es bei anderen Gulp-Prozessen getan habe, die ich für andere Projekte verwendet habe. Der Prozess wird gestoppt, aber die Konsole zeigt nur Folgendes an: (^C^C^C^C)
[BS] Serving files from: app
[14:23:39] Finished ‘sass’ after 150 ms
[14:23:39] Starting ‘watch’…
[14:23:39] Finished ‘watch’ after 12 ms
[14:23:39] Finished ‘default’ after 165 ms
^C^C^C^C
Die Sache ist, dass ich, wenn ich das mache, nicht erneut kompilieren kann, es sei denn, ich schließe das Terminal und öffne es erneut. Ich dachte, es hätte mit der runSequence-Aufgabe zu tun. Irgendwelche Ideen? Danke!
Hm, interessant. Das ist das erste Mal, dass ich so etwas sehe. Können Sie mir eine E-Mail mit Ihrem Repo senden, damit ich es mir genauer ansehen kann?
Danke! Ich habe Ihnen gerade eine Nachricht mit meinem Repo über Ihr Kontaktformular gesendet.
Ich verwende Codekit für die meisten dieser Funktionen, aber ich bin bereit, es auszuprobieren! Wenn ich 'endlich' alles zum Laufen bringe, ist es dann einfach, es für die nächsten neuen Projekte wiederzuverwenden?
Ja, das ist es. Sie müssen nur das gulpfile und die package.json-Datei (zusammen mit Ihrer Projektstruktur) duplizieren und dann
npm installausführen.Es gibt einige Plugins, wie 'uncss', um ungenutztes CSS zu löschen. Tolle Idee! Gibt es eine Gewissheit, 'ungenutztes CSS' für HTML beizubehalten, das aber gleichzeitig für .js aktiv ist? Berücksichtigt 'uncss' und ähnliches Links zu .js, um die Nützlichkeit von Stilen zu überprüfen?
Keiner der Autoren hat dies definiert, wie ich sehen kann.
Sie können bestimmte CSS-Dateien ignorieren, wenn Sie uncss verwenden. Ich werde das in einem separaten Blogbeitrag behandeln.
Ich meine bestimmte CSS-Stile.
OK, ok, Zell, tolle Arbeit! Es scheint, dass es eine ganze Reihe von Gründen gibt, noch fortgeschrittenere Blogs zu schreiben.
Könnte ich nach der Kompilierung von scss zu css absolut sicher sein, dass das Ergebnis reines gültiges CSS aus Sicht von w3c ist? Klingt logisch…
Aber HTML-Validierung kann ins Spiel kommen.
Toller Artikel. Ich habe Task-Runner in Node lange Zeit gemieden, weil ich die kognitive Belastung nicht mochte, also habe ich alles, was mit Aufgaben zu tun hat, in Ruby erledigt... aber ich bin viel glücklicher, zu Gulp zu wechseln, und dieser Artikel war ein fantastisches Werkzeug dafür.
Ein kleiner Kritikpunkt.. beim Einrichten meiner App-Struktur habe ich einfach $touch index.html gemacht, was zu einer Diskrepanz führte, da keine HTML im Datei war. Es könnte sich lohnen, dem Vorspann etwas über das Erstellen des anfänglichen HTML hinzuzufügen.
Warum kompilieren Sie Ihr SCSS in app/css anstelle des dist-Verzeichnisses?
Schon gut, ich habe den Teil über die Verwendung von gulp-useref dafür überlesen, entschuldigen Sie bitte.
Ich habe jedoch eine weitere Frage. Testen Sie bei der Entwicklung nicht minifizierte und nicht verkettete Dateien aus dem app- oder dem dist-Verzeichnis? In einigen Fällen bin ich auf Szenarien gestoßen, in denen sowohl minifizierte als auch nicht minifizierte Dateien in das dist-Verzeichnis geschrieben wurden, und ich gehe davon aus, dass Dateien von dort getestet werden und nur die minifizierten Dateien in der Produktion verwendet werden. Was ist die beste Vorgehensweise?
Ich teste so viel wie möglich aus dem
app-Verzeichnis, da dies der Quellcode ist. Es gibt überhaupt keine wirklich "best practice". Es hängt alles davon ab, woran Sie glauben, und von diesem Glauben aus passen Sie Ihren eigenen Workflow entsprechend an.Dies ist wahrscheinlich etwas zu viel, um es in einem Kommentar zu besprechen. Ich habe es ausführlich in dem Buch behandelt, das ich geschrieben habe, und ich dachte, ich würde Sie einfach dorthin verweisen. Holen Sie sich einfach die Musterkapitel und Sie werden ein Gefühl dafür bekommen, woran ich glaube.
Klingt gut?
Klingt gut! Danke für den Ratschlag. Ich versuche gerade schon seit einiger Zeit, meinen eigenen Workflow und den meines Teams zu entwickeln, da könnte das Buch sicher nützlich sein!
Bin nur neugierig, wenn Aufgaben wie gulp watch ausgeführt werden, wie stoppe ich sie? Ich kann immer noch in das Terminal tippen, aber es passiert nichts.
Du kannst das Terminal stoppen, indem du
strg+cdrückstIrgendeine Idee, warum der Befehl 'gulp useref' nicht wie beabsichtigt funktioniert? Der Befehl wird ausgeführt, wobei die Konsolenausgabe wie folgt aussieht:
Die index.html wird in den dist-Ordner verschoben, aber es wird keine 'main.min.js' generiert, wie im Beitrag beschrieben. Wo könnte ich einen Fehler gemacht haben, ich habe den Code mehrmals überprüft und glaube, er ist identisch.
Das gulp-useref Plugin protokolliert nichts in der Befehlszeile, das ist also normal. Es ist wahrscheinlich, dass Sie irgendwo einen kleinen Fehler gemacht haben. Bitte legen Sie ein Github-Repo an und senden Sie mir den Link per E-Mail. Ich werde es mir ansehen.
Hier ist es: https://github.com/Paulie-P/LearningGulp
Leo, du hast keine JavaScript-Dateien im Ordner
app, weshalb nichts im Ordnerdisterscheint.Nach 'gulp useref' werden meine JS-Dateien zu einer Datei zusammengefasst und die index.html-Datei wird aktualisiert... Aber wenn ich Änderungen in einer der JS-Dateien vornehme, passiert nichts mehr... Ich bin verwirrt, wie ich weitermachen soll...
Muss ich (watch, useref) jedes Mal ausführen?
Ah, in deinem Setup landet alles in einem neuen Ordner... und ich aktualisiere tatsächlich die Quelldatei...
Hey Zell, danke für den tollen Artikel, dank dir fange ich an, Gulp zu verwenden.
Ich bin es gewohnt, einen "assets"-Ordner für CSS, JS, Bilder und Schriftarten zu haben. Ich habe ein Problem mit useref. Ich möchte, dass mein CSS und JS in dist/assets und HTML in den dist-Ordner gehen, aber ich bin mir nicht sicher, ob ich zwei Ziele hinzufügen kann. Ich mag keine umständlichen Wege, bei denen ich eine Aufgabe zum Kopieren von CSS und JS nach dist und dann eine Aufgabe zum Löschen aus dist erstellen kann. Gibt es dafür eine einfache Lösung?
Du musst einfach deinen Pfad im HTML so festlegen:
Und useref wird deine JS-Dateien automatisch in den Ordner
assetsausgeben.Wow, danke für die schnelle Antwort. Ich habe das ausprobiert und es hat wegen eines anderen Fehlers nicht funktioniert. Das habe ich in der Zwischenzeit behoben und jetzt funktioniert alles. Danke, Mann.
Danke für dieses Tutorial, ich habe viel gelernt.
Zwei Dinge jedoch
1) Du hast '--save-dev' nicht verwendet, als du gulp-minify-css installiert hast. Hast du das absichtlich gemacht oder war es nur ein Fehler?
2) Wenn ich den Build-Befehl verwende, erstellt Gulp einen dist-Ordner und kopiert alle Dateien dorthin, wo sie sein sollen. So weit, so gut. Aber wenn ich den Build-Befehl ein zweites Mal ausführe, löscht Gulp nur den dist-Ordner (wie es soll) und das war's. Es erstellt keinen neuen.
Meine Clean-Aufgabe sieht so aus (ich manipuliere die Bilder nicht und habe daher auf den Cache-Kram verzichtet)
und die Build-Aufgabe sieht so aus
Ich habe vergessen zu erwähnen, dass alle Aufgaben fehlerfrei ausgeführt werden. Zumindest sagt das die Shell.
Das ist ein Tippfehler
Deiner Clean-Aufgabe fehlt ein Callback. (Wenn du del 1.2.1 verwendest)
Ah, okay. Ich habe versucht, einen Callback hinzuzufügen, aber dann würde die Aufgabe nach dem Bereinigen stoppen. Natürlich habe ich die eckigen Klammern vergessen. Vielen Dank.
Okay, ich habe mich zu früh gefreut. Es funktioniert nicht. Es stoppt immer nach der Bereinigung.
Das gesamte gulpfile ist hier zu sehen: http://codepen.io/tmfsd/pen/rOwJLx/
Das funktioniert nur mit del v1.2.1. Verwendest du es? Die neueste Version von del ist im Moment 2.0.
Du hattest recht. Es ist Version 2.0.2. Aber anstatt eine ältere Version zu installieren, versuche ich lieber, es mit der neuesten Version zum Laufen zu bringen. Danke.