javascript-Gulp.js:如何动态串联子目录文件,而不是主目录中的文件

使用Gulp.js,我希望能够像往常一样编译js文件夹中的单个文件,但可以将放置在子目录中的内容串联起来,并将文件夹名称分配给串联后的文件. (也有一些棉绒和棉被继续)

范例来源

|-- js/
|   |-- main/
|   |   |-- script1.js
|   |   |-- script2.js
|   |   |-- script3.js
|   |-- detects/
|   |   |-- scriptA.js
|   |   |-- scriptB.js
|   |   |-- scriptC.js
|   |-- myplugin.js
|   |-- myplugin2.js

示例输出

|-- js/
|   |-- myplugin.js
|   |-- myplugin.min.js
|   |-- myplugin2.js
|   |-- myplugin2.min.js
|   |-- main.js
|   |-- main.min.js
|   |-- detects.js
|   |-- detects.min.js

我尝试过的

gulp.task('scripts', ['clean'], function() {
    return gulp.src('src/js/*')
        .pipe(plumber())
        .pipe(flatten())
        .pipe(tap(function (file, t) {
            if ( file.stat.isDirectory() ) {
                var name = file.relative + '.js';
                return gulp.src(file.path + '/*.js')
                    .pipe(concat(name))
                    .pipe(header(banner.full, { package : package }))
                    .pipe(gulp.dest(paths.scripts.output))
                    .pipe(rename({ suffix: '.min.' + Date.now() }))
                    .pipe(uglify())
                    .pipe(header(banner.min, { package : package }))
                    .pipe(gulp.dest(paths.scripts.output));
            }
        }))
        .pipe(header(banner.full, { package : package }))
        .pipe(gulp.dest(paths.scripts.output))
        .pipe(rename({ suffix: '.min.' + Date.now() }))
        .pipe(uglify())
        .pipe(header(banner.min, { package : package }))
        .pipe(gulp.dest(paths.scripts.output));
});

这实际上是可行的,但是我不喜欢在gulp-tap中和之后重复代码.理想情况下,我应该能够执行以下操作并将其反馈到流中:

gulp.task('scripts', ['clean'], function() {
    return gulp.src('src/js/*')
        .pipe(plumber())
        .pipe(flatten())
        .pipe(tap(function (file, t) {
            if ( file.stat.isDirectory() ) {
                var name = file.relative + '.js';
                return gulp.src(file.path + '/*.js')
                    .pipe(concat(name));
            }
        }))
        .pipe(header(banner.full, { package : package }))
        .pipe(gulp.dest(paths.scripts.output))
        .pipe(rename({ suffix: '.min.' + Date.now() }))
        .pipe(uglify())
        .pipe(header(banner.min, { package : package }))
        .pipe(gulp.dest(paths.scripts.output));
});

但是,子目录文件永远不会以这种方式编译到目的地.我尝试过的其他方法也无效:

1个

.pipe(tap(function (file, t) {
    if ( file.stat.isDirectory() ) {
        var name = file.relative + '.js';
        t.through(gulp.src(file.path + '/*.js')
            .pipe(concat(name)));
    }
}))

2

.pipe(tap(function (file, t) {
    if ( file.stat.isDirectory() ) {
        var name = file.relative + '.js';
        .pipe(gulp.src(file.path + '/*.js')
            .pipe(concat(name)));
    }
}))

3

.pipe(tap(function (file, t) {
    if ( file.stat.isDirectory() ) {
        var name = file.relative + '.js';
        gulp.src(file.path + '/*.js')
            .pipe(concat(name));
    }
}))

4

.pipe(tap(function (file, t) {
    var scripts;
    if ( file.stat.isDirectory() ) {
        var name = file.relative + '.js';
        scripts = gulp.src(file.path + '/*.js')
            .pipe(concat(name));
    }
    return scripts;
}))

我有正常运行的代码,所以我并没有完全陷入困境,但是我知道有更好的方法可以做到这一点.我还想在运行丑化和缩小之前检查.js扩展名(因为我只抓取.scss文件,所以样式已经涵盖了这一点).这里的任何见解将不胜感激.

解决方法:

您可以使用lazypipe建立可重用的处理管道.

一旦确定了“可重用”行为,就可以将其转换为可重用块并多次调用.

在您的情况下,这些重复处理是这些调用:

.pipe(header(banner.full, { package : package }))
.pipe(gulp.dest(paths.scripts.output))
.pipe(rename({ suffix: '.min.' + Date.now() }))
.pipe(uglify())
.pipe(header(banner.min, { package : package }))
.pipe(gulp.dest(paths.scripts.output));

因此,将调用转换为可重用的管道(请参阅底部的注释):

var lazypipe = require('lazypipe');
//...
var process = lazypipe()
    .pipe(header, banner.full, { package : package })
    .pipe(gulp.dest, 'paths.scripts.output')
    .pipe(rename, { suffix: '.min.' + Date.now() })
    .pipe(uglify)
    .pipe(header, banner.min, { package : package })
    .pipe(gulp.dest, paths.scripts.output);

然后您可以多次使用它:

gulp.task('scripts', ['clean'], function() {
    //...
    return gulp.src('src/js/*')
        .pipe(plumber())
        .pipe(flatten())
        .pipe(tap(function (file, t) {
            if ( file.stat.isDirectory() ) {
                var name = file.relative + '.js';
                return gulp.src(file.path + '/*.js')
                    .pipe(concat(name))
                    .pipe(handle);
                    .pipe(process())  // <----- here
            }
        }))
        .pipe(process())  // <----- and here
});

一切都在一起:

gulp.task('scripts', ['clean'], function() {
    // Define reusable pipeline.
    var process = lazypipe()
        .pipe(header, banner.full, { package : package })
        .pipe(gulp.dest, 'paths.scripts.output')
        .pipe(rename, { suffix: '.min.' + Date.now() })
        .pipe(uglify)
        .pipe(header, banner.min, { package : package })
        .pipe(gulp.dest, paths.scripts.output);

    return gulp.src('src/js/*')
        .pipe(plumber())
        .pipe(flatten())
        .pipe(tap(function (file, t) {
            if ( file.stat.isDirectory() ) {
                var name = file.relative + '.js';
                return gulp.src(file.path + '/*.js')
                    .pipe(concat(name))
                    .pipe(handle);
                    .pipe(process())  // <----- use it here
            }
        }))
        .pipe(process())  // <----- and here
});

注意:
lazypipe使用惰性初始化,因此对.pipe()的调用与常规Gulp流不同.

而不是像这样调用插件:.pipe(header(banner.full,{package:package}))

您将所有参数传递给管道:.pipe(header,banner.full,{package:package})

上一篇:Vue 命令


下一篇:javascript-Gulp中的Babel对象分配插件