使用Gulp跳过丑化已压缩文件

e0bqpujr  于 2022-12-08  发布在  Gulp
关注(0)|答案(2)|浏览(123)

我有一个情况,我目前丑化所有的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是一个文件,以前是连接在一起,但显然,如果有一些已经压缩的文件在那里,那么他们将再次得到丑化,这是我们试图避免。
因此,我做了一个搜索,并一直在寻找处理所有的文件再次,而不是工作小康的unminified(文件,只是包含串联文件)版本,使我有更多的控制每个文件。
我研究了使用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文件,然后在最后将它们结合在一起吗?

6jygbczu

6jygbczu1#

我认为你的例子应该做到这一点,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_scripts

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

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

fkvaft9z2#

在@lofihelsinki的answer和@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的脚本变丑,而 do 的脚本将原封不动地通过。

相关问题