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

跳过用Gulp丑化已压缩的文件,gulp,gulp-uglify,gulp-concat,gulp-if,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 }))

我的情况是,我目前正在丑化所有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
是一个以前连接在一起的文件,但显然,如果其中有一些已经压缩的文件,那么它们将再次变得丑陋,这是我们试图避免的

所以我做了一次搜索,并一直在考虑再次处理所有文件,而不是使用未统一(仅包含连接文件的文件)版本,以便对每个文件有更多的控制

我研究了使用
gulpignore
gulpif
gulpif
似乎是我想要的;然而,我不能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'));
});
其中,
条件
检查文件名中是否有
.min
,如果有,请不要丑化它


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

我认为您的示例应该做到这一点,
uglify
只有满足
条件
,但将不包含该条件的所有文件传递给下一个操作员

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'));
});
gulpif
页面上有一个示例,其中说明:

仅当条件为真时才显示内容,但将所有文件发送到dist文件夹

我认为它会将所有文件发送到流下,即使在dist文件夹之前有一些文件

至于循环问题,在源代码中的每个文件中检查条件,
js_scripts

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

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

在“洛菲赫尔辛基”和“马克”的帮助下,我想出了一个解决办法

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

最后的解决办法是:

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
的丑陋脚本,而那些包含
.min.js的脚本将被原封不动地传递。

gulpif中的条件应该接受正则表达式,因此这可能会起作用:
.pipe(gulpif([''.!.min.'],uglify({mangle false}))
谢谢,我将尝试一下。但是正则表达式不应该是这样的:
['**','!*.min.js']
因为单靠否定是不起作用的吗?可能吧。我不能100%确定正则表达式是否能与gulpif一起工作,那么您需要使用condition函数。仅求反就可以了。pipe(gulpif(“!*.min.js',uglify())将排除对*.min.js文件进行uglified。看起来您正试图将glob作为条件传递,例如,在您的[…]中,我认为它在gulp if中不起作用。@Mark Well我知道否定仅在
src(…)
中不起作用,但我假设它在这种情况下起作用,因为您已经有一组文件了?至于globs,它应该按照文档中的说明工作,它支持所支持的任何条件。谢谢,相应地编辑了答案。我认为条件函数的最初建议也会起作用,但是正则表达式当然更短更方便。