質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

Q&A

解決済

1回答

2917閲覧

Gulp JSHintでError Warningsが無い時だけ次のタスクを実行してリロードさせたい

KiKiKi_KiKi

総合スコア596

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

0グッド

0クリップ

投稿2015/09/08 19:42

編集2015/09/08 19:51

gulp.watchでjavascriptのファイルを監視。変更があった時下記のような処理を行わせたいです。

  1. JSHintでチェック
  2. 問題がなければconcatなどで結合
  3. 全てのタスクが終了したらbrowser-syncで画面をリロード

grupfile.jsを作成したのですが、下記の問題が解消できておりません。
a. JSHintで問題が検出されても次のタスクを実行してしまう
b. JSHintで問題があると1度はbrowser-syncでリドードできるが、
その後javascriptファイルを変更してもタスクが実行されなくなってしまう。
(javascriptだけwatchされなくなる?)

json

1 "devDependencies": { 2 "browser-sync": "^2.9.1", 3 "gulp": "^3.9.0", 4 "gulp-concat": "^2.6.0", 5 "gulp-if": "^1.2.5", 6 "gulp-jshint": "^1.11.2", 7 "gulp-load-plugins": "^0.10.0", 8 "jshint-stylish": "^2.0.1", 9 "main-bower-files": "^2.9.0", 10 "run-sequence": "^1.1.2" 11 }

gulpfile.js

javascript

1var gulp = require("gulp"), 2 $ = require('gulp-load-plugins')(), 3 browserSync = require('browser-sync'), 4 runSequence = require('run-sequence'), 5 concat = require("gulp-concat"), 6 jshint = require("gulp-jshint"), 7 reload = browserSync.reload; 8 9gulp.task('jshint', function () { 10 return gulp.src(devDir + '/js/*.js') 11 .pipe( jshint() ) 12 .pipe( jshint.reporter('jshint-stylish') ) 13 .pipe( $.if(!browserSync.active, jshint.reporter('fail')) ); 14 // .pipe( reload({stream: true, once: true}) ); 15 // ↑ここにオプションを与えてリロードする処理を書けば 16 // JSHintでエラーがあっても watch されなくなることは無いが 17 // エラーの有無に関わらずリロードされてしまう 18}); 19 20gulp.task('concat.js', function(cb) { 21 return gulp.src(devDir + '/js/*.js') 22 .pipe( concat('main.js') ) 23 .pipe( gulp.dest( destDir + '/js' ) ); 24}); 25 26// Javascript Task 27gulp.task('js', function(cb) { 28 runSequence('jshint', 'concat.js', cb); 29 // runSequence('jshint', 'concat.js', reload); 30 // ↑ 最後にreloadのタスクを実行させるようにすると 31 // JSHintでエラーなどがあると、その後 gulp.task('js')が実行されなくなる 32 // リロードを別の gulp.task() を作って実行しようとしても同様 33 34 // runSequence('jshint', 'concat.js', reload, cb); 35 // ↑ エラーになり実行できない書き方 36}); 37 38// watch 39gulp.task('default', function() { 40 gulp.watch([devDir + '/js/*.js'], ['js']); 41});

タスクの最後にオプションを与えてリロードの処理を実行させるようにすれば、watchされなくなる問題は発生しないようなので、個人的にはJSHintで問題が検出されたら次のタスクを実行しないようにできれば、問題は解決できそうかなと思っています。
この問題の解決に至る事ができなかったので質問させて頂きました。
何卒よろしくお願いします。

[参考]
Web Starter Kit で JavaScript のライブラリを利用しようとしたらエラーで gulp のサーバーが止まってしまう場合の対応 - HAM MEDIA MEMO

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

JSHintでエラーが発生した時にタスクをそこで止めて、かつwatchが切れないようにする方法にて自己解決しました。
使用しているプラグインのバージョンは質問欄を参照ください。

どうやらjshint.reporter('fail')でstreamが停止するという問題は修正されていたっぽく
.pipe( $.if(!browserSync.active, jshint.reporter('fail')) ) とせず
単にpipe( jshint.reporter('fail') )でそれ以降のタスクを実行しないようにできました。

また、JSHintでエラー/ワーニングがあるとjavascriptファイルだけ監視されなくなる問題も
最後のタスクに.pipe( reload({stream: true, once: true}) );を付けて実行するか
reloadというタスクを作成しrunSequence('jshint', 'taskName', ... 'reload', cb)とすることでJSHintで問題があってもファイルの監視が切れる事は無くなりました。

EX: gulpfile.js

javascript

1var gulp = require("gulp"), 2 $ = require('gulp-load-plugins')(), 3 browserSync = require('browser-sync'), 4 runSequence = require('run-sequence'), 5 concat = require("gulp-concat"), 6 jshint = require("gulp-jshint"); 7 8gulp.task('jshint', function () { 9 return gulp.src(devDir + '/js/*.js') 10 .pipe( jshint() ) 11 .pipe( jshint.reporter('jshint-stylish') ) 12 .pipe( jshint.reporter('fail') ); // ← 変更 13}); 14 15gulp.task('concat.js', function(cb) { 16 return gulp.src(devDir + '/js/*.js') 17 .pipe( concat('main.js') ) 18 .pipe( gulp.dest( destDir + '/js' ) ); 19}); 20 21// Reload TASK 22gulp.task('reload', function(cb) { 23 return gulp.src('/') 24 .pipe( browserSync.reload({stream: true, once: true}) ); 25}); 26 27// Javascript Task 28gulp.task('js', function(cb) { 29 runSequence('jshint', 'concat.js', 'reload', cb); 30}); 31 32// watch 33gulp.task('default', function() { 34 gulp.watch([devDir + '/js/*.js'], ['js']); 35});

ただ、gitHubのチケット上の解決したコメントは__1 Jul 2014__で、問題があったってblogの日時は__2014-07-05__なので、どうなんだろう?その後さらにアップデートされて問題が解決したのでしょうか???

ちょっとリロードタスクの実効のさせ方がキモチワルイですが、一旦はコレで意図した挙動になったので解決とさせていただきます。

投稿2015/09/09 05:39

KiKiKi_KiKi

総合スコア596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問