我正在学习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
我的困惑:
注册到though2.obj()
的transformFunction
接收到一个file
对象,该对象应该是一个vinyl
文件。
为什么vinyl.isVinyl()
返回false
?
为什么file
对象没有_isVinyl
属性?
这是您在Github上查看的vinyl-fs
和vinyl
版本以及您本地gulp
安装使用的vinyl-fs
和vinyl
版本的问题。
您可能通过输入
从npmjs.com
安装了gulp$ npm install --save-dev gulp
当前安装gulp的3.9.1
版本。您可以通过使用npm ls
查看gulp的3.9.1
版本依赖于vinyl-fs
和vinyl
的哪个版本。以下是该命令的(缩写)输出:
└─┬ gulp@3.9.1
└─┬ vinyl-fs@0.3.14
└─┬ vinyl@0.4.6
所以gulp@3.9.1
依赖于vinyl-fs@0.3.14
, vinyl-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.6
发出黑胶文件,所以gulp安装发出的黑胶文件没有._isVinyl
属性。这就是为什么vinyl.isVinyl()
函数在您的示例中返回false
。
即将到来的gulp 4.0的当前开发版本使用vinyl@1.2.0
。如果您要安装该版本的gulp,则示例中的vinyl.isVinyl()
调用将返回true
。