【JavaScript】【Node.js】ファイルの変更を監視して任意の関数を実行する fs.watch メソッドの紹介

 webpack の watch オプション的なことを手製のプログラムでする方法を紹介します。ファイルが変化する度、何かをしたい、という挙動は常に最新版のファイルを元にした変換後のファイルが欲しい、常に最新版のファイルをアップロードしたい、などといった需要があります。
 これは次の様に fs.watch を使って実装するのが楽です。

const fs = require("fs");

/**
 * 多重実行防止機能付きのファイル監視関数
 * @param {String} tgt
 * @param {()} callback
 */
function watch(tgt, callback) {
    // 起動したことをコンソールに伝える
    console.log('run replace.js watch mode')
    /** @var {Boolean} callback が二重に動くことを防止するための変数 */
    let lock = false;
    // @see https://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener
    fs.watch(tgt, {}, async () => {
        if (lock) {// lock がかかっている時は動作しない
            return;
        }
        lock = true;// 本筋に入ったら lock をかける
        try {
            // 渡された関数を実行
            await callback();
        } finally {
            // 渡された関数がどうなろうと lock を解除する
            lock = false;
        }
    });
}

watch(__dirname + "\\package.json", () => console.log('change package.json'))

 Node.js の fs.watch メソッドが強力ですので、それを使うのが便利です。

File system | Node.js v18.0.0 Documentation##

 これはファイルないしディレクトリのパスを渡して、そのパスの部分を監視して変化を通知します。上記のプログラムではそれに加えて無暗に処理が走らない様にしています。これによりファイルの読み書きが衝突しません。もし非同期実行実行で問題ないのであれば方がこの lock は不要です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG