Menggunakan Gulp untuk Menggabungkan dan Uglify file

124

Saya mencoba menggunakan Gulp untuk:

  1. Ambil 3 file javascript tertentu, gabungkan, lalu simpan hasilnya ke file (concat.js)
  2. Ambil file gabungan ini dan uglify / minify, kemudian simpan hasilnya ke file lain (uglify.js)

Saya memiliki kode berikut sejauh ini

    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(){});

Namun, operasi uglify sepertinya tidak berfungsi, atau file tidak dibuat karena beberapa alasan.

Apa yang harus saya lakukan untuk mewujudkannya?

Obinwanne Hill
sumber
3
Kagum belum melihatnya, jadi saya hanya ingin segera berkomentar bahwa gol itu sendiri agak bertentangan dengan filosofi Gulp. Menulis file perantara lebih merupakan cara kerja Grunt. Gulp mempromosikan aliran untuk meningkatkan kecepatan. Tapi saya yakin pria yang bertanya itu punya alasan :).
Bart
Saya tahu ini utas lama, tetapi saya telah membuat modul npm untuk melakukan pekerjaan semacam ini dengan sangat mudah menggunakan file yaml. Lihat ini: github.com/Stnaire/gulp-yaml-packages .
Stnaire

Jawaban:

161

Ternyata saya perlu menggunakan gulp-renamedan juga mengeluarkan file gabungan terlebih dahulu sebelum 'uglification'. Berikut kodenya:

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(){});

Berasal dari gruntitu awalnya sedikit membingungkan, tetapi sekarang masuk akal. Saya harap ini membantu para gulpnoobs.

Dan, jika Anda membutuhkan peta sumber, berikut kode yang diperbarui:

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(){});

Lihat gulp-sourcemaps untuk mengetahui lebih lanjut tentang opsi dan konfigurasi.

Obinwanne Hill
sumber
FYI, Anda kehilangan satu tanda kutip sebelum concat.js. Baris setelah pernyataan pengembalian Anda gulp.taskharus:.pipe(gp_concat('concat.js'))
Eric Jorgensen
1
Semua file dibuat, namun, di debugger saya masih melihat versi minified. Apa yang bisa menjadi alasan? File peta diberi nama dengan benar dan dapat diakses dengan URL-nya.
Meglio
Itu akan, tergantung pada browser, sumber asli ada di tab yang berbeda. Anda perlu meletakkan breakpoint di sana.
przemcio
4
Tidak jelas bagi saya mengapa kita perlu melakukan rename? Apakah itu bug atau?
przemcio
@przemcio Dalam kasus saya, saya ingin mencatat semua file di setiap langkah dalam proses. Namun, jika yang Anda pedulikan hanyalah file minified terakhir, maka Anda tentu saja dapat mempersingkat file
gulp
17

File gulp saya menghasilkan kompilasi-bundle-min.js terakhir, semoga ini membantu seseorang.

masukkan deskripsi gambar di sini

//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.dll
sumber
1
Contoh bagus @wchoward itu hanya apa yang saya cari, desain langsung yang sangat bersih.
Faito
10

Solusi menggunakan gulp-uglify, gulp-concatdan gulp-sourcemaps. Ini dari proyek yang sedang saya kerjakan.

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'))
});

Ini menggabungkan dan memampatkan semua Anda scripts, menempatkannya ke dalam file bernama all_the_things.js. File akan diakhiri dengan baris khusus

//# sourceMappingURL=all_the_things.js.map

Yang memberi tahu browser Anda untuk mencari file peta itu, yang juga ditulisnya.

mpen
sumber
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'));
});

Solusi Anda tidak berfungsi karena Anda perlu menyimpan file setelah proses concat dan kemudian melakukan uglify dan menyimpan lagi. Anda tidak perlu mengganti nama file antara concat dan uglify.

Milos
sumber
Saya akan mengatakan itu adalah hak prerogatif pengembang untuk memutuskan apa yang mereka lakukan dan tidak butuhkan saat menggunakan gulp. Dalam kasus saya, saya ingin mengganti nama file di setiap langkah. Orang lain mungkin lebih suka sebaliknya.
Obinwanne Hill
1
Tentu saja, Anda bisa memutuskan apa pilihan terbaik untuk Anda. Saya mengerti, jawaban di bawah ini mengatakan Anda perlu mengganti nama file, saya hanya mengatakan bahwa Anda tidak perlu (tidak wajib), maaf jika saya membuat kebingungan.
Milos
4

10 Juni 2015: Catatan dari penulis gulp-uglifyjs:

TIDAK DIGUNAKAN LAGI : Plugin ini telah masuk daftar hitam karena bergantung pada Uglify untuk menggabungkan file daripada menggunakan gulp-concat, yang merusak paradigma "Seharusnya melakukan satu hal". Ketika saya membuat plugin ini, tidak ada cara untuk mendapatkan peta sumber untuk bekerja dengan gulp, namun sekarang ada plugin gulp-sourcemaps yang mencapai tujuan yang sama. gulp-uglifyjs masih berfungsi dengan baik dan memberikan kontrol yang sangat terperinci atas eksekusi Uglify, saya hanya memberi tahu Anda bahwa opsi lain sekarang ada.


18 Feb 2015: gulp-uglify dan gulp-concatkeduanya berfungsi dengan baik gulp-sourcemapssekarang. Pastikan untuk menyetel newLineopsi dengan benar untuk gulp-concat; Saya sarankan \n;.


Jawaban Asli (Des 2014): Gunakan gulp-uglifyjs sebagai gantinya. gulp-concatbelum tentu aman; itu perlu menangani tanda titik koma di belakang dengan benar. gulp-uglifyjuga tidak mendukung peta sumber. Berikut cuplikan dari proyek yang saya kerjakan:

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
sumber
Hah? gulp-uglify pasti mendukung peta sumber: github.com/floridoo/gulp-sourcemaps/wiki/…
Tuan Oh
1
@MisterOh Tidak yakin itu terjadi pada saat penulisan, atau jika ya, mungkin gulp-concattidak ( gulp-uglifytidak akan membiarkan Anda mengecilkan banyak file sehingga Anda harus menggabungkannya terlebih dahulu). Selain itu, gulp-concatmenggunakan \r\ndefault, yang dapat menyebabkan masalah jika file JS Anda tidak terhenti dengan benar. Tapi ya, sekarang setelah ada dukungan, mungkin lebih baik mengambil rute itu karena lebih fleksibel.
mpen
@Mark - Akan sangat berterima kasih jika Anda memposting solusi dengan gulp-sourcemaps yang bekerja sesuai dengan jawaban Obinwanne. Sepertinya aku tidak bisa membuatnya bekerja.
NightOwl888
@ NightOwl888 oke Sebenarnya, itu tidak menghasilkan peta sumber sebaris jika itu yang Anda tanyakan; itu masih file terpisah.
mpen
gulp-uglifyjs juga dibuang sekarang. Cukup menggunakan plugin gulp-uglify sekarang sudah cukup. Lihat jawaban lain untuk solusi terbaru.
Neil Monroe
0

kami menggunakan konfigurasi di bawah ini untuk melakukan sesuatu yang serupa

    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']);

Contoh file GulpDS di bawah ini:

{

    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
sumber