2

我有一种情况,我目前正在丑化所有 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-ignore并且似乎可能是我想要的gulp-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文件,然后最后将它们连接在一起?

4

2 回答 2

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

gulp-if页面上有一个名为1的示例:有条件地过滤内容,其中指出:

仅在条件为真时丑化内容,但将所有文件发送到 dist 文件夹

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

至于循环问题,在源中的每个文件中检查条件,js_scriptshere。

编辑:您可以使用条件函数来检查文件名

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

编辑 2

根据@mark 和@Brett 的评论和研究,您还可以使用Regex 排除已经缩小的文件,即带有.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'));
});
于 2018-02-16T14:58:51.203 回答
0

在@lofihelsinki 的回答和@mark 的评论的帮助下,我想出了一个解决方案。

虽然这些引导我朝着正确的方向前进,但我仍然不得不通过反复试验来调整一些代码,所以我无法接受答案,但我想感谢他们,因为他们引导我找到了解决方案。

最终的解决方案是:

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在文件名中的脚本,而那些包含在文件名中的脚本将原封不动地通过。

于 2018-02-17T08:20:23.650 回答