วิธี uglify เอาต์พุตด้วย Browserify in Gulp


112

ฉันพยายามอัปเกรดผลลัพธ์ของ Browserify ใน Gulp แต่ไม่ได้ผล

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

ตามที่ฉันเข้าใจฉันไม่สามารถทำได้ตามขั้นตอนด้านล่างนี้ ฉันต้องทำในท่อเดียวเพื่อรักษาลำดับไว้หรือไม่?

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

คำตอบ:


186

คุณเข้าใกล้ได้ดีจริงๆยกเว้นสิ่งหนึ่ง:

  • คุณต้องแปลงสตรีมมิ่งไฟล์ object ไวนิลที่กำหนดโดย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'));
});

หรือคุณสามารถเลือกใช้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'));
});

ทั้งสองสูตรข้างต้นจะบรรลุสิ่งเดียวกัน

เกี่ยวกับวิธีที่คุณต้องการจัดการไปป์ของคุณ (การแปลงระหว่าง NodeJS Streams ปกติและการสตรีมวัตถุไฟล์ไวนิลและวัตถุไฟล์ไวนิลที่บัฟเฟอร์)

แก้ไข: ฉันได้เขียนบทความที่ยาวขึ้นเกี่ยวกับการใช้ gulp + browserify และวิธีการต่างๆที่: https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623


โซลูชันการแปลงไวนิลส่งผลให้เกิดบันเดิลแบบ broswerified สำหรับแต่ละไฟล์ใน glob แทนที่จะเป็นบันเดิลเดียวสำหรับไฟล์ทั้งหมด @ hafiz-ismail จะใช้วิธีการแปลงไวนิลเพื่อสร้างบันเดิลเดียวได้อย่างไร
Brian Leathem

@BrianLeathem: แต่ละไฟล์จากรูปแบบ glob จะเป็นไฟล์รายการหลักที่แยกจากกันสำหรับ browserify และไฟล์รายการแต่ละไฟล์จะทำให้เกิดบันเดิลแยกกัน หากคุณต้องการเชื่อมเอาต์พุตบันเดิลทั้งหมดเข้าด้วยกันเป็นไฟล์เดียวคุณสามารถใช้gulp-concatและเพิ่มไปยังส่วนท้ายของไปป์ไลน์อึกของคุณ นั่นจะเท่ากับการทำงานbrowserify <options> > single-file.jsในเทอร์มินัล โปรดแจ้งให้เราทราบหากฉันตอบคำถามของคุณ ไชโย!
Hafiz Ismail

11
อืมฉันคิดว่าตัวอย่างที่สองกับvinyl-transformมันใช้ไม่ได้อีกแล้วใช่มั้ย!
yckart

เกี่ยวกับการแปลงไวนิล: github.com/substack/node-browserify/issues/1198
Egon Olieux

จะรักษาประกาศเกี่ยวกับลิขสิทธิ์ในสถานการณ์นี้ได้อย่างไร?
Pankaj

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

แนวทางที่ 1 การใช้ gulpify (เลิกใช้แล้ว)

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

แนวทางที่ 2การใช้ไวนิล - ซอร์ส - สตรีม

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

  bundleStream
    .pipe(source('index.js'))
    .pipe(streamify(uglify()))
    .pipe(gulp.dest('./bundle.js'));
});

ข้อดีอย่างหนึ่งของแนวทางที่สองคือใช้ Browserify API โดยตรงซึ่งหมายความว่าคุณไม่ต้องรอให้ผู้เขียน gulpify อัปเดตไลบรารีก่อนจึงจะทำได้


"gulpify เลิกใช้แล้วเนื่องจากใช้" browserify "โดยตรงร่วมกับโมดูล" vinyl-source-stream "หรือ" gulp-browserify "หากคุณต้องการใช้ปลั๊กอิน" ที่มา: npmjs.org/package/gulpifyโปรดทราบว่า "gulp-browserify" อยู่ใน blaclist
ZeeCoder

@ZeeCoder คุณหมายถึงอะไรในบัญชีดำ?
Giszmo

4
@Giszmo ฉันหมายถึงสิ่งนี้: github.com/gulpjs/plugins/blob/master/src/blackList.json
ZeeCoder

อันที่สองมีประโยชน์สำหรับฉัน ใช้งานได้เหมือนมีเสน่ห์ :) Tks!
dnvtrn

3

คุณอาจลองเปลี่ยน browserify uglifyify


3
หมายเหตุสำคัญดูเหมือนว่า uglifyify ไม่ได้รับการดูแลและติดอยู่ใน Uglify v1 ซึ่งเลิกใช้แล้ว
Evan Carroll

2
ปัจจุบัน Uglifyify ใช้ Uglify v2 อาจจะไม่ได้อัพเดทบ่อยขนาดนั้น แต่ดูเหมือนจะไม่จำเป็นเพราะมันขึ้นอยู่กับแพ็คเกจ uglify-js
inta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.