コンパイラかく語りき

import { Fun } from 'programming'

【node.js】fs.watchでファイルを監視

スクランナーやバンドラのwatch機能ってあるじゃないですか。あれらはもちろん知っていたのですが、nodeの標準パッケージにもwatchがあるんですね。初めて知りました。

というわけでメモ。

 

fs.watch

使い方:fs.watch(filename[, options][, lister])

指定したファイルの変更を監視します。戻り値は、fs.FSWatcherというオブジェクトのようです。

オプション(options)は、デフォルトで { persistent: true, recursive: false }のようです。persistentは監視を続けるかどうか、recursiveはディレクトリ構造を掘り下げて監視するかどうか、をそれぞれ指定できるようです。

というか、persistentをfalseにしてしまったらwatchではないような。。。

リスナー(lister)はコールバック関数で、eventとfilenameの2つの引数をとります。eventが'rename'か'change'で、filenameがイベントを引き起こしたファイルの名前です。

公式:File System Node.js v5.10.0 Manual & Documentation

 

使ってみる

さっそく使ってみます。

 

ファイル名とイベントの取得

まずは最小構成で実行してみます。

ためしに以下のようなファイルを作成しました。

f:id:chuck0523:20160403162337p:plain

fs-watch.jsが監視を行うファイルで、index.jsが監視対象です。

fs-watch.jsの処理内容は以下のとおりです。

gista5794d1aa136b945c250581d2579bdc1

ファイルに変更があった際に、そのファイル名とイベントを出力します。

 

まずは、監視をスタートします。

$ node fs-watch.js

 

監視が始まりますので、この状態で、index.jsを変更します。

f:id:chuck0523:20160403162602p:plain

'a'という文字を加えて保存します。すると、

f:id:chuck0523:20160403162622p:plain

 変更を加える度に、その旨が表示されます。

 

また、ファイル名を変更した際も、

f:id:chuck0523:20160403162750p:plain

 

きちんと表示がされます。

f:id:chuck0523:20160403162757p:plain

 

ふむ。

コールバック関数にコンパイル的な処理を書けば、いわゆるwatch機能が完成しそうですね。

また次回watch機能を書いてみます。

 

注意

ちなみに、fs.watchはすべてのプラットフォームできちんと動くわけではないようです。

File System Node.js v5.10.0 Manual & Documentation

 

それと、fs.watchFileという似たような関数がありますが、fs.watchが推奨のようです。

File System Node.js v5.10.0 Manual & Documentation