Javascript 乙烯缓冲液和gulp在gulp中流线型化的目的是什么?

Javascript 乙烯缓冲液和gulp在gulp中流线型化的目的是什么?,javascript,gulp,node.js-stream,Javascript,Gulp,Node.js Stream,正如文档所说,它们都处理将非流插件转换为流插件的问题 我试图理解的是,如果我能在某些东西上使用.pipe()方法,这不意味着它是一个流吗 如果是,我在这里转换成什么 例子: (发件人:) var browserify=require('browserify') var source=require('乙烯基源流') var buffer=require(‘乙烯基缓冲液’) var uglify=require('gulp-uglify') var size=require('gulp-size

正如文档所说,它们都处理将非流插件转换为流插件的问题

我试图理解的是,如果我能在某些东西上使用
.pipe()
方法,这不意味着它是一个流吗

如果是,我在这里转换成什么


例子: (发件人:)

var browserify=require('browserify')
var source=require('乙烯基源流')
var buffer=require(‘乙烯基缓冲液’)
var uglify=require('gulp-uglify')
var size=require('gulp-size')
var gulp=需要('gulp')
吞咽任务('build',function()){
var bundler=browserify('./index.js')
返回bundler.pipe()
.pipe(源('index.js'))
.pipe(缓冲区())//
如前所述,大多数插件都使用缓冲区(尽管其中一些插件还支持流)。示例包括gulp uglify和gulp traceur。您可以使用gulp buffer将其转换为缓冲区

通过

  • gulpuglify
    不支持流,所以您应该将流转换为缓冲区(示例使用
    乙烯基缓冲区

  • gulp-streamify
    可以包装旧插件以支持流(示例使用
    gulp-uglify

方法不同,但结果同样令人满意

我试图理解的是,我是否可以在上使用.pipe()方法 有些东西,这不意味着它是一条小溪吗


不,.pipe()也可以传递缓冲区。这篇博文对此进行了很好的解释:

一些gulp-*插件通过将缓冲的乙烯基文件作为对象来工作 输入。
但乙烯基源流会发出一个乙烯基文件对象。

这就是乙烯缓冲液的作用。所以我们只需要转换它 通过使用乙烯基缓冲液来缓冲乙烯基,如下所示


一个半有用的例子是考虑用一桶水扑灭篝火。要扑灭篝火,你需要先把桶装满,然后再把它倒在火上,而不是往桶里滴几滴,然后随着时间的推移把很多小水滴倒在火上。这个比喻并没有抓住一切,而是抓住了一个大点子你需要一桶水才能把火扑灭

“uglify”插件的工作原理也是一样的。想象一下,你想要压缩一个巨大的JS文件/uglify

加载整个代码库需要一点时间&你肯定不想在每一行出现时尝试缩小它,对吧?想象一下你加载一行,缩小它,加载另一行,缩小它,等等——这将是一个混乱。你不能流式处理它(你需要一个完整的“桶”代码才能丑化它)要正确丑化该文件,您需要先加载所有代码,然后再尝试丑化它

由于Gulp是一个“流式”构建系统,除非您有某种机制将流转换为缓冲区(完成后会发出流),否则不能使用uglify。您提到的两种工具都可以实现这一点

以下是流程: STREAM>(BUFFER)>{对整个“缓冲”文件执行一些工作}>STREAM>{其他吞咽工作等}

对于您的特定问题,您可以使用.pipe(),因为乙烯基缓冲区/gulp streamify有助于将流“转换”为缓冲区,然后再将缓冲区“转换”为流。它们是完成基本相同任务的不同方法

我试图理解的是,我是否可以在上使用.pipe()方法 有些东西,这不意味着它是一条小溪吗

是的!它是一条小溪。但它是一条小溪

它不是流式传输一系列字符,而是流式传输一系列对象,这些对象是您源文件

gulp流中的每个“数据”事件都会发出一个文件对象,如下所示:

{
  cwd: '/',              //<string>
  base: '/test/',        //<string>
  path: '/test/file.js', //<string>
  contents: contents     //<string> | <Buffer> | <stream.Readable>
}
{
cwd:“/”//
基数:'/test/'//
路径:'/test/file.js'//
目录:目录/| |
}

因此插件是一个插件,它将文件内容从
流。可读的
转换为
缓冲区

您可以在源代码中看到这一点,它在源代码中保存原始内容流,并在源代码中分配一个缓冲区作为新文件内容

做同样的事情,在和

Uglify处理完文件内容后,将其作为缓冲区保留是可以的。内容作为缓冲区总是可以的,gulp在寻源时不会这样做,因为它太昂贵了

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'))
})
{
  cwd: '/',              //<string>
  base: '/test/',        //<string>
  path: '/test/file.js', //<string>
  contents: contents     //<string> | <Buffer> | <stream.Readable>
}