Dosyaları Birleştirmek ve Çirkinleştirmek için Gulp Kullanma


124

Gulp'i şu amaçla kullanmaya çalışıyorum:

  1. 3 özel javascript dosyası alın, birleştirin, ardından sonucu bir dosyaya kaydedin (concat.js)
  2. Bu birleştirilmiş dosyayı alın ve onu çirkinleştirin / küçültün, ardından sonucu başka bir dosyaya (uglify.js) kaydedin

Şu ana kadar aşağıdaki koda sahibim

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

Ancak, çirkinleştirme işlemi çalışmıyor veya dosya herhangi bir nedenle oluşturulmadı.

Bunun olması için ne yapmam gerekiyor?


3
Henüz görmemiş olmak beni şaşırttı, bu yüzden hedefin Gulp'un felsefesine bir şekilde aykırı olduğunu hemen belirtmek isterim. Aracı dosyaları yazmak daha çok Grunt çalışma şeklidir. Gulp, hızı artırmak için akışları destekler. Ama eminim soran adamın kendi nedenleri vardı :).
Bart

Bunun eski bir iş parçacığı olduğunu biliyorum, ancak bir yaml dosyası kullanarak bu tür işleri çok kolay yapmak için bir npm modülü yaptım. Kontrol edin: github.com/Stnaire/gulp-yaml-packages .
Stnaire

Yanıtlar:


161

gulp-rename"Uglification" dan önce birleştirilmiş dosyayı kullanmam ve ayrıca çıktı vermem gerektiği ortaya çıktı. İşte kod:

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

Ondan gruntgelmek ilk başta biraz kafa karıştırıcıydı ama şimdi mantıklı geliyor. Umarım gulpçaylaklara yardımcı olur .

Ve kaynak haritalara ihtiyacınız varsa, işte güncellenmiş kod:

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

Seçenekler ve yapılandırma hakkında daha fazla bilgi için gulp-kaynak haritalarına bakın .


Bilginize, concat.js'den önce tek bir tırnak işareti eksik. İade beyanınızdan sonraki satır gulp.taskşu şekilde olmalıdır:.pipe(gp_concat('concat.js'))
Eric Jorgensen

1
Tüm dosyalar oluşturulur, ancak hata ayıklayıcıda hala küçültülmüş sürümü görüyorum. Sebebi ne olabilir? Harita dosyası doğru şekilde adlandırılmıştır ve URL'sinden erişilebilir.
Meglio

Tarayıcılara bağlı olarak orijinal kaynakların farklı sekmelerde yer alacaktır. Oraya kesme noktası koymanız gerekir.
przemcio

4
Neden yeniden adlandırmamız gerektiği benim için net değil? Bu bir hata mı yoksa?
przemcio

@przemcio Benim durumumda, sürecin her adımında tüm dosyaların bir kaydını istedim. Bununla birlikte, tek umursadığınız son dosya küçültülmüşse, o zaman elbette yudum dosyasını daha da kısaltabilirsiniz
Obinwanne Hill

17

Yudum dosyam son bir derlenmiş paket min.js üretir, umarım bu birisine yardımcı olur.

görüntü açıklamasını buraya girin

//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"));
});

1
Harika bir örnek @ wchoward tam da aradığım şeydi, çok temiz ve basit bir tasarım.
Faito

10

Çözüm kullanarak gulp-uglify, gulp-concatve gulp-sourcemaps. Bu, üzerinde çalıştığım bir projeden.

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

Bu, tüm dosyalarınızı birleştirir ve sıkıştırır scripts, adında bir dosyaya koyar all_the_things.js. Dosya özel bir satırla bitecek

//# sourceMappingURL=all_the_things.js.map

Bu, tarayıcınıza yazdığı harita dosyasını aramasını söyler.


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

Çözümünüz çalışmıyor çünkü concat işleminden sonra dosyayı kaydetmeniz ve ardından çirkinleştirip tekrar kaydetmeniz gerekiyor. Concat ve uglify arasında dosyayı yeniden adlandırmanıza gerek yoktur.


Yudum kullanırken ne yaptıklarına ve neye ihtiyaç duymadıklarına karar vermenin geliştiricinin ayrıcalığı olduğunu söyleyebilirim. Benim durumumda, her adımda dosyaları yeniden adlandırmak istedim. Diğerleri aksini tercih edebilir.
Obinwanne Hill

1
Elbette sizin için en iyi seçeneğin ne olduğuna karar verebilirsiniz. Anladım, aşağıdaki cevabın dosyayı yeniden adlandırmanız gerektiğini söylüyor, sadece ihtiyacınız olmadığını söyledim (zorunlu değil), biraz kafa karıştırmışsam özür dilerim.
Milos

4

10 Haziran 2015: Yazarın notu gulp-uglifyjs:

KULLANIMDAN KALDIRILDI: Bu eklenti, "Tek bir şey yapmalı" paradigmasını bozan gulp-concat kullanmak yerine Uglify'ye güvendiği için kara listeye alındı. Bu eklentiyi oluşturduğumda, kaynak haritalarının gulp ile çalışmasını sağlamanın bir yolu yoktu, ancak şimdi aynı amaca ulaşan bir gulp-sourcemaps eklentisi var. gulp-uglifyjs hala harika çalışıyor ve Uglify uygulaması üzerinde çok ayrıntılı kontrol sağlıyor, size sadece şu anda diğer seçeneklerin var olduğu konusunda bir uyarı veriyorum.


18 Şubat 2015: gulp-uglify ve şimdi gulp-concatikisi de güzel çalışıyor gulp-sourcemaps. Sadece newLineseçeneği doğru ayarladığınızdan emin olun gulp-concat; Tavsiye ederim \n;.


Orijinal Cevap (Aralık 2014): Kullanım yudum-uglifyjs yerine. gulp-concatmutlaka güvenli değildir; sondaki noktalı virgülleri doğru şekilde işlemesi gerekir. gulp-uglifyayrıca kaynak haritalarını desteklemez. İşte üzerinde çalıştığım bir projeden bir pasaj:

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

Ha? gulp-uglify kesinlikle kaynak haritalarını destekliyor: github.com/floridoo/gulp-sourcemaps/wiki/…
Mister Oh

1
@MisterOh Yazarken emin değilim, ya da yaptıysa, belki de gulp-concatyapmadı ( gulp-uglifybirden fazla dosyayı küçültmenize izin vermez, böylece önce bir araya getirmeniz gerekir). Ayrıca, JS dosyalarınız düzgün şekilde sonlandırılmazsa sorunlara neden olabilecekgulp-concat bir \r\nvarsayılan olarak kullanır . Ama evet, artık destek olduğuna göre, daha esnek olduğu için bu rotaya gitmek muhtemelen daha iyi.
mpen

@Mark - Çözümü Obinwanne'nin cevabıyla aynı hizada çalışan gulp-sourcemap'lerle yayınlarsanız sevinirim. İşe yarayacak gibi görünmüyorum.
NightOwl888

@ NightOwl888 okay Aslında, sorduğunuz şey buysa, bu satır içi kaynak haritaları üretmez; hala ayrı bir dosya.
mpen

gulp-uglifyjs de artık görevden alındı. Sadece gulp-çirkin eklentisini kullanmak artık yeterli olacaktır. Güncel bir çözüm için diğer yanıtlara bakın.
Neil Monroe

0

benzer bir şey yapmak için aşağıdaki yapılandırmayı kullanıyoruz

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

örnek GulpDS dosyası aşağıdadır:

{

    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",
        }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.