Recherche…


Syntaxe

  • npm install [nom-plugin] --save-dev
  • npm install [nom du plugin] --save
  • Fonction <function-name> (glob) {$ .src (glob) .pipe ([plug-in 1]). Pipe ([plug-in 2]) .... pipe ([plug-in]). Pipe ($ .dest ( <destination-name> )}
  • $.task(<taskname> , [dependencies] , <body>);

Remarques

Continue Reading - Création d'une tâche par défaut et configuration de la synchronisation du navigateur

Les références

Guide pas à pas sur l'automatisation des flux de travail Gulp pour les débutants absolus que j'ai documentés dans mon blog

Chargement de tous les plugins de Package.JSON

En supposant que vous compreniez comment installer Gulp, penchons-nous sur la nécessité d'exiger toutes les dépendances gulp de package.json dans le dossier racine de vos projets.

Si vous n'avez pas encore de fichier gulpfile, veuillez créer un fichier vide avec le nom

gulpfile.js

Tout d'abord, nous avons besoin de goûter. ainsi:

var $ = require('gulp');

Ensuite, nous allons charger tous nos plug-ins dans notre fichier gulpfich, par l'extrait ci-dessous

Remarque

S'il vous plaît lire les commentaires dans tous les extraits que nous allons inclure dans cette lecture, ils fournissent plus d'informations sur chaque fonctionnalité

/*
require gulp-load-plugins, and call it
gulp-load-plugins will require individually,
all the plugins installed in package.json at the root directory
these required plugins, are lazy loaded
that is, gulp-load-plugins will only require them when they are referenced in this file
plugins are available for perusal, via camelcased names, minus gulp
eg: gulp-clean-css is accessed by $$.cleanCss
*/
var $$ = require('gulp-load-plugins')();

REMARQUE

Dans tous les nombreux exemples que nous aurons dans l'article, nous alias

  1. gulp comme $ et
  2. gulp-load-plugins en tant que $$

uniquement pour faciliter la saisie.

Installation de plugins pour des images réactives | Css Minification | Js minification

Notre but est de

  1. Rendez vos images conformes aux largeurs et aux échelles appropriées en générant une batterie d'images de largeurs variées et en les réduisant
  2. Lint votre Javascript
  3. Minimisez vos ressources - JS / CSS / HTML, vous permettant ainsi d’héberger un code plus léger que le code le plus léger
  4. Regarder les fichiers css / js / image pour le changement et reconstruire les optimisations
  5. Synchroniser vos modifications en cours de développement sur un navigateur servant votre site.

Nous avons besoin d'un certain nombre de plugins, alors installons-les tous. Veuillez exécuter tous ces éléments dans le dossier racine du projet.

Plugins de traitement d'images

bash $ npm install --save-dev gulp-responsive 
bash $ npm install --save-dev gulp-imagemin 
bash $ npm install --save-dev imagemin
bash $ npm install --save-dev imagemin-jpeg-recompress
bash $ npm install --save-dev imagemin-pngquant 

Plugins d'optimisation d'actifs

bash $ npm install --save-dev gulp-clean-css
bash $ npm install --save-dev gulp-uglify
bash $ npm install --save-dev gulp-minify-html
bash $ npm install --save-dev gulp-jshint
bash $ npm install --save-dev gulp-concat
bash $ npm install --save-dev gulp-autoprefixer

Anatomie d'une fonction gulp

[Function <name>] (glob) {

$.src(glob)

.pipe([plugin 1])
.pipe([plugin 2])
.
.
.
.pipe([plugin n])
.pipe( $.dest(<destination-name>)

}

Remarque

pipe est une méthode qui diffuse tous les fichiers correspondant à l'entrée glob, à nos plugins (minifyhtml dans ce cas).

Il est simple de l’imaginer ainsi:

$ .src est ce qui construit le flux et les tubes de canalisation pour chaque fichier correspondant au glob vers le bas. Chaque plugin dans lequel le fichier est passé modifie son contenu en mémoire jusqu'à ce que $ .dest soit atteint / crée des fichiers diffusés par $ .src

,

$ -> gulp

$$ -> gulp-load-plugins

Optimisation des actifs et réduction


Donc, avant d’écrire les fonctions d’optimiseur, nous devons installer deux plugins de mise en cache.

bash $ npm install --save-dev gulp-cached
bash $ npm install --save-dev gulp-remember

Vous pourriez vous demander pourquoi deux caches hein! gulp-caché , ne transmet que du contenu modifié ou nouveau dans le pipeline aux autres plug-ins. Donc, comme nous voulons que les fichiers sans changement soient utilisés pour concaténer dans un seul fichier par élément (css | js) également, nous avons besoin de gulp-remember en plus de gulp-caché

Nous utilisons d'abord gulp-cached pour construire une liste de fichiers qui ont changé

Deuxièmement, n'oubliez pas de garder en mémoire tous les fichiers transmis par cette liste.

Première exécution: aucun fichier n'est mis en cache, donc gulp-caché les transmettra tous à gulp-remember

Exécutions suivantes: seuls les fichiers modifiés ou nouveaux sont redirigés par gulp-caché. Comme le contenu du fichier actuel a changé, gulp-remember met à jour son cache.

Cool, laissez-nous écrire notre premier optimiseur

Optimiseur de style


// Goal

/*

1. cache existing files on the first run
2. each file , 
       a. Is autoprefixed with cross browser compatible prefixes for any css property ( justify-content for e.g)
       b. Is concatenated into app.css
3. app.css is minified
4. On subsequent runs , the above process is implemented on file modifications/additions only

*/

/*
*@src - input a glob pattern - a string eg 'images/**/*' or '**/*.css' or, an array eg ['glob1','glob2']
*/
var optimizeStyles = function(src) {

return $.src(src).
pipe($$.cached('styles')).
pipe($$.autoprefixer({
browsers: ['last 2 versions']
})).
pipe($$.remember('auto-prefixed-stylesheets')).
pipe($$.concat('app.css')).
pipe($.dest('build/css')).
pipe($$.cleanCss()).
pipe($$.rename({
suffix: '.min'
})).
pipe($.dest('build/css'))
}

Remarque

$ -> gulp

$$ -> gulp-load-plugins

$ .src -> construit les flux de fichiers correspondant au glob passé en src

$ .dest -> enregistre le fichier manipulé dans le chemin spécifié

Optimiseur de script


// Goal

/*

1. cache existing files on the first run
2. each file , 
       a. Is linted with jshint 
       b. Is concatenated into app.js
3. app.js is minified
4. On subsequent runs , the above process is implemented on file modifications/additions only

*/

/*
*@src - input a glob pattern - a string eg 'js/**/*' or '**/*.js' or, an array eg ['glob1','glob2']
*/

var optimizeScripts = function(src) {

    return $.src(src).
    pipe($$.cached('scripts')).
    pipe($$.jshint()).
    pipe($$.jshint.reporter('default')).
    pipe($$.jshint.reporter('fail')).
    pipe($$.remember('linted-scripts')).
    pipe($$.concat('app.js')).
    pipe($.dest('build/js')).
    pipe($$.uglify()).
    pipe($$.rename({
        suffix: '.min'
    })).
    pipe($.dest('build/js'))


}

Remarque

$ -> gulp

$$ -> gulp-load-plugins

$ .src -> construit les flux de fichiers correspondant au glob passé en src

$ .dest -> enregistre le fichier manipulé dans le chemin spécifié

Générer des images réactives

Passons maintenant au traitement de l'image. Donc, le but est d'avoir un tableau de tailles pour chaque image que vous allez servir.

Pourquoi?

Eh bien, pour comprendre pourquoi nous avons besoin d'une batterie d'images avec une gamme de largeurs, nous devons réfléchir au fait qu'il y a probablement des milliards d'appareils avec des résolutions variées. Nous avons besoin d'une image à l'échelle sans trop de pixellisation. En même temps, nous devons améliorer les temps de chargement des pages en téléchargeant uniquement l’image, qui correspond à la largeur dans laquelle elle se trouve, et dont la dimension est également la plus petite possible. Il y a des blogs savants comme celui que Eric Portis a écrit, qui souligne l'inefficacité des requêtes de médias et sert de guide complet pour comprendre des concepts tels que srcsets et tailles.

Vous pouvez vous référer à l'épopée d'Eric Portis ici

Maintenant, notre fonction, doit prendre un glob, et une largeur comme entrées, et faire sa magie et pousser le fichier que chaque exécution génère, à une destination et réduire l'image réactivée.

Nous avons installé deux plugins de compression d'image dans notre premier exemple

Comme ces plugins NE commencent PAS par un préfixe "gulp-", nous devons les charger manuellement sur notre fichier gulpfile.

SO Exigeons-les manuellement, après la déclaration gulp-load-plugins en haut de notre fichier gulpfile.

ainsi:

var compressJpg = require('imagemin-jpeg-recompress');
var pngquant = require('imagemin-pngquant');

Il est intéressant de noter que gulp-responsive est livré avec un processeur d'image pointu, ce qui est mieux que imagemagick BY FAAAAR !. Sharp est ce que gulp-responsive utilise pour rogner vos images à la largeur désirée.

Vous pouvez regarder gulp-responsive-configuration-options pour une liste complète des paramètres de configuration. Je n'ai utilisé que

  • width - pour rogner nos images à une largeur w, passé en paramètre
  • rename - pour ajouter un suffixe au nom de l'image, de sorte qu'il reste unique

dans ma fonction de configuration ci-dessous. Ainsi, notre fonction va recadrer l'image à la largeur transmise en entrée, pour toutes les images correspondantes déchiffrées via l'entrée glob. Ensuite, chaque image est compressée en utilisant jpeg-recompress ou pngquant et enregistrée dans build / images.

Dans cet esprit, notre fonction serait comme suit:

/*
@generateResponsiveImages
*@Description:takes in a src of globs, to stream matching image files , a width,
*to resize the matching image to, and a dest to write the resized and minified files to
*@src - input a glob pattern - a string eg 'images/** /*' or 'images/*' or, an array
eg ['glob1','glob2']
*@return returns a stream
*/
var generateResponsiveImages = function(src, width, dest) {

    //declare a default destination
    if (!dest)
        dest = 'build/images';
    //case 1: src glob -  images/**/*
    // the base is the directory immediately preceeding the glob - images/ in this case
    //case 2: images/fixed/flourish.png : the base here is images/fixed/ - we are overriding
    // that by setting base to images.This is done so that, the path beginning after images/
    // - is the path under our destination - without us setting the base, dest would be,
    //build/images/flourish.png.But with us setting the base, the destination would be
    // build/images/fixed/flourish.png
    return $.src(src, {
        base: 'images'
    })

    //generate resized images according to the width passed
    .pipe($$.responsive({
            //match all pngs within the src stream
            '**/*.png': [{
                width: width,
                rename: {
                    suffix: '-' + width
                },
                withoutEnlargement: false,
            }],
            //match all jpgs within the src stream
            '**/*.jpg': [{
                width: width,
                rename: {
                    suffix: '-' + width
                },
                progressive: true,
                withoutEnlargement: false,
            }]
        }, {

            errorOnEnlargement: false,
            errorOnUnusedConfig: false,
            errorOnUnusedImage: false

        }))
        //once the file is resized to width, minify it using the plugins available per format
        .pipe($$.if('*.jpg', compressJpg({
            min: 30,
            max: 90,
            target: 0.5
        })()))
        //use file based cache gulp-cache and it will minify only changed or new files
        //if it is not a new file and if the contents havent changed, the file is served from cache
        .pipe($$.cache($$.imagemin({
            verbose: true
        })))


    //write to destination - dest + path from base
    .pipe($.dest(dest));
}

Remarque

$ -> gulp

$$ -> gulp-load-plugins

$ .src -> construit les flux de fichiers correspondant au glob passé en src

$ .dest -> enregistre le fichier manipulé dans le chemin spécifié

Autres références

Minificateur HTML

*
 *@minifyHtml
 *Description:takes in a glob src, and minifies all '.html' files matched by the glob
 *@src - input a glob pattern - a string eg '/**/*.html /*' or '*.html' or, an array eg ['glob1','glob2']
 *@dest=file.base means, the modified html file will be in the same directory as the src file being minified
 *often means, the process is just a modification on the existing src file
 *@return returns a stream
 */
var minifyHtml = function(src) {
    return $.src(src)
        .pipe($$.minifyHtml())
        .pipe($.dest(function(file) {
            //file is provided to a dest callback -
            // Refer here https://github.com/gulpjs/gulp/blob/master/docs/API.md#path
            return file.base;
        }));
}

Anatomie d'une tâche de gulp

L'anatomie d'une définition de tâche est comme suit:

$.task(<taskname> , [dependencies] , <body>);

dépendances, est un tableau de tâches qui doivent être terminées avant l'exécution de la tâche en cours. Plus comme forcer une exécution synchrone au lieu de la fonctionnalité asynchrone par défaut.

Ajout de tâches Gulp

Donc, nous avons maintenant

  • Une fonction définie ci-dessus pour optimiser les styles
  • Une fonction définie ci-dessus pour optimiser les scripts
  • Une fonction définie ci-dessus pour optimiser le HTML
  • Une fonction pour générer plusieurs images par image ci-dessus

Tout ce que nous devons faire maintenant, c'est de les invoquer en cas de besoin.

Écrivons nos tâches selon la syntaxe définie précédemment

/*
* $.task('name','dependency array',function)
results in building a task object as below
task:{
'name':name,
'dep':[array of dependencies],
'fn':function
}
*/


//*@return returns a stream to notify on task completion
$.task('optimizeHtml', function() {
    var src = ['**/*.html', '!{node_modules}/**/*.html'];
    return minifyHtml(src);
});

//*@return returns a stream to notify on task completion
$.task('optimizeScripts', function() {
    var src = ['js/**/*.js'];
    return optimizeScripts(src);
});

//*@return returns a stream to notify on task completion
$.task('optimizeStyles', function() {
    var src = ['css/**/*.css', 'fonts/google/**/*.css'];
    return optimizeStyles(src);
});

//Take in a callback to ensure notifying the gulp engine, that the task is done
//required since, you are not returning a stream in this task
$.task('generateResponsiveImages', function(callback) {
    var src = ['images/**/*.{jpg,png}'];
    for (var i = widths.length - 1; i >= 0; i--) {
        generateResponsiveImages(src, widths[i]);
    }
    callback();

});


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow