@(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...