Каковы цели винилового буфера и gulp -streamify в gulp?

Как говорится в документации, они оба имеют дело с преобразованием не потоковых плагинов в поток.

Я пытаюсь понять, что если я могу использовать метод .pipe() для чего-то, разве это не означает, что это поток?

Если это так, что я могу преобразовать в то, что здесь?


Пример винила-источника-потока:

(от: https://www.npmjs.com/package/vinyl-buffer)

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

gulp.task('build', function() {
  var bundler = browserify('./index.js')

  return bundler.pipe()
    .pipe(source('index.js'))
    .pipe(buffer()) // <---------------------- why?
    .pipe(uglify())
    .pipe(size())
    .pipe(gulp.dest('dist/'))
})


Пример gulp-streamify:

(от: https://www.npmjs.com/package/vinyl-source-stream)

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

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

  bundleStream
    .pipe(source('index.js'))
    .pipe(streamify(uglify())) // <----------- why?
    .pipe(gulp.dest('./bundle.js'))
})

Ответ 1

Один полу полезный пример - подумать о том, чтобы вытащить костер с ведром воды. Чтобы потушить огонь, вы хотели бы полностью заполнить ведро, прежде чем сбросить его на огонь, положив несколько капель в ведро, а затем сбросьте много капель с течением времени на огонь. Эта метафора не захватывает все, но большая идея такова: вам нужно ПОЛНОЕ ведро с водой, прежде чем вы сможете погасить огонь.

Этот плагин "uglify" работает одинаково. Представьте себе какой-то огромный JS файл, который вы хотите сжать/угадать.

Потребуется немного времени, чтобы загрузить всю базу кода, и вы определенно не захотите пытаться минимизировать каждую строку, как она есть, не так ли? Представьте, что вы загружаете одну строку, уменьшаете ее, загружаете другую строку, уменьшаете ее и т.д. - это будет беспорядок. Вы не можете передать его (вам нужно полное "ведро" кода, прежде чем вы сможете его угадать.) Чтобы правильно убрать этот файл, вам нужно будет загрузить весь этот код, прежде чем пытаться его угадать.

Так как Gulp является "потоковой" системой сборки, вы не можете использовать uglify, если у вас нет механизма для превращения потока в буфер (& когда он выдает поток). Оба упомянутых вами инструмента делают это возможно.

Здесь поток: STREAM > (BUFFER) > {выполнить некоторую работу над всем "буферизованным" файлом} > STREAM > {other Gulp work и т.д.}

К вашему конкретному вопросу вы можете использовать .pipe(), потому что virtual-buffer/ gulp -streamify help "конвертирует" потоки в буферы, а затем буферы к потокам. Они - разные подходы к выполнению по существу того же самого.

Ответ 2

Как уже говорилось, большинство плагинов работают с буферами (хотя некоторые из них также поддерживают потоки). Примеры включают gulp -uglify и gulp -traceur. Вы можете выполнить преобразование в буферы с помощью gulp -buffer.

через https://medium.com/@webprolific/getting-gulpy-a2010c13d3d5

  • gulp-uglify поток поддержки dosen't, поэтому вы должны преобразовать поток в буфер (пример использует vinyl-buffer)

  • gulp-streamify может переносить старые плагины для поддержки потоков (пример использует gulp-uglify)

Различные подходы, но одинаково удовлетворительные результаты.

Ответ 3

Я пытаюсь понять, могу ли я использовать метод .pipe() для что-то, разве это не означает, что это поток?


Нет,.pipe() также может передавать буферы. это сообщение в блоге объясняет это хорошо:

https://medium.com/@sogko/gulp-browserify-the-gulp-y-way-bb359b3f9623

Некоторые плагины gulp - * работают, используя буферизованные объекты виниловых файлов как вход.
Но виниловый источник-поток генерирует потоковый виниловый файл.

Вот где виниловый буфер входит. Поэтому нам просто нужно преобразовать это к буферному винилу с использованием винилового буфера, например,

Ответ 4

Я пытаюсь понять, могу ли я использовать метод .pipe() для чего-то, разве это не означает, что это поток?

Да! Это поток. Но это поток объектов !

Вместо потоковой передачи серии символов она передает поток объектов, которые являются файлами, которые вы получили.

Каждое событие "data" в потоке gulp генерирует объект файла Vinyl, который выглядит примерно так:

{
  cwd: '/',              //<string>
  base: '/test/',        //<string>
  path: '/test/file.js', //<string>
  contents: contents     //<string> | <Buffer> | <stream.Readable>
}


Таким образом, плагин stream.Readable -buffer является потоком Transform, который преобразует содержимое файла из stream.Readable в Buffer.

Вы можете увидеть это в источнике, где он сохраняет исходный поток контента в строке 24 и назначает буфер как новое содержимое файла в строке 35.

Streamify делает то же самое, в строке 35 и строке 48.

Можно оставить содержимое файла в качестве буфера после того, как Uglify завершит его обработку. Всегда нормально, чтобы содержимое было буфером, gulp просто не делает этого при поиске, потому что это слишком дорого.