nodejs 文件目录监听 chokidar watchpack

文件监听实现,推荐使用chokidar:


chokidar  默认是基于事件监听文件


const chokidar = require("chokidar");
const folderToWatch = path.join(__dirname, "lib");
const watcher = chokidar.watch(folderToWatch, {
  ignored: /(^|[/\\])\../,
  persistent: true,
});
watcher.on("change", (filePath) => {
  console.log(` ${filePath} 发生变化. 重新生成config/gateway.config.yml...`);
  generator();
});
watcher.on("error", (error) => {
  console.error(`监听器报错: ${error}`);
});


在大多数其他平台上,基于 fs.watch的实现是默认的,这可以避免轮询并降低 CPU 使用率。
fs.watch 与 fs.watchFile区别:
fs.watch 方法会利用操作系统提供的文件系统事件通知机制来监听文件的改动。
能够更高效地捕捉到文件或文件夹的变化,不需要通过轮询来检查文件状态。在不同的操作系统上,它可能使用的底层实现不同,如inotify(Linux)、FSEvents(macOS)或ReadDirectoryChangesW(Windows)
fs.watchFile 方法使用轮询的方式来检查文件的状态变化,在指定的时间间隔内不断检查文件的最后修改时间和大小。如果发现文件发生了变化,就会触发回调函数。可能引起一些性能问题,特别是当处理较大的文件时或者监视较多的文件时。


常用配置项:
useFsEvents:默认为true。 是否基于FSEvent事件监听文件变化。当显式设置true并且fsevents可用时,它将取代usePolling的设置。
awaitWriteFinish(默认:false)。默认情况下,add当文件首次出现在磁盘上时(在写入整个文件之前),该事件将触发。此外,在某些情况下,change 在写入文件时会发出一些事件。在某些情况下,特别是在监视大文件时,需要等待写入操作完成才能响应文件创建或修改。设置awaitWriteFinish为true(或真值)将轮询文件大小,保留其add和change事件,直到大小在可配置的时间内不发生变化。适当的持续时间设置在很大程度上取决于操作系统和硬件。为了准确检测,此参数应该相对较高,从而使文件监视的响应速度大大降低。谨慎使用。
alwaysStat(默认:false)。如果依赖于 fs.Stats 可能通过add、addDir和change事件传递的对象,请将其设置为true以确保即使在底层监视事件尚不可用的情况下也能提供该对象。
options.awaitWriteFinish可以设置为一个对象以调整计时参数:
    awaitWriteFinish.stabilityThreshold(默认值:2000)。文件大小在发出事件之前保持不变的时间量(以毫秒为单位)。
    awaitWriteFinish.pollInterval(默认值:100)。文件大小轮询间隔,以毫秒为单位。

usePolling,默认值为false。 表示是否使用fs.watchFile()进行轮询操作,由于轮询会导致cpu飙升,所以此选项通常在需要通过网络监视文件的时候才设置为true
轮询特定设置(在usePolling: true 时有效)
    interval(默认:100)。文件系统轮询的时间间隔,以毫秒为单位。您还可以设置 CHOKIDAR_INTERVAL 环境变量来覆盖此选项。
    binaryInterval(默认:300)。文件系统轮询二进制文件的时间间隔。

persistent 默认值为true。与原生fs.watch一样,表示是否保护进程不退出持久监听,
ignored 所要忽略监听的文件或者文件夹
ignoreInitial 默认值为false(表示add/addDir会触发事件)。表示是否忽略对增加文件或者增加文件夹的时候进行发送事件,
cwd 没有默认值,类似于appBasepath,监听的paths所相对的路径。
depth没有默认值,如果设定则表示限定了会递归监听多少个子目录。


watchpack 只能是基于轮训监听文件。

通过poll参数控制轮训间隔 默认100毫秒。
var Watchpack = require("watchpack");
        this.wp = new Watchpack({
            aggregateTimeout: m.aggregateTimeout || 2000, // fire "aggregated" event when after a change for 2000ms no additional change occurred.  
            poll: 2000, // ms 
            followSymlinks: false,
            ignored: "**/.git"
        });
        let config = {
            files: _.map(m.files, (file) => { return path.join( rootDir, `/config/${file.path}/${file.name}.json`, ); }),
            startTime: Date.now() - (m.startTime || 10000)
        }
        this.wp.watch(config);
        this.wp.on("change", function (filePath, mtime, explanation) { });
        this.wp.on("remove", function (filePath, explanation) { });
        this.wp.on("aggregated", function (changes, removals) {
            child_process.execSync(cmd);
        });

你可能感兴趣的:(node.js,服务器,linux)