使用Gulp连接和Uglify文件

时间:2014-07-06 01:10:56

标签: gulp

我正在尝试使用Gulp:

  1. 获取3个特定的javascript文件,将它们连接起来,然后将结果保存到文件中(concat.js)
  2. 取这个连接文件并uglify / minify,然后将结果保存到另一个文件(uglify.js)
  3. 到目前为止我有以下代码

        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操作似乎不起作用,或者由于某种原因没有生成文件。

    我需要做些什么来实现这一目标?

5 个答案:

答案 0 :(得分:155)

事实证明,我需要使用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

答案 1 :(得分:10)

使用gulp-uglifygulp-concatgulp-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

告诉您的浏览器查找该地图文件,它也会写出来。

答案 2 :(得分:5)

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并保存。您不需要在concat和uglify之间重命名文件。

答案 3 :(得分:4)

2015年6月10日:来自gulp-uglifyjs的作者的说明:

  

DEPRECATED:此插件已被列入黑名单,因为它依赖于Uglify来连接文件而不是使用gulp-concat,这打破了“它应该做一件事”的范例。当我创建这个插件时,没有办法让源映射与gulp一起工作,但是现在有一个gulp-sourcemaps插件可以实现相同的目标。 gulp-uglifyjs仍然可以很好地工作,并且可以非常精细地控制Uglify执行,我只是提醒您现在存在其他选项。


2015年2月18日: gulp-uglifygulp-concat现在与gulp-sourcemaps很好地配合。只需确保为newLine正确设置gulp-concat选项即可;我推荐\n;


原始答案(2014年12月):请改用gulp-uglifyjsgulp-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'))
});

答案 4 :(得分: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",
        }
}