node實現watcher的困境

2022-02-11 10:00:02 字數 2256 閱讀 9807

@(node,watcher)

watcher,在如今的前端領域已經數見不鮮了。目前流行的gulp流程工具提供了watcher的選項,是我們在開發過程中不需要手動進行觸發構建流程,轉而根據檔案(目錄)內容改變來觸發。

深入到watcher實現層,其實是基於node的fs.watch api,但是fs.watch有很多「不確定性」,下文會一一解答。

目錄

(fs.fswatcher) fs.watch(filename[, options][, listener])
watch api很簡單,接受三個引數,並返回乙個fswatcher物件。

filename可以是檔案,也可是目錄;

options為可選物件,預設為,其中persistent屬性意味著:watcher程序會一直watch該檔案(目錄),即watcher程序阻塞;recursive屬性意味著:如果監聽的是目錄,則目錄下屬的目錄和檔案也會被監聽,recursive屬性存在相容性問題,在linux系統下無效,在windows和osx下正常。

listener為**函式,接受兩個引數,分別為event和filename,其中事件有兩種型別,「rename」和「change」,而filename也有相容性問題,在使用時也要注意相容性判斷。

node提供了另乙個介面,

fs.watchfile(filename[, options], listener)
返回值同為fswatcher,引數filename可為目錄和檔案,options預設為

,其中interval則為node輪訓該檔案的時間間隔,listener接受兩個引數,即類行為fs.stat的curr和prev物件,我們可通過

curr.mtime == prev.mtime
判斷檔案是否發生改動。

不管在何種系統設計中,輪訓的方式都是相容性保底方案,只要我們的系統支援fs.watch方法,就不用採用該種方式進行相容。

那麼合適可以採用輪訓呢?我認為,大概分兩種情況:

針對非網路檔案系統,watch api的相容性就在於是否遞迴watch以及osx下filename獲取的問題,因此我們可以通過編碼方式解決:

通過簡單的處理,乙個簡易的watcher就實現了,配合著eventemit,就可以通過事件的方式完成watcher任務。

'use strict';

var fs = require('fs');

var path = require('path');

var os = require('os');

var watchlist = {};

var timer = {};

var walk = function (dir, callback, filter)

watch(fullname, callback, filter);

walk(fullname, callback, filter);

}});

};var watch = function (name, callback, filter)

watchlist[name] = fs.watch(name, function (event, filename)

var fullname = path.join(name, filename);

var type;

var fstype;

if (!filter(fullname))

// 檢查檔案、目錄是否存在

if (!fs.existssync(fullname)) else

type = 'delete';

} else else if (event === 'rename')

}var eventdata = ;

if (/windows/i.test(os.type())) , 16);

} else

});};/**

* @param 要監聽的目錄

* @param 檔案、目錄改變後的**函式

* @param 過濾器(可選)

*/module.exports = function (dir, callback, filter) ;

watch(dir, callback, filter);

walk(dir, callback, filter);

};

Z Blog 爬蟲 node實現

z blog 爬蟲 node實現 目前正在 更新中 一 需求 幫朋友建站,指定用z blog,安裝後,我發現採集文章不便,所以準備寫乙個node爬蟲,實現對友站文章的自動採集。二 實現之前的思考 1 熟悉z blog資料庫 z blog使用mysql資料庫,所以我需要知道z blog資料庫結構。2 ...

Watcher 對映可解決的安全攝像機

為了可移植性,watcher用c 11編寫。由於我願意重新設計輪子的數量有限,因此sdl 簡單directmedia層 提供了跨平台的視窗建立 opengl初始化 輸入處理和其他一些功能。imgu位於sdl和opengl之上,用於建立使用者介面,同時保持curl。對於資料管理,sqlite可以從程式...

node實現傳送郵件功能

以qq郵箱為例 1 登入qq郵箱 設定 賬戶,開啟裡面的smtp服務,具體操作可參考qq幫助中心。開啟成功以後就可以生成授權碼啦。2 安裝nodemailer外掛程式,新建乙個test.js檔案,寫下如下幾行 const nodemailer require nodemailer 1 建立 cons...