4

我正在学习 gulp 源代码并尝试编写一个 gulp 插件。

现在我对某事感到困惑。

这是我的插件代码如下:

module.exports = function(){
    return through2.obj(function(file,encode,callback){
        console.log(vinyl.isVinyl(file));//false
        console.log(file._isVinyl) // undefined

        // the reason ? file is not Object of vinyl ? file's property of '_isVinyl' is undefine ?

        if(file.isNull()){
            callback(null,file);
        }
        if(file.isStream()){
            file.contents = file.contents.pipe(through2(function(chuck,encode,callback){
                if(util.isNull(chuck)){
                    callback(null, chuck);
                }
                if(util.isBuffer(chuck)){
                    chuck = new Buffer(String(chuck)
                        .replace(commentReg, '')
                        .replace(blankSpaceReg,''))
                }
                callback(null,chuck);
            }));
        }
        if(file.isBuffer()){
            file.contents = new Buffer(String(file.contents)
                .replace(commentReg, '')
                .replace(blankSpaceReg,''));
        }
        callback(null,file);
    })
}

vinyl这是创建文件的 gulp 源代码的一部分:

https://github.com/gulpjs/vinyl-fs/blob/master/lib/src/wrap-with-vinyl-file.js

我的困惑:

transformFunction注册者though2.obj()接收一个file应该是vinyl文件的对象。

为什么vinyl.isVinyl()返回false

为什么file对象没有_isVinyl属性?

4

1 回答 1

4

vinyl-fsvinyl您在 Github 上查看的版本vinyl-fs以及vinyl您的本地gulp安装正在使用的版本有关。

您可能npmjs.com通过键入以下内容安装了 gulp:

$ npm install --save-dev gulp

这当前安装3.9.1了 gulp 的版本。您可以使用. vinyl-fs_ 这是该命令的(缩写)输出:vinyl3.9.1npm ls

└─┬ gulp@3.9.1
  └─┬ vinyl-fs@0.3.14
    └─┬ vinyl@0.4.6

所以gulp@3.9.1取决于vinyl-fs@0.3.14vinyl-fs@0.3.14取决于vinyl@0.4.6

以下是 GitHub 上这些版本的链接:

https://github.com/gulpjs/vinyl-fs/tree/v0.3.14
https://github.com/gulpjs/vinyl/tree/v0.4.6

正如您在 GitHub 上看到的,它vinyl@0.4.6没有属性._isVinyl。只有像这样的较新版本才vinyl@1.2.0 具有此属性

由于gulp@3.9.1使用vinyl@0.4.6gulp 安装发出的乙烯基文件发出乙烯基文件不具有该._isVinyl属性。这就是vinyl.isVinyl()函数false在您的示例中返回的原因。

即将到来的 gulp 4.0的当前开发版本使用vinyl@1.2.0. 如果您要安装该版本的 gulp ,则示例中的vinyl.isVinyl()调用将返回true.

于 2016-08-25T16:56:27.890 回答