Làm cách nào để xác định đầu ra với Browserify trong Gulp?


112

Tôi đã cố gắng xóa đầu ra của Browserify trong Gulp, nhưng nó không hoạt động.

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

Như tôi hiểu, tôi không thể thực hiện theo các bước như dưới đây. Tôi có cần tạo trong một đường ống để bảo toàn trình tự không?

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

Câu trả lời:


186

Bạn thực sự đã đến khá gần, ngoại trừ một điều:

  • bạn cần phải chuyển đổi các luồng đối tượng tập tin vinyl do source()với vinyl-buffergulp-uglify(và hầu hết các plugins ngụm) hoạt động trên đệm đối tượng tập tin vinyl

Vì vậy, bạn sẽ có cái này thay thế

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

Hoặc, bạn có thể chọn sử dụng vinyl-transformthay thế để xử lý cả các đối tượng tệp vinyl có bộ đệmphát trực tuyến cho bạn, như vậy

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

Cả hai công thức trên sẽ đạt được điều tương tự.

Nó chỉ là về cách bạn muốn quản lý đường ống của mình (chuyển đổi giữa các Luồng NodeJS thông thường và các đối tượng tệp vinyl trực tuyến và các đối tượng tệp vinyl được đệm)

Chỉnh sửa: Tôi đã viết một bài viết dài hơn về việc sử dụng gulp + Browserify và các cách tiếp cận khác nhau tại: https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623


Giải pháp biến đổi vinyl dẫn đến một gói broswerified cho mỗi tệp trong toàn cầu, thay vì một gói duy nhất cho tất cả các tệp. @ hafiz-ismail làm cách nào để sử dụng phương pháp chuyển đổi vinyl để tạo một gói duy nhất?
Brian Leathem

@BrianLeathem: mỗi tệp từ mẫu hình cầu sẽ là một tệp mục nhập chính riêng biệt để duyệt qua và mỗi tệp mục nhập sẽ dẫn đến một gói riêng biệt. Nếu bạn muốn nối tất cả các kết quả đầu ra của gói vào một tệp duy nhất, bạn có thể sử dụng gulp-concatvà thêm nó vào cuối đường dẫn gulp của mình. Điều đó sẽ tương đương với việc chạy browserify <options> > single-file.jstrong thiết bị đầu cuối. Hãy cho tôi biết nếu tôi đã trả lời câu hỏi của bạn. Chúc mừng!
Hafiz Ismail

11
Hmm, tôi nghĩ ví dụ thứ hai với vinyl-transformkhông hoạt động nữa, hả ?!
yckart


Làm thế nào để giữ các thông báo bản quyền trong trường hợp này?
Pankaj

12

Hai cách tiếp cận bổ sung, được lấy từ trang NPM nguồn phát trực tuyến vinyl :

Được:

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

Phương pháp 1 Sử dụng gulpify (không được dùng nữa)

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

Phương pháp 2 Sử dụng vinyl-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'));
});

Một lợi ích của cách tiếp cận thứ hai là nó sử dụng API Browserify trực tiếp, nghĩa là bạn không phải đợi tác giả của gulpify cập nhật thư viện trước khi bạn có thể.


"gulpify đã không còn được dùng nữa để ưu tiên sử dụng" Browserify "trực tiếp kết hợp với mô-đun" vinyl-source-stream "hoặc" gulp-Browserify "nếu bạn muốn sử dụng một plugin" Nguồn: npmjs.org/package/gulpify Cũng lưu ý rằng "gulp-Browserify" nằm trong danh sách đen.
ZeeCoder

@ZeeCoder bạn có nghĩa là gì bởi danh sách đen?
Giszmo


Cái thứ hai rất hữu ích cho tôi. Hoạt động như một sự quyến rũ. :) Tks!
dnvtrn

3

bạn có thể thử chuyển đổi Browserify uglifyify .


3
Lưu ý quan trọng, có vẻ như uglifyify không được làm rõ và bị mắc kẹt trên Uglify v1 không được dùng nữa.
Evan Carroll

2
Uglifyify hiện đang sử dụng Uglify v2. Có thể nó không được cập nhật thường xuyên, nhưng điều đó dường như không cần thiết vì nó chỉ phụ thuộc vào gói uglify-js.
inta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.