我正在学习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-fs
和vinyl
版本,以及本地vinyl-fs
安装正在使用的vinyl
和gulp
版本。
您可能通过键入以下内容从 npmjs.com
安装了gulp:
$ npm install --save-dev gulp
当前,这将安装gulp的
3.9.1
版本。您可以使用 vinyl-fs
来查看gulp的vinyl
版本依赖于哪些3.9.1
和npm 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
。