gulp.watchについて調べた(少しだけ)
はじめに
いつも何気なく使っている、gulp.watch
って中身どうなってるんだろうと思って気になったので調べた。(「中身」というほど調べていない)
gulpの依存関係を掘る
ソースを見てみると、gulpのwatch
はvinyl-fsのwatch
を使っていて、さらにそれはglob-watcherの(以下略
まとめると以下のような依存関係になっている。
gulp -> vinyl-fs -> glob-watcher -> gaze
gazeこそが求めているもののようだ。
gaze
ということで、gulpのwatch
は結局gazeのwatch
だということが分かった。
npmのgazeのページにも確かに、
Used by Grunt, gulp, Tower and many others
と書いてある。
で、gazeのwatch
を見ると、npm install gaze
でインストールされる安定版のv0.5.1と、v0.6.x以降で異なるもよう。
まず、v0.5.1では、NodeのAPIのfs.watch
とfs.watchFile
を使っている。
対してv0.6.xからはコア部分がネイティブモジュール化されており、C++で書かれている。
上記npmページのFAQにも、
gaze doesn't wrap fs.watch or fs.watchFile anymore
って書かれてる。デフォルトで入るv0.5.1ではwrapしてるんだけどな。
fs.watch
とfs.watchFile
gazeの安定版のv0.5.1は結局fs.watch
とfs.watchFile
なので、これらについてドキュメントを読んでみる。
File System Node.js v0.12.2 Manual & Documentation
以下も参考になった。
Node.js の fs.watch() と fs.watchFile() の違い - てっく煮ブログ
簡単に言うと、fs.watch
はOSネイティブのファイルシステムの変更検知の仕組みを使っていて、確実で速いけれどすべての状況で使えるわけではない。
一方fs.watchFile
はファイルシステムのステータスをポーリングしており、遅いけど環境を選ばない。そして以下の通り、できる限りfs.watch
を使うこと、となっている。
Stability: 2 - Unstable. Use fs.watch instead, if possible.
その先
fs.watch
やfs.watchFile
、あるいはgaze v0.6.xの中身については、今後の課題とする。。
まとめ
watch
についてちょっと理解が深まった- C++読むだけでもできるようにならねば