捕捉Browserifyparsing错误(独立选项)

我正在使用gulp + browserify来构build和打包我的JavaScript库。 现在有一件事困扰我:我正在运行一个简单的服务器,通过grep进行开发。 这工作正常,但只要我的JavaScript包含语法错误,browserify抛出一个错误导致服务器停止。

我使用的browserify代码(请注意,我添加了一个error handling程序):

browserify("./src/main.js") .bundle({standalone: "SomeName", debug: false}).on('error', notify.onError({ message: "Error: <%= error.message %>", title: "Failed running browserify" }) ); 

现在来了一个有趣的部分:当我删除独立设置(和我的JS语法不正确),error handling程序触发。 但是,当我使用这个独立的设置时,error handling程序不会触发(导致服务器由gulp停止启动)

有谁知道如何处理这个问题? 我总是可以手动validation我的js文件,但想避免这种解决方法

on('error')事件仍然被触发。 但是,bro​​wserifystream与其他Gulpstream有点不同。 在this.emit("end")的error handling函数中,你需要明确地调用this.emit("end")

一个示例gulp任务

 var browserify = require('browserify'); var gulp = require('gulp'); var source = require("vinyl-source-stream"); var reactify = require('reactify'); gulp.task('browserify', function(){ // create new bundle var b = browserify(); // add transform if you want b.transform(reactify); // add file to browserify b.add("./src/main.js"); // start bundling return b.bundle() .on('error', function(err){ // print the error (can replace with gulp-util) console.log(err.message); // end this stream this.emit('end'); }) .pipe(source('main.js')) // pipe other plugin here if you want .pipe(gulp.dest('./dist')); }); 

错误函数处理程序可以防止this.emit("end")崩溃, this.emit("end")停止当前stream,不会让它运行到下一个pipe道。 事件处理程序也可以捕获transform插件中的错误。

欲了解更多信息,你可以在这里阅读http://truongtx.me/2014/07/15/handle-errors-while-using-gulp-watch/

由于没有人发布了答案(请随时纠正我,如果你有更好的解决scheme!),这里是我添加了解决scheme,让我的用例工作。 我已经理解了计划的Gulp版本(V4)将会有更好的error handling支持,可能解决这个问题。 但是,现在我使用jsvalidation器

 var jsValidate = require('gulp-jsvalidate'); var notify = require("gulp-notify"); gulp.task('browserify', function() { gulp.src("./src/*.js").pipe(jsValidate()).on('error', notify.onError({ message: "Error: <%= error.message %>", title: "Failed running browserify" })).on('finish', function(){ browserify("./src/main.js") .bundle({standalone: "SomeName", debug: true}).on('error', notify.onError({ message: "Error: <%= error.message %>", title: "Failed running browserify" })) .pipe(source('output.js')) }); }); 

search一个不会崩溃的解决scheme,并继续观看/ livereload,即使browserify转换崩溃,我终于find了一个。 我写了一篇关于它的小博客文章:

http://latviancoder.com/story/error-handling-browserify-gulp

这里是防止捆绑错误的吞咽任务崩溃的代码。 这是@tmtxt发布的代码的稍微修改版本。 我的版本问题是,“gulp.watch”在发生第一次故障后停止更新。

 var browserify = require('browserify'); var gulp = require('gulp'); var source = require("vinyl-source-stream"); gulp.task('browserify', function () { browserify(paths.src.client.app) .bundle() .on('error', function(err){ console.log(err.message); }) .pipe(source(paths.dest.client.bundle)) .pipe(gulp.dest(paths.dest.client.scripts)); }); gulp.task('watch-browserify', function () { gulp.watch([paths.src.client.scripts], ['browserify']) }); 

那么,因为我找不到任何解决scheme,将继续观看吞噬文件与browserify,我解决了这一点

 var exec = require('child_process').exec; var fs = require('fs'); //watching changes from watchFile command fs.watchFile('prim.js',[ { interval: 100 }] , function (curr, prev) { //running cli command on change exec('powershell.exe -Command "browserify prim.js -o main.js"', function(err, stdout, stderr) { console.log(stdout); }) .stdin.end(); }); 

只需在当前文件夹中添加一个helper.js文件(将其命名),设置path,然后在CLI运行该节点。 你甚至不需要在本地安装browserify,如果你有全球。 希望这可以帮助。