Використання Gulp для об'єднання та Uglify файлів


124

Я намагаюся використовувати Gulp для:

  1. Візьміть 3 конкретні файли javascript, об'єднайте їх, а потім збережіть результат у файл (concat.js)
  2. Візьміть цей об'єднаний файл і зменшіть / мінімізуйте його, а потім збережіть результат в інший файл (uglify.js)

На сьогоднішній день у мене є такий код

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

Однак, здається, що операція uglify не працює, або файл чомусь не генерується.

Що мені потрібно зробити, щоб це сталося?


3
Вражений тим, що цього ще не бачив, тому мені просто хочеться швидко зауважити, що мета сама по собі дещо суперечить філософії Галпа. Написання посередницьких файлів - це більш грубий спосіб роботи. Gulp просуває потоки для підвищення швидкості. Але я впевнений, що хлопець, що питає, мав свої причини :).
Барт

Я знаю, що це стара тема, але я створив модуль npm, щоб зробити цю роботу дуже легко, використовуючи файл yaml. Перевірте це: github.com/Stnaire/gulp-yaml-packages .
Stnaire

Відповіді:


161

Виявляється, мені потрібно було спочатку використати, gulp-renameа також вивести зв'язаний файл перед «знищенням». Ось код:

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

Вихід із gruntнього був спочатку трохи заплутаним, але це має сенс зараз. Я сподіваюся, що це допомагає gulpнообам.

І, якщо вам потрібні вихідні карти, ось оновлений код:

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

Докладніші параметри та конфігурацію див. У картах gulp-source .


FYI, вам не вистачає жодної лапки перед concat.js. Рядок після вашої заяви про повернення gulp.taskповинен бути:.pipe(gp_concat('concat.js'))
Ерік Йоргенсен

1
Усі файли генеруються, однак у відладчику я все ще бачу мінімізовану версію. Що може бути причиною? Файл карти названо правильно і до нього можна отримати його URL-адресу.
Meglio

Це буде, залежно від браузерів, оригінальні джерела знаходяться на різних вкладках. Туди потрібно поставити точку розриву.
przemcio

4
Для мене незрозуміло, чому нам потрібно робити перейменування? Це помилка чи?
przemcio

@przemcio У моєму випадку я хотів записати всі файли на кожному кроці процесу. Однак якщо все, що вас цікавить, - це остаточний мінімізований файл, то, звичайно, ви можете ще більше скоротити файл
глоткою

17

Мій файл gulp створює остаточний компільований bundle-min.js, сподіваюся, що це комусь допоможе.

введіть тут опис зображення

//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
Чудовий приклад @wchoward - це було саме те, що я шукав, дуже чистий простий дизайн.
Фаїто

10

Рішення з використанням gulp-uglify, gulp-concatі gulp-sourcemaps. Це з проекту, над яким я працюю.

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

Це поєднує і стискає всі ваші scripts, додає їх у файл під назвою all_the_things.js. Файл закінчиться спеціальним рядком

//# sourceMappingURL=all_the_things.js.map

Що говорить вашому браузеру шукати той файл карти, який він також виписує.


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

Ваше рішення не працює, тому що вам потрібно зберегти файл після концет-процесу, а потім знову нівелювати та зберігати. Вам не потрібно перейменовувати файл між concat та uglify.


Я б сказав, що це прерогатива розробника вирішувати, що вони роблять, а що не потрібно при використанні gulp. У моєму випадку я хотів перейменувати файли на кожному кроці. Інші можуть віддавати перевагу іншому.
Obinwanne Hill

1
Звичайно, ви можете вирішити, який для вас найкращий варіант. Я зрозумів, що відповідь нижче говорить, що вам потрібно перейменувати файл, я просто сказав, що вам це не потрібно (це не обов'язково), вибачте, якщо я зробив певну плутанину.
Мілош

4

10 червня 2015 р .: Примітка автора gulp-uglifyjs:

ВИМОЖЕНО: Цей плагін перебуває у чорному списку, оскільки він покладається на Uglify для континування файлів замість використання gulp-concat, що порушує парадигму "Це повинно робити одне". Коли я створив цей плагін, не було можливості змусити вихідні карти працювати з gulp, однак тепер є плагін gulp-sourcemaps, який досягає тієї ж мети. gulp-uglifyjs як і раніше чудово працює і дає дуже детальний контроль над виконанням Uglify, я просто даю вам голову, що зараз існують інші варіанти.


18 лютого 2015 року: gulp-uglify і gulp-concatобидва gulp-sourcemapsзараз прекрасно працюють . Просто переконайтеся, що правильно встановити newLineпараметр gulp-concat; Рекомендую \n;.


Оригінальний відповідь (грудень 2014 р.): Замість цього використовуйте gulp-uglifyjs .gulp-concatне обов'язково безпечно; їй потрібно правильно поводитись із напівколонами. gulp-uglifyтакож не підтримує вихідні карти. Ось фрагмент проекту, над яким я працюю:

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

Так? gulp-uglify безумовно підтримує вихідні карти: github.com/floridoo/gulp-sourcemaps/wiki/…
Містер О

1
@MisterOh Не впевнений, що це було під час написання, або, якщо це трапилося, можливо, gulp-concatне вдалося ( gulp-uglifyне дозволить вам мінімізувати декілька файлів, тому вам доведеться спочатку сформулювати). Також gulp-concatвикористовується \r\nза замовчуванням, що може спричинити проблеми, якщо ваші файли JS не закінчуються належним чином. Але так, тепер, коли є підтримка, можливо, краще пройти цей маршрут як його більш гнучкий.
mpen

@Mark - Будемо вдячні, якщо ви опублікуєте рішення за допомогою gulp-sourcemaps, що працює в руслі відповіді Obinwanne. Я не можу здатися, що це працює.
NightOwl888

@ NightOwl888 гаразд Насправді, це не створює вбудовані , якщо це те, про що ви питали; це все-таки окремий файл.
mpen

gulp-uglifyjs також залежить зараз. Зараз просто використовувати плагін gulp-uglify має бути достатньо. Дивіться інші відповіді на сучасне рішення.
Ніл Монро

0

ми використовуємо конфігурацію нижче, щоб зробити щось подібне

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

зразок файлу GulpDS знаходиться нижче:

{

    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",
        }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.