Utilisation de Gulp pour concaténer et uglify des fichiers

124

J'essaye d'utiliser Gulp pour:

  1. Prenez 3 fichiers javascript spécifiques, concaténez-les, puis enregistrez le résultat dans un fichier (concat.js)
  2. Prenez ce fichier concaténé et uglify / minify-le, puis enregistrez le résultat dans un autre fichier (uglify.js)

J'ai le code suivant jusqu'à présent

    var gulp = require('gulp'),
        gp_concat = require('gulp-concat'),
        gp_uglify = require('gulp-uglify');

    gulp.task('js-fef', function(){
        return gulp.src(['file1.js', 'file2.js', 'file3.js'])
            .pipe(gp_concat('concat.js'))
            .pipe(gp_uglify())
            .pipe(gulp.dest('js'));
    });

    gulp.task('default', ['js-fef'], function(){});

Cependant, l'opération uglify ne semble pas fonctionner ou le fichier n'est pas généré pour une raison quelconque.

Que dois-je faire pour y parvenir?

Obinwanne Hill
la source
3
Étonné de ne pas le voir encore, alors je voudrais juste faire remarquer rapidement que le but en soi va quelque peu à l'encontre de la philosophie de Gulp. L'écriture de fichiers intermédiaires est plus la manière de travailler de Grunt. Gulp favorise les flux pour améliorer la vitesse. Mais je suis sûr que le gars qui a demandé avait ses raisons :).
Bart
Je sais que c'est un vieux thread, mais j'ai créé un module npm pour faire ce genre de travail très facilement en utilisant un fichier yaml. Vérifiez-le: github.com/Stnaire/gulp-yaml-packages .
Stnaire

Réponses:

161

Il s'avère que j'avais besoin d'utiliser gulp-renameet de sortir le fichier concaténé avant la «uglification». Voici le code:

var gulp = require('gulp'),
    gp_concat = require('gulp-concat'),
    gp_rename = require('gulp-rename'),
    gp_uglify = require('gulp-uglify');

gulp.task('js-fef', function(){
    return gulp.src(['file1.js', 'file2.js', 'file3.js'])
        .pipe(gp_concat('concat.js'))
        .pipe(gulp.dest('dist'))
        .pipe(gp_rename('uglify.js'))
        .pipe(gp_uglify())
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['js-fef'], function(){});

En venir gruntétait un peu déroutant au début, mais cela a du sens maintenant. J'espère que cela aide les gulpnoobs.

Et, si vous avez besoin de sourcemaps, voici le code mis à jour:

var gulp = require('gulp'),
    gp_concat = require('gulp-concat'),
    gp_rename = require('gulp-rename'),
    gp_uglify = require('gulp-uglify'),
    gp_sourcemaps = require('gulp-sourcemaps');

gulp.task('js-fef', function(){
    return gulp.src(['file1.js', 'file2.js', 'file3.js'])
        .pipe(gp_sourcemaps.init())
        .pipe(gp_concat('concat.js'))
        .pipe(gulp.dest('dist'))
        .pipe(gp_rename('uglify.js'))
        .pipe(gp_uglify())
        .pipe(gp_sourcemaps.write('./'))
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['js-fef'], function(){});

Voir gulp-sourcemaps pour plus d'informations sur les options et la configuration.

Obinwanne Hill
la source
Pour info, il vous manque un guillemet simple avant concat.js. La ligne après votre déclaration de retour gulp.taskdevrait être:.pipe(gp_concat('concat.js'))
Eric Jorgensen
1
Tous les fichiers sont générés, cependant, dans le débogueur, je vois toujours la version minifiée. Quelle peut être la raison? Le fichier de carte est nommé correctement et est accessible par son URL.
Meglio
Cela dépendra des navigateurs, les sources originales sont sur un onglet différent. Vous devez y mettre un point d'arrêt.
przemcio
4
Je ne vois pas pourquoi nous devons renommer? Est-ce un bug ou?
przemcio
@przemcio Dans mon cas, je voulais un enregistrement de tous les fichiers à chaque étape du processus. Cependant, si tout ce qui vous importe est le fichier minifié final, vous pouvez bien sûr raccourcir encore plus le fichier
gulp
17

Mon fichier gulp produit un fichier final compiled-bundle-min.js, j'espère que cela aidera quelqu'un.

entrez la description de l'image ici

//Gulpfile.js

var gulp = require("gulp");
var watch = require("gulp-watch");

var concat = require("gulp-concat");
var rename = require("gulp-rename");
var uglify = require("gulp-uglify");
var del = require("del");
var minifyCSS = require("gulp-minify-css");
var copy = require("gulp-copy");
var bower = require("gulp-bower");
var sourcemaps = require("gulp-sourcemaps");

var path = {
    src: "bower_components/",
    lib: "lib/"
}

var config = {
    jquerysrc: [
        path.src + "jquery/dist/jquery.js",
        path.src + "jquery-validation/dist/jquery.validate.js",
        path.src + "jquery-validation/dist/jquery.validate.unobtrusive.js"
    ],
    jquerybundle: path.lib + "jquery-bundle.js",
    ngsrc: [
        path.src + "angular/angular.js",
         path.src + "angular-route/angular-route.js",
         path.src + "angular-resource/angular-resource.js"
    ],
    ngbundle: path.lib + "ng-bundle.js",

    //JavaScript files that will be combined into a Bootstrap bundle
    bootstrapsrc: [
        path.src + "bootstrap/dist/js/bootstrap.js"
    ],
    bootstrapbundle: path.lib + "bootstrap-bundle.js"
}

// Synchronously delete the output script file(s)
gulp.task("clean-scripts", function (cb) {
    del(["lib","dist"], cb);
});

//Create a jquery bundled file
gulp.task("jquery-bundle", ["clean-scripts", "bower-restore"], function () {
    return gulp.src(config.jquerysrc)
     .pipe(concat("jquery-bundle.js"))
     .pipe(gulp.dest("lib"));
});

//Create a angular bundled file
gulp.task("ng-bundle", ["clean-scripts", "bower-restore"], function () {
    return gulp.src(config.ngsrc)
     .pipe(concat("ng-bundle.js"))
     .pipe(gulp.dest("lib"));
});

//Create a bootstrap bundled file
gulp.task("bootstrap-bundle", ["clean-scripts", "bower-restore"], function     () {
    return gulp.src(config.bootstrapsrc)
     .pipe(concat("bootstrap-bundle.js"))
     .pipe(gulp.dest("lib"));
});


// Combine and the vendor files from bower into bundles (output to the Scripts folder)
gulp.task("bundle-scripts", ["jquery-bundle", "ng-bundle", "bootstrap-bundle"], function () {

});

//Restore all bower packages
gulp.task("bower-restore", function () {
    return bower();
});

//build lib scripts
gulp.task("compile-lib", ["bundle-scripts"], function () {
    return gulp.src("lib/*.js")
        .pipe(sourcemaps.init())
        .pipe(concat("compiled-bundle.js"))
        .pipe(gulp.dest("dist"))
        .pipe(rename("compiled-bundle.min.js"))
        .pipe(uglify())
        .pipe(sourcemaps.write("./"))
        .pipe(gulp.dest("dist"));
});
dynamiclynk
la source
1
Excellent exemple @wchoward c'était exactement ce que je recherchais, un design simple et très propre.
Faito
10

Solution utilisant gulp-uglify, gulp-concatet gulp-sourcemaps. Ceci provient d'un projet sur lequel je travaille.

gulp.task('scripts', function () {
    return gulp.src(scripts, {base: '.'})
        .pipe(plumber(plumberOptions))
        .pipe(sourcemaps.init({
            loadMaps: false,
            debug: debug,
        }))
        .pipe(gulpif(debug, wrapper({
            header: fileHeader,
        })))
        .pipe(concat('all_the_things.js', {
            newLine:'\n;' // the newline is needed in case the file ends with a line comment, the semi-colon is needed if the last statement wasn't terminated
        }))
        .pipe(uglify({
            output: { // http://lisperator.net/uglifyjs/codegen
                beautify: debug,
                comments: debug ? true : /^!|\b(copyright|license)\b|@(preserve|license|cc_on)\b/i,
            },
            compress: { // http://lisperator.net/uglifyjs/compress, http://davidwalsh.name/compress-uglify
                sequences: !debug,
                booleans: !debug,
                conditionals: !debug,
                hoist_funs: false,
                hoist_vars: debug,
                warnings: debug,
            },
            mangle: !debug,
            outSourceMap: true,
            basePath: 'www',
            sourceRoot: '/'
        }))
        .pipe(sourcemaps.write('.', {
            includeContent: true,
            sourceRoot: '/',
        }))
        .pipe(plumber.stop())
        .pipe(gulp.dest('www/js'))
});

Cela combine et compresse tous vos scripts, les met dans un fichier appelé all_the_things.js. Le fichier se terminera par une ligne spéciale

//# sourceMappingURL=all_the_things.js.map

Ce qui indique à votre navigateur de rechercher ce fichier de carte, qu'il écrit également.

mpen
la source
7
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');

gulp.task('create-vendor', function () {
var files = [
    'bower_components/q/q.js',
    'bower_components/moment/min/moment-with-locales.min.js',
    'node_modules/jstorage/jstorage.min.js'
];

return gulp.src(files)
    .pipe(concat('vendor.js'))
    .pipe(gulp.dest('scripts'))
    .pipe(uglify())
    .pipe(gulp.dest('scripts'));
});

Votre solution ne fonctionne pas car vous devez enregistrer le fichier après le processus concat, puis le uglifier et l'enregistrer à nouveau. Vous n'avez pas besoin de renommer le fichier entre concat et uglify.

Milos
la source
Je dirais que c'est la prérogative du développeur de décider de ce qu'il fait et de ce dont il n'a pas besoin lors de l'utilisation de gulp. Dans mon cas, je voulais renommer les fichiers à chaque étape. D'autres peuvent préférer le contraire.
Obinwanne Hill
1
Bien sûr, vous pouvez décider quelle est la meilleure option pour vous. J'ai compris, cette réponse ci-dessous dit que vous devez renommer le fichier, je viens de dire que vous n'en avez pas besoin (ce n'est pas obligatoire), désolé si j'ai fait une certaine confusion.
Milos
4

10 juin 2015: Note de l'auteur de gulp-uglifyjs:

DEPRECATED: Ce plugin a été mis sur liste noire car il s'appuie sur Uglify pour concaténer les fichiers au lieu d'utiliser gulp-concat, ce qui rompt le paradigme "Il ne devrait faire qu'une seule chose". Lorsque j'ai créé ce plugin, il n'y avait aucun moyen de faire fonctionner les cartes sources avec gulp, mais il existe maintenant un plugin gulp-sourcemaps qui atteint le même objectif. gulp-uglifyjs fonctionne toujours très bien et donne un contrôle très granulaire sur l'exécution d'Uglify, je vous informe simplement que d'autres options existent maintenant.


18 février 2015: gulp-uglify et les gulp-concatdeux fonctionnent bien avec gulp-sourcemapsmaintenant. Assurez-vous simplement de définir newLinecorrectement l' option pour gulp-concat; Je recommande \n;.


Réponse originale (décembre 2014): Utilisez gulp-uglifyjs plutôt . gulp-concatn'est pas nécessairement sûr; il doit gérer correctement les points-virgules de fin. gulp-uglifyne prend pas non plus en charge les cartes source. Voici un extrait d'un projet sur lequel je travaille:

gulp.task('scripts', function () {
    gulp.src(scripts)
        .pipe(plumber())
        .pipe(uglify('all_the_things.js',{
            output: {
                beautify: false
            },
            outSourceMap: true,
            basePath: 'www',
            sourceRoot: '/'
        }))
        .pipe(plumber.stop())
        .pipe(gulp.dest('www/js'))
});
mpen
la source
Hein? gulp-uglify prend définitivement en charge les cartes sources: github.com/floridoo/gulp-sourcemaps/wiki/…
Mister Oh
1
@MisterOh Je ne suis pas sûr que ce soit le cas au moment de la rédaction, ou si cela a été le cas, peut gulp-concat- être ne l'a pas fait ( gulp-uglifyne vous permettra pas de réduire plusieurs fichiers, vous devez d'abord concaturer). En outre, gulp-concatutilise un \r\npar défaut, ce qui pourrait causer des problèmes si vos fichiers JS ne se terminent pas correctement. Mais oui, maintenant qu'il y a du support, il est probablement préférable d'emprunter cette voie car elle est plus flexible.
mpen
@Mark - Je vous serais reconnaissant de publier la solution avec gulp-sourcemaps qui fonctionne en ligne avec la réponse d'Obinwanne. Je n'arrive pas à le faire fonctionner.
NightOwl888
@ NightOwl888 ok En fait, cela ne produit pas de sourcemaps en ligne si c'est ce que vous demandez; c'est toujours un fichier séparé.
mpen
gulp-uglifyjs est également obsolète maintenant. Le simple fait d'utiliser le plugin gulp-uglify devrait suffire maintenant. Voir les autres réponses pour une solution à jour.
Neil Monroe
0

nous utilisons la configuration ci-dessous pour faire quelque chose de similaire

    var gulp = require('gulp'),
    async = require("async"),
    less = require('gulp-less'),
    minifyCSS = require('gulp-minify-css'),
    uglify = require('gulp-uglify'),
    concat = require('gulp-concat'),
    gulpDS = require("./gulpDS"),
    del = require('del');

// CSS & Less
var jsarr = [gulpDS.jsbundle.mobile, gulpDS.jsbundle.desktop, gulpDS.jsbundle.common];
var cssarr = [gulpDS.cssbundle];

var generateJS = function() {

    jsarr.forEach(function(gulpDSObject) {
        async.map(Object.keys(gulpDSObject), function(key) {
            var val = gulpDSObject[key]
            execGulp(val, key);
        });

    })
}

var generateCSS = function() {
    cssarr.forEach(function(gulpDSObject) {
        async.map(Object.keys(gulpDSObject), function(key) {
            var val = gulpDSObject[key];
            execCSSGulp(val, key);
        })
    })
}

var execGulp = function(arrayOfItems, dest) {
    var destSplit = dest.split("/");
    var file = destSplit.pop();
    del.sync([dest])
    gulp.src(arrayOfItems)
        .pipe(concat(file))
        .pipe(uglify())
        .pipe(gulp.dest(destSplit.join("/")));
}

var execCSSGulp = function(arrayOfItems, dest) {
    var destSplit = dest.split("/");
    var file = destSplit.pop();
    del.sync([dest])
    gulp.src(arrayOfItems)
        .pipe(less())
        .pipe(concat(file))
        .pipe(minifyCSS())
        .pipe(gulp.dest(destSplit.join("/")));
}

gulp.task('css', generateCSS);
gulp.task('js', generateJS);

gulp.task('default', ['css', 'js']);

Un exemple de fichier GulpDS est ci-dessous:

{

    jsbundle: {
        "mobile": {
            "public/javascripts/sample.min.js": ["public/javascripts/a.js", "public/javascripts/mobile/b.js"]
           },
        "desktop": {
            'public/javascripts/sample1.js': ["public/javascripts/c.js", "public/javascripts/d.js"]},
        "common": {
            'public/javascripts/responsive/sample2.js': ['public/javascripts/n.js']
           }
    },
    cssbundle: {
        "public/stylesheets/a.css": "public/stylesheets/less/a.less",
        }
}
dinesh
la source