light log

学んだこととか

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のAPIfs.watchfs.watchFileを使っている。

対してv0.6.xからはコア部分がネイティブモジュール化されており、C++で書かれている。

上記npmページのFAQにも、

gaze doesn't wrap fs.watch or fs.watchFile anymore

って書かれてる。デフォルトで入るv0.5.1ではwrapしてるんだけどな。

fs.watchfs.watchFile

gazeの安定版のv0.5.1は結局fs.watchfs.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.watchfs.watchFile、あるいはgaze v0.6.xの中身については、今後の課題とする。。

まとめ

  • watchについてちょっと理解が深まった
  • C++読むだけでもできるようにならねば