GulpでBrowserifyの出力をUglifyしようとしましたが、動作しません。
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'));
});
私が理解したように、私は以下のようなステップでそれを作ることはできません。シーケンスを保持するために1つのパイプで作成する必要がありますか?
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');
});
実際には、1つのことを除いて、かなり近くになりました。
vinyl-buffer
(およびほとんどのgulpプラグイン)はbufferedビニールファイルオブジェクトで動作するため、source()
で指定されたstreamingビニールファイルオブジェクトを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'));
});
または、代わりにvinyl-transform
を使用することもできます。これは、streamingとbufferedビニールファイルオブジェクトの両方を処理します。
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'));
});
上記のレシピはどちらも同じことを達成します。
パイプの管理方法(通常のNodeJSストリームとストリーミングビニールファイルオブジェクトとバッファリングされたビニールファイルオブジェクト間の変換)
編集:gulp + browserifyの使用とさまざまなアプローチに関する長い記事を書いた: https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f962
vinyl-source-stream NPMページから取得した2つの追加アプローチ:
与えられた:
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');
アプローチ1 Gulpifyを使用する (非推奨)
gulp.task('gulpify', function() { gulp.src('index.js') .pipe(gulpify()) .pipe(uglify()) .pipe(gulp.dest('./bundle.js')); });
アプローチ2vinyl-source-streamの使用
gulp.task('browserify', function() {
var bundleStream = browserify('index.js').bundle();
bundleStream
.pipe(source('index.js'))
.pipe(streamify(uglify()))
.pipe(gulp.dest('./bundle.js'));
});
2番目のアプローチの利点の1つは、Browserify APIを直接使用することです。つまり、gulpifyの作成者がライブラリを更新するのを待つ必要がないということです。
browserify transform glifyify を試すことができます。