2014-04-18 30 views
20

Używam gulp + browserify do budowania i pakowania mojej biblioteki javascript. Teraz jest jedna rzecz, która mnie niepokoi: Używam prostego serwera z livereload dla rozwoju poprzez gulp. Działa to dobrze, ale gdy mój javascript zawiera błąd składniowy, przeglądarka powoduje błąd powodujący zatrzymanie serwera.Catching Browserify parsować błąd (samodzielna opcja)

browserify kod używam (zauważ, że dodałem procedurę obsługi błędu):

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

Teraz przychodzi interesująca część: Kiedy usunąć ustawienia autonomicznego (i moje js jest syntacticaly niepoprawne), uruchamiany jest moduł obsługi błędów. Jednak gdy używam tego ustawienia autonomicznego, obsługa błędu nie uruchamia się (co powoduje, że serwer uruchomił się, zatrzymując haust).

Czy ktoś wie, jak sobie z tym poradzić? Zawsze mogłem ręcznie sprawdzać poprawność moich plików js, ale chciałem uniknąć tego obejścia.

Odpowiedz

54

Impreza on('error') nadal zwolniony. Jednak strumień przeglądania jest trochę inny niż inny strumień Gulp. W funkcji obsługi błędu browserify, trzeba jawnie wywołać this.emit("end")

Przykładem łyk zadanie

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')); 
}); 

błąd funkcji obsługi zapobiega łyk z upaść, this.emit("end") zatrzymuje bieżący strumień, nie pozwól, by biec do następne rury. Program obsługi zdarzeń może również wykryć błąd w wtyczce transformacji.

Aby uzyskać więcej informacji na ten temat można przeczytać tutaj http://truongtx.me/2014/07/15/handle-errors-while-using-gulp-watch/

+0

Doskonały, wolałbym takie podejście od mojego obejścia –

+0

Dziękuję! 'this.end()' zrobił lewę. –

+4

Kiedy używam tego podejścia, "gulp.watch" zatrzymuje aktualizację po pierwszej awarii, nawet jeśli źródło problemu zostało poprawione. Czy istnieje sposób zapobiegania przerywaniu zegarka? – jneander

1

Ponieważ nikt nie wysłał odpowiedzi (proszę, popraw mnie, jeśli masz lepsze rozwiązanie!), Oto sposób obejścia problemu. ve dodano, aby mój przypadek użycia działał. Rozumiem, że planowana wersja Gulp (v4) będzie lepiej obsługiwać błędy, prawdopodobnie rozwiązując ten problem. Jednak na razie używam js validator

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')) 
    }); 
}); 
+0

Jeśli mogę zapytać, w jaki sposób wstawiłbyś ten kod do pliku gulp? wewnątrz zadania? Mam problemy z gulp-jsvalidate. –

+2

cześć Manuel. właśnie dodałem bardziej rozbudowany przykład. aby zobaczyć pełny przykład: https: // github.com/YASGUI/YASQE/blob/master/gulpFile.js –

+0

@LaurensRietveld ten link nie działa –

1

dobrze, bo nie mogłem znaleźć żadnych rozwiązań, które będą nadal oglądać plik łyk z browserify, postanawiam tym

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(); 
}); 

Wystarczy dodać helper.js (nazwij go, jak chcesz) w bieżącym folderze, ustaw ścieżki i uruchom ten plik w węźle z CLI. Nie musisz nawet instalować przeglądarki internetowej lokalnie, jeśli masz ją globalnie. Mam nadzieję że to pomoże.

1

Oto kod, który zapobiega zadanie haustem od awarii w przypadku łączenie błędów. Jest to nieco zmodyfikowana wersja kodu opublikowanego przez @tmtxt. Problem, który miałem z jego wersją, polegał na tym, że "gulp.watch" przestał się aktualizować po pierwszej awarii.

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']) 
}); 
+0

zamiast gulp.watch , możesz użyć watchify, po prostu zmień kod nieco http://truongtx.me/2014/08/06/using-watchify-with-gulp-for-fast-browserify-build/ – tmtxt