gulp-concat抛出exception'file.isNull(),index.js:39 TypeError:file.isNull不是函数

我试图用gulp编译react(.jsx),coffeescript(.coffee)和vanilla javascript(.js)文件,将所有生成的.js文件打包到一个文件中,app.js被加载到我的索引中.html页面。 我正在为每个编译types生成一个stream,并使用merge-stream将3个馈线stream的内容收集到一个stream中,我将这个stream传递给gulp-concat来创buildapp.js.

我得到一个来自gulp-concat,index.js,第39行的exception,让我知道“文件”不是一个函数。 这里是我的整个gulpfile.js,对gulp-concat的引用接近本节的底部。

var browserify = require('browserify'); var coffee = require('gulp-coffee'); var concat = require('gulp-concat'); var gulp = require('gulp'); var gutil = require('gulp-util'); var mergeStream = require('merge-stream'); var reactify = require('reactify'); var sass = require('gulp-sass'); var source = require('vinyl-source-stream'); gulp.task('javascript', function(){ // convert .jsx files to .js, collecting them in a stream var b = browserify(); b.transform(reactify); // use the reactify transform b.add('./jsx-transforms.js'); jsxStream = b.bundle(); if (gutil.isStream(jsxStream)) { gutil.log("jsxStream is a stream"); } else {gulp-concatgulp gutil.log("jsxStream is not a stream"); } merged = mergeStream(jsxStream); if (gutil.isStream(merged)) { gutil.log("merged is a stream"); } else { gutil.log("merged is not a stream"); } // collect all .js files in a stream jsStream = gulp.src(['./client/**/*.js','./common/**/*.js']); if (gutil.isStream(jsStream)) { gutil.log("jsStream is a stream"); } else { gutil.log("jsStream is not a stream"); } merged.add(jsStream); // compile all .coffee file to .js, collect in a stream coffeeStream = gulp.src(['./client/**/*.coffee','./common/**/*.coffee']) .pipe(coffee({bare: true}).on('error', gutil.log)); if (gutil.isStream(coffeeStream)) { gutil.log("coffeeStream is a stream"); } else { gutil.log("coffeeStream is not a stream"); } merged.add(coffeeStream); // concatenate all of the .js files into ./build/app.js merged .pipe(concat('app.js')) .pipe(gulp.dest('./build')); }); gulp.task('styles', function() { gulp.src('./client/assets/stylesheets/**/*.scss') .pipe(sass().on('error', sass.logError)) .pipe(concat('app.css')) .pipe(gulp.dest('./build')); }); gulp.task('default', ['javascript', 'styles']); 

以前我用过gulp-concat,但之前从来没有遇到这个问题。

Gulpstream是一种非常特殊的stream:它们是包含乙烯基文件对象的 对象模式下的节点stream。 如果你的stream来自gulp.src()以外的地方,比如来自gulp.src() API,那么你将不得不首先把这个stream转换成吞噬能够处理的sorting。

有两个步骤你需要采取。 首先,将您的browserify包stream转换为包含vinyl-source-stream (您需要但未使用)的乙烯基文件对象的stream 。

 var source = require('vinyl-source-stream'); ... var jsxStream = b.bundle() .pipe(source('bundle.js')); 

现在又有一个问题。 乙烯基stream可能处于两种模式之一: stream模式或缓冲模式 。 乙烯源码stream在stream模式下为您提供stream媒体。 许多Gulp插件,包括gulp-concat,只支持缓冲模式。 修复这个很简单:使用乙烯基缓冲区 。

 var source = require('vinyl-source-stream'); var buffer = require('vinyl-buffer'); ... var jsxStream = b.bundle() .pipe(source('bundle.js')) .pipe(buffer()); 

现在你有一些东西可以和你的其他stream合并,并通过pipe道连接成gulp-concat。 有关更多详细信息, 请参阅此配方 。