Як зменшити висновок за допомогою Browserfy в Gulp?


112

Я намагався зменшити вихід Browrify в 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

Ви насправді зблизилися, за винятком однієї речі:

  • вам потрібно конвертувати об'єкт потокового вінілового файлу, що задається source()з, vinyl-bufferтому що gulp-uglify(і більшість плагінів gulp) працює на буферизованих об'єктах вінілового файлу

Тож ви мали б це замість цього

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 і потоковими об'єктами вінілового файлу та буферизованими об'єктами вінілового файлу)

Редагувати: Я написав довшу статтю щодо використання gulp + перегляду веб-сторінок та різних підходів на веб- сайті: https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623


Рішення для трансформації вінілу призводить до того, що для кожного файлу в глобальному масштабі поширюється широкий набір, а не один пакет для всіх файлів. @ hafiz-ismail як можна використовувати підхід до перетворення вінілу для створення єдиного пакету?
Брайан Ліотм

@BrianLeathem: кожен файл із шаблону глобуса буде окремим основним вхідним файлом для перегляду, і кожен файл запису матиме окремий пакет. Якщо ви хочете об'єднати всі вихідні дані в один файл, ви можете використовувати їх gulp-concatі додати до кінця конвеєра gulp. Це буде еквівалент запуску browserify <options> > single-file.jsв терміналі. Повідомте мене, якщо я відповів на ваше запитання. Ура!
Хафіз Ісмаїл

11
Хм, я думаю, другий приклад з vinyl-transformвже не працює, так ?!
yckart

Щодо трансформації вінілу: github.com/substack/node-browserify/isissue/1198
Egon Olieux

Як зберегти сповіщення про авторські права в цьому сценарії?
Панкай

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

Однією з переваг другого підходу є те, що він використовує API Browrify безпосередньо, це означає, що вам не доведеться чекати авторів 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

Другий був для мене корисним. Працює як шарм. :) Ткс!
dnvtrn

3

ви можете спробувати переглядати перетворення uglifyify .


3
Важливі зауваження, здається, що uglifyify не збережений і застряг на Uglify v1, який застарілий.
Еван Керролл

2
На даний момент Uglifyify використовує Uglify v2. Можливо, він не оновлюється так часто, але це не здається необхідним, оскільки це просто залежить від пакета uglify-js.
інта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.