为什么 vinyl.isVinyl() return 对于 gulp 发出的乙烯基文件是错误的?

Why does vinyl.isVinyl() return false for vinyl files emitted by gulp?

我正在学习 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() return false

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

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

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

$ npm install --save-dev gulp

当前安装 gulp 的 3.9.1 版本。您可以使用 npm ls 查看 vinyl-fsvinyl3.9.1 版本 gulp 所依赖的版本。这是该命令的(缩写)输出:

└─┬ 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 have this property.

由于 gulp@3.9.1 使用 vinyl@0.4.6 发出乙烯基文件,因此您的 gulp 安装发出的乙烯基文件没有 ._isVinyl 属性。这就是为什么 vinyl.isVinyl() 函数 returns false 在你的例子中。

当前 development version for the upcoming gulp 4.0 uses vinyl@1.2.0 . If you were to install that version of gulp 您示例中的 vinyl.isVinyl() 调用将 return true.