亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

node.js監聽文件變化的實現方法

2024-05-06 16:50:03
字體:
來源:轉載
供稿:網友

前言

隨著前端技術的飛速發展,前端開發也從原始的刀耕火種,向著工程化效率化的方向發展。在各種開發框架之外,打包編譯等技術也是層出不窮,開發體驗也是越來越好。例如HMR,讓我們的更新可以即時可見,告別了手動F5的情況。其實現就是監聽文件變化自動調用構建過程。下面就關注下如何實現node監聽文件變化。

場景

假定要監聽index.js,每當內容更改重新編譯。

我們就用簡單的console來標識執行編譯。下面就是實現該功能。

node原生API

fs.watchFile

翻下node的文檔就會看到一個滿足我們需求的Apifs.watchFile(畢竟是文件相關的操作,很大可能就在fs模塊下面了)。

fs.watchFile(filename[, options], listener)
  • filename 顯然就是文件名
  • options 可選 對象 包含以下兩個屬性
    • persistent 文件被監聽時進程是否繼續,默認true
    • interval 多長時間輪訓一次目標文件,默認5007毫秒
  • listener 事件回調 包含兩個參數
    • current 當前文件stat對象
    • prev 之前文件stat對象

看完參數信息,不知道大家有沒有從其參數屬性中得到點什么特別的信息。特別是interval選項和listener中的回調參數。

監控filename對應文件,每當訪問文件時會觸發回調。

這里每當訪問文件時會觸發,實際指的是每次切換之后再次進入文件,然后保存之后,無論是否做了修改都會出發回調。

另外輪詢事件和文件對象,是不是可以猜測,其實現監聽的原理,固定時間輪詢文件狀態,然后將前后的狀態返回,將判斷交給使用者。

所以node也建議,如果要獲取文件修改,那么需要根據stat對象的修改時間來進行對比,即比較 curr.mtime 和 prev.mtime。

這樣就有點問題,我們先看下例子,會更清晰一點。

const fs = require('fs')const filePath = './index.js'console.log(`正在監聽 ${filePath}`);fs.watchFile(filePath, (cur, prv) => { if (filePath) {  // 打印出修改時間  console.log(`cur.mtime>>${cur.mtime.toLocaleString()}`)  console.log(`prv.mtime>>${prv.mtime.toLocaleString()}`)  // 根據修改時間判斷做下區分,以分辨是否更改  if (cur.mtime != prv.mtime){   console.log(`${filePath}文件發生更新`)  } }})

然后測試結果如下:

// 運行 
node watch1.js
// 1、訪問index.js 不做修改,然后保存
// 2、切換文件,再次訪問,不做修改,只報錯
// 3、編輯內容,并保存

node.js,監聽,文件

可以看到1、2兩步,并沒有實際修改內容,然而我們并沒有辦法區分。只要你是切換之后再保存,修改時間戳mtime就發生變化。

另外響應時間真的很慢,畢竟是輪詢。

對于這些問題,其實官網也給了一句話:

Using fs.watch() is more efficient than fs.watchFile and fs.unwatchFile. fs.watch should be used instead of fs.watchFile and fs.unwatchFile when possible.

能用fs.watch的情況就不要用watchFile了。一是效率,二是不能準確獲知修改狀態 三是只能監聽單獨文件
對于實際開發過程中,顯然我們想要關注的是源文件夾的變動。

fs.watch

首先用法如下:

fs.watch(filename[, options][, listener])

跟fs.watchFile比較類似。

  • filename 顯然就是文件名
  • options 可選 對象或者字符串 包含以下三個屬性
    • persistent 文件被監聽時進程是否繼續,默認true
    • recursive 是否監控所有子目錄,默認false 即當前目錄,true為所有子目錄。
    • encoding 指定傳遞給回調事件的文件名稱,默認utf8
  • listener 事件回調 包含兩個參數
    • eventType 事件類型,rename 或者 change
    • filename 當前變更文件的文件名

options如果是字符串,指的是encoding。

監聽filename對應的文件或者文件夾(recursive參數也體現出來這一特性),返回一個fs.FSWatcher對象。

該功能的實現依賴于底層操作系統的對于文件更改的通知。 所以就存在一個問題,可能不同平臺的實現不太相同。
如下示例1:

const fs = require('fs')const filePath = './' console.log(`正在監聽 ${filePath}`);fs.watch(filePath,(event,filename)=>{ if (filename){  console.log(`${filename}文件發生更新`) }})

一個比較明顯的優勢就體現出來了:響應比較及時,相比于輪詢,效率肯定更高。

不過這樣修改并保存的時候回發現同樣有點問題。

直接保存,顯示兩次更新

修改文件之后,同樣顯示兩次更新(mac系統上是兩次,其他系統可能有所差別)

node.js,監聽,文件

這樣可能是于操作系統對文件修改的事件支持有關,在保存的時候出發了不止一次。

下面聚焦于回調事件的參數,event對應事件類型,是否可以判斷事件類型為change呢,才執行呢,忽略空保存。

const fs = require('fs')const filePath = './'  console.log(`正在監聽 ${filePath}`);fs.watch(filePath,(event,filename)=>{  console.log(`event類型${event}`)  if (filename && event == 'change') {    console.log(`${filename}文件發生更新`)  }})

不過實際上,空的保存event也是change,另外不同平臺event的實現可能也有所不同。這種方式要pass掉。

校驗變更時間

顯然從上面的例子可以看到,變更時間依然不可控。因為每次保存,node對應stat對象依然會修改。

對比文件內容

只能選擇這種方式來判斷是否是否更新。例如md5:

const fs = require('fs'),  md5 = require('md5');const filePath = './'  let preveMd5 = nullconsole.log(`正在監聽 ${filePath}`);fs.watch(filePath,(event,filename)=>{  var currentMd5 = md5(fs.readFileSync(filePath + filename))  if (currentMd5 == preveMd5) {    return  }  preveMd5 = currentMd5  console.log(`${filePath}文件發生更新`)})

先保存當前文件md5值,每次文件變化時(即保存操作響應之后),每次都獲取文件的md5然后進行對比,看是否發生變化。

node.js,監聽,文件

不過這樣可以看到,當初次保存時,都會執行一次,因為初始值為null的緣故。這樣可以加個兼容,根據是否第一次保存來判斷好了。

優化

對于不同的操作系統,可能保存時觸發的回調不止一個(mac上到沒出現)。為了避免這種實時響應對應的頻繁觸發,可以引入debounce函數來保證性能。

const fs = require('fs'),  md5 = require('md5');let preveMd5 = null,  fsWait = falseconst filePath = './'  console.log(`正在監聽 ${filePath}`);fs.watch(filePath,(event,filename)=>{  if (filename){    if (fsWait) return;    fsWait = setTimeout(() => {      fsWait = false;    }, 100)    var currentMd5 = md5(fs.readFileSync(filePath + filename))    if (currentMd5 == preveMd5){      return     }    preveMd5 = currentMd5    console.log(`${filePath}文件發生更新`)  }})

結束語

到這里,node監聽文件的實現就結束了。做個學習筆記,來做個參考記錄。實現起來并不難,但是要實際應用的話需要考慮的方面就比較多了。還是推薦開源框架node-watch、chokidar等,各方面實現的都比較完善。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。

參考文章


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av高清| 日韩电影免费观看中文字幕| 国产精品永久免费在线| 91成人福利在线| 日韩视频在线一区| 欧美疯狂xxxx大交乱88av| 日韩欧美精品免费在线| 国产精品热视频| 欧美激情一区二区三级高清视频| 亚洲精品一区在线观看香蕉| 91精品成人久久| 久热99视频在线观看| 性欧美办公室18xxxxhd| 国产欧美在线看| 亚洲欧洲美洲在线综合| 亚洲欧美成人一区二区在线电影| 主播福利视频一区| 亚洲免费视频一区二区| 国产精品美女www爽爽爽视频| 91国产美女视频| 亚洲新中文字幕| 国产一区二区三区视频在线观看| 国产精品流白浆视频| 亚洲国产精品人人爽夜夜爽| 亚洲伊人成综合成人网| 26uuu久久噜噜噜噜| 久久久久亚洲精品成人网小说| 亚洲一区二区三区四区在线播放| 91欧美精品午夜性色福利在线| 国产91在线播放九色快色| 欧美亚洲日本网站| 欧美日韩国内自拍| 国产精品青青在线观看爽香蕉| 91在线国产电影| 久久久久久久香蕉网| 中文字幕在线观看亚洲| 国产欧美精品va在线观看| 中文字幕精品久久久久| 欧美老女人在线视频| 亚洲成人三级在线| 日韩精品在线观看一区| 亚洲xxxx18| 插插插亚洲综合网| 精品伊人久久97| 国产欧美日韩高清| 精品久久久精品| 欧美成人黑人xx视频免费观看| 亚洲女人天堂色在线7777| 日本免费一区二区三区视频观看| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品免费一区二区三区| 中文字幕日韩精品在线| 欧美日韩国产中文精品字幕自在自线| 91夜夜未满十八勿入爽爽影院| 欧美巨乳在线观看| 成人h片在线播放免费网站| 中文字幕在线亚洲| 国产精品男人的天堂| 91高清视频在线免费观看| 亚洲天天在线日亚洲洲精| 亚洲欧美中文在线视频| 亚洲午夜小视频| 久久偷看各类女兵18女厕嘘嘘| 国产97色在线|日韩| 一区二区三区视频免费在线观看| 日本在线精品视频| 亚洲四色影视在线观看| 国产精品久久久久久久久久新婚| 国产欧美精品va在线观看| 在线国产精品视频| 96国产粉嫩美女| 国产区精品视频| 国产精品久久久久久亚洲调教| 国产精品爽黄69| 欧美精品激情blacked18| 国产欧美一区二区三区四区| 亚洲国产小视频在线观看| 国产精品美女网站| 91av在线免费观看视频| 97成人超碰免| 日韩av免费在线观看| 91高清视频免费| 久久精品91久久久久久再现| 亚洲电影免费观看高清完整版在线观看| 91欧美激情另类亚洲| 国产精品日日摸夜夜添夜夜av| 亚洲天堂av在线免费| 欧美插天视频在线播放| 亚洲电影免费观看高清完整版在线观看| 97超视频免费观看| 5278欧美一区二区三区| 国产小视频国产精品| 日本免费在线精品| 精品久久久久久久久久ntr影视| 性夜试看影院91社区| 欧美日韩黄色大片| 国产精品福利在线观看| 欧美日韩一区二区三区在线免费观看| 日韩少妇与小伙激情| 成人亲热视频网站| 欧美性xxxxxxx| 亚洲激情在线观看视频免费| 尤物九九久久国产精品的特点| 欧美日韩亚洲精品内裤| 国产日韩欧美在线看| 欧美日韩亚洲精品一区二区三区| 欧美午夜性色大片在线观看| 国产日韩在线视频| 欧美丰满少妇xxxxx| 一本色道久久88综合亚洲精品ⅰ| 亚洲春色另类小说| 夜夜嗨av色一区二区不卡| 欧美亚洲国产日韩2020| 久99九色视频在线观看| 亚洲欧美日韩久久久久久| 欧美成aaa人片免费看| 91chinesevideo永久地址| 国产精品久久久久久久久男| 91久久精品国产91久久性色| 国产综合色香蕉精品| 国产精品夜间视频香蕉| 久久夜色精品亚洲噜噜国产mv| 色阁综合伊人av| 中文字幕亚洲一区二区三区| 综合激情国产一区| 欧美巨猛xxxx猛交黑人97人| 国产主播欧美精品| 丝袜亚洲欧美日韩综合| 欧美亚洲视频在线观看| 国产一级揄自揄精品视频| 日韩理论片久久| 中文字幕av一区二区| 国产成人拍精品视频午夜网站| 日韩国产欧美精品一区二区三区| 国产噜噜噜噜久久久久久久久| 国产精品老牛影院在线观看| 92版电视剧仙鹤神针在线观看| 一本色道久久综合狠狠躁篇的优点| 日韩高清欧美高清| 欧美成人精品xxx| 日韩h在线观看| 国产日韩精品在线播放| www.欧美精品一二三区| 一区二区三区回区在观看免费视频| 欧美乱妇40p| 麻豆国产va免费精品高清在线| 色偷偷综合社区| 欧美激情第1页| 尤物yw午夜国产精品视频| 成人国产精品一区| 国精产品一区一区三区有限在线| 国产一区二区三区直播精品电影| 精品国产91久久久久久老师| 久久99精品久久久久久噜噜| 国产精品免费一区二区三区都可以| 国产精品9999| 97在线免费视频| 久久久久久久久网站| 欧美日韩视频免费播放| 亚洲精品第一页| 国产精品96久久久久久又黄又硬| 91高清视频免费| 久久久久成人精品| 国产精品免费观看在线|