从stream库中抛出错误时,正确处理Gulp.js乙烯stream错误
我正在使用Gulp来编译React JSX(是的,我知道)。
我有这个Gulp任务:
gulp.task('transpile-jsx', function () { return transpileJSX().on('error',function(err){ // < I just added this error handler, but it doesn't do much console.error(err); }); });
上面的任务是这样调用的:
gulp.task('metagen:all', ['transpile-jsx'], function (done) { runAllMetagens(done); });
并且工作的实际function如下所示:
function transpileJSX() { return gulp.src('./public/static/app/js/views/**/*.js').pipe(react({harmony: true})) .pipe(gulp.dest('./public/static/app/js/jsx')); }
一个try / catch不能用于stream,因为它们是asynchronous的,那么附加一个error handling程序的最好方法是什么,这样我的吞吐进程就不会在遇到JSX转译错误时出现如下错误:
events.js:141 throw er; // Unhandled 'error' event ^ Error: Parse Error: Line 94: Unexpected token > at throwError (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:2808:21) at throwUnexpected (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:2870:9) at parseJSXChild (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:7068:13) at parseJSXElement (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:7140:31) at parsePrimaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3572:20) at parseLeftHandSideExpressionAllowCall (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3656:61) at parsePostfixExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3696:20) at parseUnaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3763:16) at parseBinaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3853:16) at parseConditionalExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3913:16)
我遇到的问题是,实时发生的转译错误会导致我的开发服务器崩溃(因为我的开发服务器是我的吞噬进程),而这些转译错误正在使我的吞噬过程崩溃。
使用gulp-util
那就把它当作
var gutil = require('gulp-util'); function transpileJSX() { return gulp.src('./public/static/app/js/views/**/*.js') .pipe(react({harmony: true})) .on('error', gutil.log) // Add gutil.log for error handling/logging .pipe(gulp.dest('./public/static/app/js/jsx')); }
我使用这个与我的Browserify
进程来捕获任何捆绑错误,并显示它们,而不杀害我的Watchify
实例。 对于使用React进行转译,应该做同样的事情。