Pour une introduction approfondie et de haute qualité à Node.js, vous ne pouvez pas dépasser Learn Node un cours du célèbre développeur canadien de rennes full stack Wes Bos. Utilisez le code SITEPOINT pour obtenir 25% de réduction!
Cet article était sponsorisé par New Relic . Il a été mis à jour pour refléter l'état actuel des plugins Gulp et Gulp. Merci de soutenir les sponsors qui rendent SitePoint possible!
Les développeurs passent un temps précieux à coder. Même si nous ignorons les réunions agaçantes, une grande partie du travail implique des tâches de base qui sapent votre journée de travail:
- générer du HTML à partir de modèles et de fichiers de contenu
- compresser des images nouvelles et modifiées
- suppression des instructions console et
débogueur
des scripts - déplacement d'ES6 vers un code ES5 compatible cross-browser
- code linting et validation
- concaténation et minification de fichiers CSS et JavaScript [19659005] déployer des fichiers sur des serveurs de développement, de stockage intermédiaire et de production.
Les tâches doivent être répétées chaque fois que vous effectuez une modification. Vous pouvez commencer par de bonnes intentions, mais le développeur le plus infaillible oubliera de compresser une image ou deux. Au fil du temps, les tâches de pré-production deviennent de plus en plus ardues et chronophages; vous redouterez les changements inévitables de contenu et de modèle. C'est un travail répétitif et abrutissant. Ne serait-il pas mieux de passer votre temps à des travaux plus rentables?
Si oui, vous avez besoin d'un task runner ou build .
Ça semble compliqué!
La création d'un processus de génération prendra du temps. C'est plus complexe que d'effectuer chaque tâche manuellement, mais à long terme, vous économiserez des heures d'efforts, réduisez les erreurs humaines et sauvez votre santé mentale. Adoptez une approche pragmatique:
- Automatisez d'abord les tâches les plus frustrantes.
- Essayez de ne pas trop compliquer votre processus de construction. Une heure ou deux est plus que suffisant pour la configuration initiale.
- Choisissez un logiciel de coureur de tâches et respectez-le pendant un certain temps. Ne passez pas à une autre option sur un coup de tête
Certains outils et concepts peuvent être nouveaux pour vous, mais respirez profondément et concentrez-vous sur une chose à la fois.
Task Runners: the Options
] Des outils de construction tels que GNU Make sont disponibles depuis des décennies, mais les routeurs de tâches spécifiques au web sont un phénomène relativement nouveau. Le premier à atteindre la masse critique était Grunt – un runner de tâches Node.js qui utilisait des plugins contrôlés (à l'origine) par un fichier de configuration JSON. Grunt a été un énorme succès, mais il y avait un certain nombre de problèmes:
- Grunt requis plugins pour les fonctionnalités de base telles que l'observation de fichiers.
- Les greffons Grunt effectuaient souvent plusieurs tâches, ce qui rendait la personnalisation plus difficile.
- Les tâches pouvaient s'exécuter lentement car Grunt sauvegardait les fichiers entre chaque étape de traitement
De nombreuses questions étaient abordées dans les éditions ultérieures, mais Gulp était déjà arrivé et offrait un nombre d'améliorations:
- Des fonctions telles que l'observation de fichiers ont été intégrées.
- Les plugins Gulp étaient (principalement) conçus pour faire un seul travail.
- Gulp utilisait un code de configuration JavaScript moins verbeux
- Gulp était plus rapide car il utilisait Node.js streams pour transmettre des données à travers une série de plugins. Les fichiers ont été écrits seulement à la fin de la tâche.
Bien sûr, Gulp lui-même n'est pas parfait, et de nouvelles tâches telles que Broccoli.js Brunch et ] webpack ont également été en concurrence pour l'attention des développeurs. Plus récemment, npm lui-même a été présenté comme une option plus simple . Tous ont leurs avantages et leurs inconvénients, mais Gulp reste le favori et est actuellement utilisé par plus de 40% des développeurs web .
Gulp nécessite Node.js, mais si certaines connaissances JavaScript sont bénéfiques, les développeurs de
Qu'en est-il de Gulp 4?
Ce tutoriel explique comment utiliser Gulp 3 – la version la plus récente au moment de l'écriture. Gulp 4 est en développement depuis un certain temps mais reste un produit bêta. Il est possible de utiliser ou passer à Gulp 4 mais je recommande de rester avec la version 3 jusqu'à la version finale.
Étape 1: Installer Node.js
Node.js peut être téléchargé pour Windows, macOS et Linux de nodejs.org/download/ . Il existe différentes options d'installation à partir des binaires, gestionnaires de paquets et images docker, et des instructions complètes sont disponibles
Note pour les utilisateurs Windows: Node.js et Gulp fonctionnent sous Windows, mais certains plugins ne peuvent pas être installés ou exécutés ils dépendent des binaires Linux natifs tels que les bibliothèques de compression d'image. Une option pour les utilisateurs de Windows 10 est la nouvelle ligne de commande bash qui résout de nombreux problèmes
Une fois installé, ouvrez une invite de commande et entrez:
node -v
Ceci révèle le numéro de version. Vous êtes sur le point de faire un usage intensif de npm
– le gestionnaire de paquets Node.js qui est utilisé pour installer les modules. Examiner son numéro de version:
npm -v
Note pour les utilisateurs de Linux: Les modules Node.js peuvent être installés globalement de sorte qu'ils soient disponibles partout dans votre système. Cependant, la plupart des utilisateurs n'auront pas l'autorisation d'écrire dans les répertoires globaux à moins que les commandes npm
ne soient préfixées par sudo
. Il y a un certain nombre de options pour corriger les permissions npm et des outils comme nvm peuvent aider mais je change souvent le répertoire par défaut. Par exemple, sur les plateformes Ubuntu / Debian:
cd ~
mkdir .node_modules_global
Préfixe du jeu de configuration npm = $ HOME / .node_modules_global
npm installer npm -g
Puis ajoutez la ligne suivante à la fin de ~ / .bashrc
:
export PATH = "$ HOME / .node_modules_global / bin: $ PATH"
Enfin, mettez à jour avec ceci:
source ~ / .bashrc
Étape 2: Installation de Gulp Globally
Installez l'interface de ligne de commande Gulp globalement de sorte que la commande gulp
puisse être exécutée depuis n'importe quel dossier de projet:
npm install gulp-cli -g
Vérifiez que Gulp a installé avec ceci:
gulp -v
Étape 3: Configurer votre projet
Note pour les projets Node.js: vous pouvez passer cette étape si vous avez déjà un fichier de configuration package.json
.
Présumez que vous avez un projet nouveau ou préexistant dans le dossier project1
. Accédez à ce dossier et initialisez-le avec npm:
cd project1
npm init
On vous posera une série de questions. Entrez une valeur ou appuyez sur . Retournez pour accepter les valeurs par défaut. Un fichier package.json
sera créé à la fin et stockera vos paramètres de configuration npm
Note pour les utilisateurs de Git: Node.js installe les modules sur node_modules
dossier. Vous devez ajouter cela à votre fichier .gitignore
pour vous assurer qu'ils ne sont pas validés dans votre référentiel. Lorsque vous déployez le projet sur un autre PC, vous pouvez exécuter npm install
pour les restaurer.
Pour le reste de cet article, nous supposons que votre dossier de projet contient les sous-dossiers suivants:
dossier src
: fichiers source pré-traités
Cela contient d'autres sous-dossiers:
-
html
– Fichiers source et modèles HTML -
images
– les images originales non compressées -
js
– plusieurs fichiers de script prétraités -
scss
– plusieurs fichiers Sass prétraités.scss
dossier build
: fichiers compilés / traités
Gulp crée des fichiers et crée des sous-dossiers si nécessaire:
-
html
– statique compilé Fichiers HTML -
images
– Images comprimées -
js
– Un seul conc Fichier JavaScript reconstitué et minimisé -
css
– un seul fichier CSS compilé et minifié
Votre projet sera certainement différent mais cette structure est utilisée pour les exemples ci-dessous.
: Si vous utilisez un système basé sur Unix et que vous voulez simplement suivre le tutoriel, vous pouvez recréer la structure du dossier avec la commande suivante:
mkdir -p src / {html, images, js , scss} build / {html, images, js, css}
Étape 4: Installer localement Gulp
Vous pouvez maintenant installer Gulp dans votre dossier de projet en utilisant la commande:
npm install gulp --save-dev
Cela installe Gulp en tant que dépendance de développement et la section "devDependencies"
de package.json
est mise à jour en conséquence. Nous supposerons que Gulp et tous les plugins sont des dépendances de développement pour le reste de ce tutoriel.
Options de déploiement alternatives
Les dépendances de développement ne sont pas installées lorsque la variable d'environnement NODE_ENV
est définie sur production
sur votre système d'exploitation. Vous le feriez normalement sur votre serveur en direct avec la commande Mac / Linux:
export NODE_ENV = production
Ou sous Windows:
set NODE_ENV = production
Ce didacticiel suppose que vos ressources seront compilées dans le dossier build
et validées dans votre référentiel Git ou téléchargées directement sur le serveur. Toutefois, il peut être préférable de créer des ressources sur le serveur en direct si vous souhaitez modifier la façon dont elles sont créées. Par exemple, les fichiers HTML, CSS et JavaScript sont réduits en production mais pas en environnement de développement. Dans ce cas, utilisez l'option - save
pour Gulp et tous les plugins, c'est-à-dire
npm install gulp --save
Cela définit Gulp comme une dépendance d'application dans la section "dépendances"
de package.json
. Il sera installé lorsque vous entrez npm install
et peut être exécuté à chaque fois que le projet est déployé. Vous pouvez supprimer le dossier build
de votre référentiel car les fichiers peuvent être créés sur n'importe quelle plate-forme si nécessaire.
Étape 4: Créer un fichier de configuration Gulp
Créer un nouveau fichier gulpfile.js
fichier de configuration à la racine de votre dossier de projet. Ajoutez du code de base pour commencer:
// Configuration de Gulp.js
var
// modules
gulp = require ('gulp'),
// Mode de développement?
devBuild = (process.env.NODE_ENV! == 'production'),
// Dossiers
dossier = {
src: 'src /',
construire: 'build /'
}
;
Cela fait référence au module Gulp, définit une variable devBuild
sur true
lors de l'exécution en développement (ou en mode non production) et définit les emplacements des sources et des dossiers de construction.
Note ES6: le code JavaScript compatible ES5 est fourni dans ce tutoriel. Cela fonctionnera pour toutes les versions de Gulp et Node.js avec ou sans le drapeau - harmony
. La plupart des fonctionnalités ES6 sont supportées dans le nœud 6 et supérieur alors n'hésitez pas à utiliser les fonctions flèches, laissez
const
etc. si vous utilisez une version récente .
gulpfile.js
ne fera rien pour l'instant …
Etape 5: Créer des tâches Gulp
Seul, Gulp ne fait rien. Vous devez:
- installer les plugins Gulp, et
- écrire des tâches qui utilisent ces plugins pour faire quelque chose d'utile.
Il est possible d'écrire vos propres plugins mais, comme près de 3000 sont disponibles, à. Vous pouvez effectuer une recherche en utilisant le répertoire de Gulp à gulpjs.com/plugins/ npmjs.com ou bien rechercher "gulp quelque chose " pour exploiter le puissant pouvoir de Google.
Gulp propose trois méthodes de tâches principales:
-
gulp.task
– définit une nouvelle tâche avec un nom, un tableau optionnel de dépendances et une fonction. -
gulp.src
– Définit le dossier où se trouvent les fichiers sources -
gulp.dest
– définit le dossier de destination où seront placés les fichiers de construction
Un nombre illimité d'appels de plugin est défini avec ] pipe
entre les .src
et .dest
.
Image Tâche
Ceci est mieux démontré avec un exemple, alors créons une tâche de base qui compresse les images et les copie dans le dossier approprié build
. Comme ce processus peut prendre du temps, nous ne compresserons que les fichiers nouveaux et modifiés. Deux plugins peuvent nous aider: gulp-newer et gulp-imagemin . Installez-les à partir de la ligne de commande:
npm installez gulp-newer gulp-imagemin --save-dev
Nous pouvons maintenant référencer les deux modules en haut de gulpfile.js
:
// configuration de Gulp.js
var
// modules
gulp = require ('gulp'),
newer = require ('gulp-newer'),
imagemin = require ('gulp-imagemin'),
On peut maintenant définir la tâche de traitement d'image elle-même comme une fonction à la fin de gulpfile.js
:
// traitement d'image
gulp.task ('images', function () {
var out = dossier.build + 'images /';
return gulp.src (folder.src + 'images / ** / *')
.pipe (plus récent (out))
.pipe (imagemin ({optimizationLevel: 5}))
.pipe (gulp.dest (out));
});
Toutes les tâches sont syntaxiquement similaires. Ce code:
- Crée une nouvelle tâche nommée
images
. - Définit une fonction avec une valeur de retour qui …
- Définit un dossier
sur
où les fichiers de construction seront situés . - Définit le dossier source Gulp
src
. Le/ ** / *
assure que les images dans les sous-dossiers sont également traitées. - Pipe tous les fichiers au module
gulp-newer
. Les fichiers sources plus récents que les fichiers de destination correspondants sont transmis. Tout le reste est supprimé - Les fichiers nouveaux ou modifiés restants sont redirigés via
gulp-imagemin
qui définit un argument facultatifoptimizationLevel
. - Les images compressées sont sorties vers la Gulp
dest
dossier défini parsorti
.
Enregistrer gulpfile.js
et placer quelques images dans le dossier src / images
avant exécuter la tâche à partir de la ligne de commande:
images gulp
Toutes les images sont compressées en conséquence et vous verrez une sortie telle que:
Utiliser le fichier gulpfile.js
Courir 'imagemin' ...
Terminé 'imagemin' en 5.71 ms
gulp-imagemin: image1.png (enregistré 48.7 kB)
gulp-imagemin: image2.jpg (sauvegardé 36.2 kB)
gulp-imagemin: image3.svg (enregistré 12.8 kB)
Essayez d'exécuter à nouveau des images gulp
et rien ne devrait arriver car aucune image plus récente n'existe
Tâche HTML
Nous pouvons maintenant créer une tâche similaire qui copie les fichiers du dossier HTML source. Nous pouvons minifier en toute sécurité notre code HTML pour supprimer les espaces et les attributs inutiles en utilisant le plugin gulp-htmlclean :
npm installer gulp-htmlclean --save-dev
Ceci est alors référencé en haut de gulpfile.js
:
var
// modules
gulp = require ('gulp'),
newer = require ('gulp-newer'),
imagemin = require ('gulp-imagemin'),
htmlclean = require ('gulp-htmlclean'),
Nous pouvons maintenant créer une tâche html
à la fin de gulpfile.js
:
// Traitement HTML
gulp.task ('html', ['images']function () {
var
out = folder.build + 'html /',
page = gulp.src (folder.src + 'html / ** / *')
.pipe (plus récent (out));
// Réduire le code de production
if (! devBuild) {
page = page.pipe (htmlclean ());
}
retourne page.pipe (gulp.dest (out));
});
Cela réutilise gulp-newer
et introduit quelques concepts:
- L'argument
[images]
indique que notre tâcheimages
doit être exécutée avant de traiter le HTML (HTML est susceptible de référencer des images). N'importe quel nombre de tâches dépendantes peut être répertorié dans ce tableau et tout se terminera avant l'exécution de la tâche. - Nous ne redirigeons que le code HTML via
gulp-htmlclean
siNODE_ENV
est défini surproduction
. Par conséquent, le code HTML reste décompressé pendant le développement, ce qui peut être utile pour le débogage.
Enregistrez gulpfile.js
et exécutez gulp html
à partir de la ligne de commande. Les tâches html
et images
seront exécutées
JavaScript Task
Trop facile pour vous? Traitons tous nos fichiers JavaScript en construisant un bundler de module de base. Il va:
- S'assurer que les dépendances sont chargées en premier en utilisant le plugin gulp-deporder . Ceci analyse les commentaires en haut de chaque script pour assurer une commande correcte. Par exemple,
// requiert: defaults.js lib.js
. - Concaténer tous les fichiers de script en un seul fichier
main.js
en utilisant gulp-concat - Supprimer toutes les instructions console et
débogage
avec gulp-strip-debug et minimiser le code avec gulp-uglify . Cette étape ne se produira que lors de l'exécution en mode production.
Installer les plugins:
npm installer gulp-deporder gulp-concat gulp-strip-debug gulp-uglify --save-dev
Les référence en haut de gulpfile.js
:
var
...
concat = require ('gulp-concat'),
deporder = require ('gulp-deporder'),
stripdebug = require ('gulp-strip-debug'),
uglify = require ('gulp-uglify'),
Puis ajoutez une nouvelle tâche js
:
// Traitement JavaScript
gulp.task ('js', function () {
var jsbuild = gulp.src (folder.src + 'js / ** / *')
.pipe (deporder ())
.pipe (concat ('main.js'));
if (! devBuild) {
jsbuild = jsbuild
.pipe (stripdebug ())
.pipe (uglify ());
}
return jsbuild.pipe (gulp.dest (folder.build + 'js /'));
});
Enregistrez puis exécutez gulp js
pour voir la magie se produire!
CSS Task
Enfin, créons une tâche CSS qui compile les fichiers Sass .scss
en un seul .css
fichier utilisant gulp-sass . Ceci est un plugin Gulp pour node-sass qui se lie au port LibSass C / C ++ super rapide du moteur Sass (vous n'aurez pas besoin d'installer Ruby) . Nous supposerons que votre fichier Sass principal scss / main.scss
est responsable du chargement de tous les partials.
Notre tâche utilisera également le fabuleux PostCSS via le gulp- postcss plugin. PostCSS nécessite son propre jeu de plugins et nous allons les installer:
- postcss-assets pour gérer les assets. Cela nous permet d'utiliser des propriétés telles que
background: resolve ('image.png');
pour résoudre les chemins de fichier oubackground: inline ('image.png');
pour des données en ligne - autoprefixer pour ajouter automatiquement les préfixes des fournisseurs aux propriétés CSS
- css-mqpacker pour regrouper plusieurs références à la même requête de média CSS en une seule règle.
- cssnano pour réduire le code CSS lors de l'exécution en mode production
Tout d'abord, installer tous les modules:
npm installer gulp-sass gulp-postcss postcss-assets autoprefixer css-mqpacker cssnano --save-dev
Puis les référence en haut de gulpfile.js
:
var
...
sass = require ('gulp-sass'),
postcss = require ('gulp-postcss'),
assets = require ('postcss-assets'),
autoprefixer = require ('autoprefixer'),
mqpacker = require ('css-mqpacker'),
cssnano = require ('cssnano'),
Nous pouvons maintenant créer une nouvelle tâche css
à la fin de gulpfile.js
. Notez que la tâche images
est définie comme dépendance car le plug-in postcss-assets
peut référencer des images pendant le processus de construction. De plus, la plupart des plugins peuvent recevoir des arguments (voir leur documentation pour plus d'informations):
// Traitement CSS
gulp.task ('css', ['images']function () {
var postCssOpts = [
assets({ loadPaths: ['images/']}),
autoprefixer ({navigateurs: ['last 2 versions', '> 2%']}),
mqpacker
]
if (! devBuild) {
postCssOpts.push (cssnano);
}
return gulp.src (folder.src + 'scss / main.scss')
.pipe (sass ({
outputStyle: 'imbriqué',
imagePath: 'images /',
précision: 3,
errLogToConsole: true
}))
.pipe (postcss (postCssOpts))
.pipe (gulp.dest (folder.build + 'css /'));
});
Enregistrez le fichier et exécutez la tâche à partir de la ligne de commande:
gulp css
Étape 6: automatiser les tâches
Nous avons exécuté une tâche à la fois. Nous pouvons les exécuter tous en une commande en ajoutant une nouvelle tâche run
à gulpfile.js
:
// exécuter toutes les tâches
gulp.task ('run', ['html', 'css', 'js']);
Enregistrez et entrez gulp run
sur la ligne de commande pour exécuter toutes les tâches. Notez que j'ai omis la tâche images
car elle est déjà définie comme dépendance pour les tâches html
et css
Est-ce encore trop dur? Gulp propose une autre méthode – gulp.watch
– qui peut surveiller vos fichiers sources et exécuter une tâche appropriée chaque fois qu'un fichier est modifié. La méthode passe un dossier et une liste de tâches à exécuter lorsqu'une modification se produit. Créons une nouvelle tâche watch
à la fin de gulpfile.js
:
// surveille les changements
gulp.task ('watch', function () {
// changements d'image
gulp.watch (folder.src + 'images / ** / *', ['images']);
// modifications html
gulp.watch (folder.src + 'html / ** / *', ['html']);
// modifications javascript
gulp.watch (folder.src + 'js / ** / *', ['js']);
// modifications CSS
gulp.watch (folder.src + 'scss / ** / *', ['css']);
});
Plutôt que d'exécuter gulp watch
immédiatement, ajoutons une tâche par défaut:
// tâche par défaut
gulp.task ('default', ['run', 'watch']);
Sauvegardez gulpfile.js
et entrez gulp
sur la ligne de commande. Vos images, HTML, CSS et JavaScript seront tous traités, puis Gulp restera actif en regardant les mises à jour et en ré-exécutant les tâches si nécessaire. Hit Ctrl / Cmd + C pour annuler la surveillance et revenir à la ligne de commande.
Étape 7: Profit!
Autres plugins que vous pouvez trouver utiles:
One méthode utile dans gulp-util
est .noop ()
qui passe les données directement sans effectuer aucune action. Cela pourrait être utilisé pour un code de traitement de développement / production plus propre. Par exemple:
var gutil = require ('gulp-util');
// Traitement HTML
gulp.task ('html', ['images']function () {
var out = dossier.src + 'html / ** / *';
return gulp.src (folder.src + 'html / ** / *')
.pipe (plus récent (out))
.pipe (devBuild? gutil.noop (): htmlclean ())
.pipe (gulp.dest (out));
});
Gulp peut également appeler d'autres modules Node.js, et ils n'ont pas nécessairement besoin d'être des plugins. Par exemple:
- browser-sync – recharger automatiquement les ressources ou actualiser votre navigateur lorsque des modifications surviennent
- del – supprimer des fichiers et des dossiers (peut-être nettoyer votre
build
dossier au début de chaque course).
Investir un peu de temps et Gulp pourrait sauver beaucoup d'heures de frustration de développement. Les avantages:
- les plugins sont abondants
- la configuration utilisant des tuyaux est lisible et facile à suivre
-
gulpfile.js
peut être adapté et réutilisé dans d'autres projets - votre poids total de la page peut être réduit pour améliorer les performances
- vous pouvez simplifier votre déploiement.
Liens utiles:
L'application des processus ci-dessus à un simple site Web a réduit le poids total de plus de 50%. Vous pouvez tester vos propres résultats en utilisant outils d'analyse de poids de page ou un service tel que New Relic qui fournit une gamme d'outils sophistiqués de surveillance des performances applicatives.
Gulp peut révolutionner votre flux de travail . J'espère que vous avez trouvé ce tutoriel utile et considérez Gulp pour votre processus de production. Je serais heureux d'entendre vos pensées dans les commentaires ci-dessous.
Cet article a été révisé par Giulio Mainardi et Tim Severien . Merci à tous les pairs évaluateurs de SitePoint pour avoir rendu le contenu de SitePoint le meilleur possible!
Source link