使用Gulp跳过已经压缩的文件

时间:2018-02-16 13:02:51

标签: gulp gulp-uglify gulp-concat gulp-if

我有一种情况,即使它们已经被压缩,我目前正在丑化所有JavaScript文件,这显然不是一个好主意。

我各自的任务是:

gulp.task('uglify', ['scripts'], function() {
    return gulp.src('./js/scripts.js')
        .pipe(rename({suffix: '.min'}))
        .pipe(uglify({
            mangle: false
        }))
        .pipe(gulp.dest('./js'));
});

scripts.js是一个以前连接在一起的文件,但很明显,如果那里有一些已压缩的文件,那么它们将再次被证实,我们正试图避免这种情况。

所以我进行了搜索并一直在寻找再次处理所有文件,而不是处理未经通信化的文件(只包含连接文件的文件)版本,以便我可以更好地控制每个文件。

我研究过使用gulp-ignoregulp-ifgulp-if似乎可能是我想要的;但是我并不是100%确定Gulp中的流如何运行 - 当你传递一个文件列表时,它是否循环执行每个文件的任务或者只运行一次?

我很好奇,因为如果它贯穿每个文件我正在做这样的事情:

gulp.task('uglify', ['scripts'], function() {
    return gulp.src(js_scripts)
        .pipe(gulpif(condition, uglify({mangle: false})))
        .pipe(concat('scripts.min.js'))
        .pipe(gulp.dest('./js'));
});

condition检查文件中文件是否有.min的情况,如果是,请不要将其弄糊涂。

所以我的问题是 - 如果它循环通过,我可以在每个文件上运行条件,我怎么能在文件名上运行测试,如果它没有循环,那么我怎样才能实现我想要的在这做?我是否会被迫创建两个单独的任务,一个用于未明确的任务,一个用于.min个文件,然后最后将它们连接在一起?

2 个答案:

答案 0 :(得分:1)

我认为你的例子应该这样做,uglify只有符合的文件 condition,但将所有不考虑条件的文件传递给下一个运算符。

gulp.task('uglify', ['scripts'], function() {
    return gulp.src(js_scripts)
        .pipe(gulpif(condition, uglify({mangle: false})))
        .pipe(concat('scripts.min.js'))
        .pipe(gulp.dest('./js'));
});

在名为1: Conditionally filter contentgulp-if页面上有一个示例:

  

如果条件为真,则仅对内容进行uglify,但将所有文件发送到dist文件夹

我认为即使在dist文件夹之前有内容,它也会将所有文件发送到流中。

对于循环问题,将在源文件中检查每个文件的条件js_scripts

编辑:您可以使用条件功能检查文件名

var condition = function (file) {
  // TODO: add business logic
  console.log(file.path);
  return true;
}

编辑2

根据@mark& @ Brett的评论和研究,您还可以使用正则表达式排除已缩小的文件,即带有.min.js后缀的文件:

gulp.task('uglify', ['scripts'], function() {
    return gulp.src(js_scripts)
        .pipe(gulpif('!**/*.min.js', uglify({mangle: false})))
        .pipe(concat('scripts.min.js'))
        .pipe(gulp.dest('./js'));
});

答案 1 :(得分:0)

在@ lofihelsinki的answer和@ mark的comment的帮助下,我能够找到解决方案。

虽然这些导致我朝着正确的方向发展,但我仍然不得不通过反复试验调整一些代码,所以我无法接受答案,但我想要归功于他们,因为他们引导我找到解决方案。

最终解决方案是:

gulp.task('uglify', ['scripts'], function() {
    return gulp.src(js_scripts)
        .pipe(gulpif('!**/*.min.js', uglify({mangle: false})))
        .pipe(concat('scripts.min.js'))
        .pipe(gulp.dest('./js'));
});

我尝试了@Mark的建议,但似乎即使你有流中的文件,你仍然必须尊重文件夹的位置;所以我不得不改变他对'!*.min.js''!**/*.min.js'的建议;现在,这只会在文件名中对包含.min.js的脚本进行uglify,而的脚本将不会被触及。