node.jsはどうやってファイルの変化を監視しますか?


fs.FSS Watch
fs.FSI Watch類はEventEmitterを継承し、ファイルの変化を監視するために使用され、fs.watchを呼び出してからfs.FSF Watchの例を返します。監視するファイルを指定するたびに修正されると、インスタンスはイベントをトリガしてコールバック関数を呼び出します。

fs.watch('./tmp', (eventType, filename) => {
 if (filename) {
  console.log(filename);
 }
});
fs.ウォッチ()fs.watch(filename[, options][, listener]) ファイルの変化を監視し、fs.FSI Watchの例を返す。
1.filename:ファイルまたはフォルダパス
2.options
  • encoding
  • recursive:デフォルト値falseは、すべてのサブディレクトリを監視するべきか、それとも現在のディレクトリだけを監視するべきか、macOSとWindowsだけで
  • をサポートします。
  • persistent:デフォルト値trueは、ファイルが監視されている場合、プロセスは
  • を実行し続けるべきかどうかを示しています。
  • listener(eventType、filename):ファイル変化コール機能
  • eventTypeは主にrenamechangeであり、ほとんどのプラットフォームにおいて、ファイルがディレクトリ内に出現または消失したときに「rename」イベントをトリガし、Windows上で監視されているディレクトリが移動されたり名前が変更されたりしたら、何のイベントもトリガされず、監視されているディレクトリが削除されたときに、EPERMエラーが報告される。
    
    fs.watch('./', { recursive: true }, (eventType, filename) => {
     console.log(eventType, filename);
    });
    fs.watch File()fs.watchFile(filename[, options], listener)は、ファイルの変化を監視するために使用されます。
    1.filename
    2.options
  • bitginnit:デフォルト値false、コールバックstatの値がbiginnitタイプ
  • かどうかを指定します。
  • persistent:デフォルト値true、ファイルが監視されている時、プロセスは
  • を実行し続けるべきですか?
  • interval:デフォルト値5007は、ポーリング頻度(ms)を指定するために使用されます。
  • 3.listener(currentStats、previous Stats):listenerは二つのパラメータがあり、現在のstatオブジェクトと前のstatオブジェクトがあります。
    ファイルの変更時に通知を受けるにはcurr.mtime prev.mtimeを比較する必要があります。
    
    const fs = require('fs');
    
    fs.watchFile('./test.txt', { interval: 100 }, (curr, prev) => {
     console.log('          : ' + curr.mtime);
     console.log('          : ' + prev.mtime);
    });
    
    const tid = setInterval(() => {
     fs.appendFile('./test.txt', 'Hello, world!
    ', err => { if (err) throw err; console.log(' '); }); }, 300); setTimeout(() => { clearInterval(tid); fs.unwatchFile('./test.txt'); }, 2000);
    fs.watch()とfs.watch File()
    fs.watch File()は輪訓方式でファイルの変化を検出しますので、intervalを設置しないか、高い値を設定しないとファイルの変化の監視が遅れています。
    fs.watch()はオペレーティングシステムから提供されたイベントを監聴して、しかもディレクトリの変化を監視して、fs.watch()を使ってfs.watFileよりもっと効率的で、普段はできるだけfs.watch()を使ってfs.watch Fileの代わりに使うべきです。
    もちろんfs.watch()はオペレーティングシステムの実現に依存しています。プラットフォームによって表現が違います。
  • Linuxオペレーティングシステムはinotify
  • を使用する。
  • は、macOSシステムでFEvents
  • を使用する。
  • ウィンドウズシステムでReadDirectoryChangesW
  • を使用します。
    fs.unwatch Filefs.unwatchFile(filename[, listener]) は、filenameの変化を監視し、listenerを指定すると、この特定のモニターだけを除去します。そうでないと、すべてのモニターを削除して、filenameの監視を停止します。fs.unwatchFile('./test.txt');コミュニティの選択
    fs.watch File()の性能問題、fs.watch()のプラットフォームが一致しないなどの二つの方法はいずれも気に入らないところがあります。
    Node.js fs.watch
    MacOSはfilenameを提供しない場合があります。
    一部のシーンでは修正イベントが発生しません(MacOS Sublime)
    頻繁に2回トリガーイベントを修正します。
    ほとんどのファイルの変更はeventTypeがrenameです。
    簡単な監視ファイルツリー方式が提供されていません。
    Node.js fs.watchFile
    事件の処理問題はfs.watchと同じです。
    ネストした待ち受けがありません
    CPUの消耗が大きい
    https://www.npmjs.com/package/chokidar
    日常的にファイルの変化を監視してコミュニティの優秀な方案を選ぶことができます。
  • node-watch
  • チョキダ
  • 
    const chokidar = require('chokidar');
     
    // One-liner for current directory
    chokidar.watch('.').on('all', (event, path) => {
     console.log(event, path);
    });
    
    // Initialize watcher.
    const watcher = chokidar.watch('file, dir, glob, or array', {
     ignored: /(^|[\/\\])\../, // ignore dotfiles
     persistent: true
    });
     
    // Something to use when events are received.
    const log = console.log.bind(console);
    // Add event listeners.
    watcher
     .on('add', path => log(`File ${path} has been added`))
     .on('change', path => log(`File ${path} has been changed`))
     .on('unlink', path => log(`File ${path} has been removed`));
     
    // More possible events.
    watcher
     .on('addDir', path => log(`Directory ${path} has been added`))
     .on('unlinkDir', path => log(`Directory ${path} has been removed`))
     .on('error', error => log(`Watcher error: ${error}`))
     .on('ready', () => log('Initial scan complete. Ready for changes'))
     .on('raw', (event, path, details) => { // internal
      log('Raw event info:', event, path, details);
     });
    以上はnode.jsがどのようにファイルの変化の詳しい内容を監視しますか?