如何使用Gulp.js将流保存到多个目的地?

Kon*_*kus 63 javascript node.js browserify gulp

const gulp = require('gulp');
const $ = require('gulp-load-plugins')();
const source = require('vinyl-source-stream');
const browserify = require('browserify');

gulp.task('build', () =>
  browserify('./src/app.js').bundle()
    .pipe(source('app.js'))
    .pipe(gulp.dest('./build'))       // OK. app.js is saved.
    .pipe($.rename('app.min.js'))
    .pipe($.streamify($.uglify())
    .pipe(gulp.dest('./build'))       // Fail. app.min.js is not saved.
);
Run Code Online (Sandbox Code Playgroud)

当file.contents是流时,当前不支持管道到多个目标.这个问题的解决方法是什么?

Con*_*tra 34

目前,当使用file.contents作为流时,您必须为每个dest使用两个流.这可能会在将来修复.

var gulp       = require('gulp');
var rename     = require('gulp-rename');
var streamify  = require('gulp-streamify');
var uglify     = require('gulp-uglify');
var source     = require('vinyl-source-stream');
var browserify = require('browserify');
var es         = require('event-stream');

gulp.task('scripts', function () {
    var normal = browserify('./src/index.js').bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('./dist'));

    var min = browserify('./src/index.js').bundle()
        .pipe(rename('bundle.min.js'))
        .pipe(streamify(uglify())
        .pipe(gulp.dest('./dist'));

    return es.concat(normal, min);
});
Run Code Online (Sandbox Code Playgroud)

编辑:这个错误现在修复了gulp.原帖中的代码应该可以正常工作.

  • 我们不能保存bundle()的输出,`var bundle = browserify('./ src/index.js').bundle();`然后将它提供给2个不同的'管道'?比如`bundle.pipe(source('bundle.js')).pipe(gulp.dest('./ dist'));`和`bundle.pipe(rename('bundle.min.js')).pipe (streamify(uglify()).pipe(gulp.dest('./ dist'));`所以bundle运行一次,我们使用输出两次. (5认同)
  • 从哪个版本的gulp修复了这个bug? (5认同)

Anm*_*raf 29

我遇到了类似的问题,并希望在lint,uglify和minify任务之后将gulp源复制到多个位置.我最终解决了这个,如下所示,

gulp.task('script', function() {
  return gulp.src(jsFilesSrc)
    // lint command
    // uglify and minify commands
    .pipe(concat('all.min.js'))
    .pipe(gulp.dest('build/js')) // <- Destination to one location
    .pipe(gulp.dest('../../target/build/js')) // <- Destination to another location
});
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为这种方式更容易。只是你有两个目的地,但在 minify 插件之前,你将一个路径放在普通文件中,然后将 minify 插件放在你想要的 minify 文件的路径后面。

例如:

gulp.task('styles', function() {

    return gulp.src('scss/main.scss')
    .pipe(sass())
    .pipe(gulp.dest('css')) // Dev normal CSS
    .pipe(minifycss())
    .pipe(gulp.dest('public_html/css')); // Live Minify CSS

});
Run Code Online (Sandbox Code Playgroud)


dav*_*dem 5

对于向多个目的地广播更新的情况,gulp.dest在一组目的地上循环命令效果很好。

var gulp = require('gulp');

var source = './**/*';

var destinations = [
    '../foo/dest1',
    '../bar/dest2'
];

gulp.task('watch', function() {
    gulp.watch(source, ['sync']);
});

gulp.task('sync', function (cb) {
    var pipeLine = gulp.src(source);

    destinations.forEach(function (d) {
        pipeLine = pipeLine.pipe(gulp.dest(d));
    });

    return pipeLine;
});
Run Code Online (Sandbox Code Playgroud)