gulp-uglify似乎期待Vinyl,而是获得Buffer

时间:2015-10-13 04:13:44

标签: gulp gulp-uglify

我已经看到了类似问题的很多不同答案,我已经尝试了很多。我尝试过使用gulp-streamify和乙烯基缓冲区,我尝试过没有任何东西,但无论我做什么,每当我将它包含在我的gulp管道中时,我都会收到Uglify的错误。

以下是我的代码中最相关的片段。

var bfyBundler = browserify({
    entries:['./src/sequencer.js'],
    extensions:['.jsx'],
    debug: devMode,
    cache: {}, packageCache: {}, fullPaths: true
});
function bundleSequencer(){
    var pipeline = bfyBundler.bundle()
        .on('error', function(error){
            notifier.notify({
                title:error.description,
                message:error.message,
                sound:true,
                wait:true,
                fileAndLocation:error.filename + ':' + error.lineNumber + ':' + error.column
            });
        });
    if(!devMode){
        pipeline = pipeline
            .pipe(uglify());
    }
    pipeline = pipeline
        .pipe(source('sequencer.js'))
        .pipe(gulp.dest('./app/'));
}

但是,运行此管道会返回以下错误:

E:\Sequencer\node_modules\gulp-uglify\minifier.js:67  
    if (file.isNull()) {  
             ^

TypeError: file.isNull is not a function  
    at DestroyableTransform.minify [as _transform] (E:\Sequencer\node_modules\gulp-uglify\minifier.js:67:14)  
    at DestroyableTransform.Transform._read (E:\Sequencer\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:172:10)  
    at DestroyableTransform.Transform._write (E:\Sequencer\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:160:12)  
    at doWrite (E:\Sequencer\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:326:12)  
    at writeOrBuffer (E:\Sequencer\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:312:5)  
    at DestroyableTransform.Writable.write (E:\Sequencer\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:239:11)  
    at Readable.ondata (E:\Sequencer\node_modules\readable-stream\lib\_stream_readable.js:572:20)  
    at emitOne (events.js:77:13)  
    at Readable.emit (events.js:169:7)  
    at readableAddChunk (E:\Sequencer\node_modules\readable-stream\lib\_stream_readable.js:195:16)

使用node-debug触发gulp似乎gulp传入Buffer对象而不是Vinyl文件传递给Uglify。我欢迎任何可以尝试诊断此问题的输入或方法。

我使用的是节点v4.1.2和gulp v3.9.0。据我所知,这些是最新版本。我想知道是否有变化?

我也已将此问题发布给IRC,希望能快速解决。

2 个答案:

答案 0 :(得分:2)

好的,对于其他有同样问题的人。问题是我使用的是browserify,而且我还没有使用浏览器#34;来源"在触发uglify之前..我还需要在uglify之前通过缓冲区管道,因为source返回一个流式乙烯基文件对象。

当我注意到管道的顺序时,这个SO帮助我解决了这个问题:How to uglify output with Browserify in Gulp?

我的代码解决方案是:

var bfyBundler = browserify({
    entries:['./src/sequencer.js'],
    extensions:['.jsx'],
    debug: devMode,
    cache: {}, packageCache: {}, fullPaths: true
});
function bundleSequencer(){
    var pipeline = bfyBundler.bundle()
        .on('error', function(error){
            notifier.notify({
                title:error.description,
                message:error.message,
                sound:true,
                wait:true,
                fileAndLocation:error.filename + ':' + error.lineNumber + ':' + error.column
            });
        })
        .pipe(source('sequencer.js'));
    if(!devMode){
        pipeline = pipeline
            .pipe(buffer())
            .pipe(uglify());
    }
    pipeline = pipeline
        .pipe(gulp.dest('./app/'));
}

答案 1 :(得分:1)

我看到您发布了自己的答案,但我想添加一些其他信息。 Gulp插件需要Vinyl个文件对象。 Browserify.bundle()返回一个流(字符流),因为它不是Gulp插件。如果您使用的是gulp-bro,它是原始代码,那么一个叫Browserify的gulp插件。

有关更多信息,请参见my answer on a related topic