我正在学习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);
    })
}

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

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属性?

最佳答案

这取决于您在Github上查看的vinyl-fsvinyl版本,以及本地vinyl-fs安装正在使用的vinylgulp版本。

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

$ npm install --save-dev gulp

当前,这将安装gulp的3.9.1版本。您可以使用 vinyl-fs 来查看gulp的vinyl版本依赖于哪些3.9.1npm ls版本。这是该命令的输出(缩写):
└─┬ [email protected]
  └─┬ [email protected]
    └─┬ [email protected]

因此[email protected]取决于[email protected],而[email protected]取决于[email protected]

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

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

如您在GitHub上看到的[email protected]而不是没有._isVinyl属性。仅较新的版本,例如[email protected] have this property

由于[email protected]使用[email protected]发出乙烯基文件,因此您的gulp安装发出的乙烯基文件没有._isVinyl属性。这就是为什么vinyl.isVinyl()函数在您的示例中返回false的原因。

当前的development version for the upcoming gulp 4.0使用[email protected]。如果要install that version of gulp,则示例中的vinyl.isVinyl()调用将返回true

09-12 13:35