为什么由gulp发出的乙烯基文件vinyl. isvinyl()返回false ?



我正在学习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-fsvinyl版本以及您本地gulp安装使用的vinyl-fsvinyl版本的问题。

您可能通过输入

npmjs.com安装了gulp
$ npm install --save-dev gulp

当前安装gulp的3.9.1版本。您可以通过使用npm ls查看gulp的3.9.1版本依赖于vinyl-fsvinyl的哪个版本。以下是该命令的(缩写)输出:

└─┬ 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

相关内容

  • 没有找到相关文章

最新更新