如何在Gulp中使用Browserify来输出输出?

Nik*_*yev 109 javascript node.js uglifyjs browserify gulp

我试图在Gulp中uglify Browserify的输出,但它不起作用.

gulpfile.js

var browserify = require('browserify');
var gulp = require('gulp');
var uglify = require('gulp-uglify');
var source = require('vinyl-source-stream');

gulp.task('browserify', function() {
    return browserify('./source/scripts/app.js')
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(uglify()) // ???
        .pipe(gulp.dest('./build/scripts'));
});
Run Code Online (Sandbox Code Playgroud)

据我所知,我不能按照以下步骤进行.我是否需要在一个管道中制作以保留序列?

gulp.task('browserify', function() {
    return browserify('./source/scripts/app.js')
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(uglify()) // ???
        .pipe(gulp.dest('./source/scripts'));
});

gulp.task('scripts', function() {
    return grunt.src('./source/scripts/budle.js')
        .pipe(uglify())
        .pipe(gulp.dest('./build/scripts'));
});

gulp.task('default', function(){
    gulp.start('browserify', 'scripts');
});
Run Code Online (Sandbox Code Playgroud)

Haf*_*ail 182

你真的很接近,除了一件事:

  • 你需要转换的通过给定的乙烯基文件对象source()vinyl-buffer,因为gulp-uglify(和最一饮而尽插件)工作在缓冲乙烯基文件对象

所以你有这个

var browserify = require('browserify');
var gulp = require('gulp');
var uglify = require('gulp-uglify');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');

gulp.task('browserify', function() {
  return browserify('./source/scripts/app.js')
    .bundle()
    .pipe(source('bundle.js')) // gives streaming vinyl file object
    .pipe(buffer()) // <----- convert from streaming to buffered vinyl file object
    .pipe(uglify()) // now gulp-uglify works 
    .pipe(gulp.dest('./build/scripts'));
});
Run Code Online (Sandbox Code Playgroud)

或者,你可以选择使用vinyl-transform它来处理流媒体缓冲的乙烯基文件对象,就像这样

var gulp = require('gulp');
var browserify = require('browserify');
var transform = require('vinyl-transform');
var uglify = require('gulp-uglify');


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

  // use `vinyl-transform` to wrap the regular ReadableStream returned by `b.bundle();` with vinyl file object
  // so that we can use it down a vinyl pipeline
  // while taking care of both streaming and buffered vinyl file objects
  var browserified = transform(function(filename) {
    // filename = './source/scripts/app.js' in this case
    return browserify(filename)
      .bundle();
  });

  return gulp.src(['./source/scripts/app.js']) // you can also use glob patterns here to browserify->uglify multiple files
    .pipe(browserified)
    .pipe(uglify())
    .pipe(gulp.dest('./build/scripts'));
});
Run Code Online (Sandbox Code Playgroud)

上述两种配方都会达到同样的效果.

它只是关于你想如何管理你的管道(在常规NodeJS Streams和流式乙烯基文件对象和缓冲的乙烯基文件对象之间转换)

编辑:我写了一篇关于使用gulp + browserify以及不同方法的更长文章:https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623

  • 嗯,我认为"乙烯基变换"的第二个例子不再适用了,嗯?! (11认同)

Dre*_*kes 12

另外两种方法取自乙烯基源流 NPM页面:

鉴于:

var source = require('vinyl-source-stream');
var streamify = require('gulp-streamify');
var browserify = require('browserify');
var uglify = require('gulp-uglify');
var gulpify = require('gulpify');
var gulp = require('gulp');
Run Code Online (Sandbox Code Playgroud)

方法1 使用gulpify(不建议使用)

gulp.task('gulpify', function() {
  gulp.src('index.js')
    .pipe(gulpify())
    .pipe(uglify())
    .pipe(gulp.dest('./bundle.js'));
});
Run Code Online (Sandbox Code Playgroud)

方法2使用乙烯基源流

gulp.task('browserify', function() {
  var bundleStream = browserify('index.js').bundle();

  bundleStream
    .pipe(source('index.js'))
    .pipe(streamify(uglify()))
    .pipe(gulp.dest('./bundle.js'));
});
Run Code Online (Sandbox Code Playgroud)

第二种方法的一个好处是它直接使用Browserify API,这意味着您不必等待gulpify的作者在您可以之前更新库.

  • @Giszmo我的意思是:https://github.com/gulpjs/plugins/blob/master/src/blackList.json (4认同)