Gulpを使用したファイルの連結とUglify


124

私はGulpを使用して次のことを試みています:

  1. 3つの特定のJavaScriptファイルを取得して連結し、結果をファイル(concat.js)に保存します
  2. この連結されたファイルを取り、uglify / minifyしてから、結果を別のファイル(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の哲学に反することを簡単に述べておきます。中間ファイルの書き込みは、Gruntの作業方法です。Gulpは、速度を向上させるためにストリームを促進します。しかし、私は尋ねる人に彼の理由があったと確信しています:)。
Bart

私はそれが古いスレッドであることを知っていますが、yamlファイルを使用してこの種の作業を非常に簡単に行うためのnpmモジュールを作成しました。それをチェックアウト:github.com/Stnaire/gulp-yaml-packagesを
Stnaire 2016年

回答:


161

gulp-rename「uglification」の前に、最初に連結ファイルを使用して出力する必要があることがわかりました。これがコードです:

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-sourcemapsを参照してください。


ちなみに、concat.jsの前に単一引用符がありません。であなたのreturnステートメントの後の行は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それは私が探していたもので、とてもすっきりとした簡単なデザインでした。
Faito

10

gulp-uglifygulp-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 2016

1
もちろん、あなたにとって最良の選択肢は何かを決めることができます。私は理解しました、以下の回答はファイルの名前を変更する必要があることを示しています、私はあなたが必要としない(義務ではない)とだけ言ったので、混乱を招いた場合は申し訳ありません。
ミロス

4

2015年6月10日:著者のメモgulp-uglifyjs

非推奨:このプラグインは、gulp-concatを使用する代わりにUglifyを使用してファイルを連結するため、ブラックリストに登録されています。このプラグインを作成したとき、ソースマップをgulpで動作させる方法はありませんでしたが、同じ目的を達成するgulp-sourcemapsプラグインが用意されました。gulp-uglifyjsは引き続き適切に機能し、Uglifyの実行を非常に細かく制御できます。他のオプションが存在することを説明します。


2015年2月18日: 現在gulp-uglifygulp-concatどちらもうまく機能してgulp-sourcemapsいます。newLineオプションを正しく設定してくださいgulp-concat。お勧め\n;です。


元の回答(2014年12月):代わりに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'))
});

えっ?一息は-uglifyは間違いなく、ソースマップをサポートしています。 github.com/floridoo/gulp-sourcemaps/wiki/...
ミスターああ

1
@MisterOh執筆時点で確実に行われたか、そうであったとしても、おそらくそうではなかったでしょうgulp-concatgulp-uglify複数のファイルを縮小できないため、最初に連結する必要があります)。また、デフォルトでをgulp-concat使用\r\nします。これにより、JSファイルが正しく終了しない場合に問題発生する可能あります。しかし、はい、サポートされたので、より柔軟な方法でそのルートに進む方がおそらく良いでしょう。
mpen 2015年

@Mark-Obinwanneの回答に合わせて動作するgulp-sourcemapsでソリューションを投稿していただければ幸いです。うまく動かないようです。
NightOwl888

@ NightOwl888 大丈夫実際には、それがあなたが求めていたものである場合、インラインソースマップは生成されません。それはまだ別のファイルです。
mpen

gulp-uglifyjsも廃止されました。今はgulp-uglifyプラグインを使用するだけで十分です。最新のソリューションについては、他の回答を参照してください。
Neil Monroe

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",
        }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.