国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

用Node.js手寫熱重載:原理、實(shí)現(xiàn)與踩坑指南

用Node.js手寫熱重載:原理、實(shí)現(xiàn)與踩坑指南 如果你每天都在改代碼→切瀏覽器→按刷新→等頁面加載這個(gè)循環(huán)里待著說明你的前端開發(fā)工作流還缺了最后一環(huán)自動(dòng)化。這個(gè)需求太常見了幾乎所有現(xiàn)代構(gòu)建工具都內(nèi)置了熱更新能力但很多人只是把它當(dāng)黑盒使用——頁面為什么自己刷新了、文件監(jiān)聽到底原理是什么、壞了怎么排查一概不知。我也經(jīng)歷過這個(gè)階段后來干脆花了一晚上用Node.js原生能力加一個(gè)WebSocket庫從零手寫了一個(gè)能用的熱重載頁面腳本徹底搞懂了底層的每一步。這篇就把完整過程和踩過的坑寫出來。熱重載頁面說白了就是三件事起一個(gè)本地靜態(tài)文件服務(wù)、監(jiān)聽文件內(nèi)容變化、把變化了這個(gè)信號(hào)推送到瀏覽器然后自動(dòng)刷新。它非常適合靜態(tài)頁面、輕量Demo、活動(dòng)頁這類不依賴重型構(gòu)建鏈的項(xiàng)目也適合任何想理解前端自動(dòng)化底層的開發(fā)者。你不需要先會(huì)框架只要懂一點(diǎn)Node.js基礎(chǔ)就能跟著跑起來。1. 熱重載到底在優(yōu)化什么一次改代碼實(shí)時(shí)看效果的拆解在動(dòng)手寫代碼之前我覺得有必要先把熱重載這個(gè)概念解剖清楚。很多新手會(huì)把熱重載和模塊熱替換HMR混為一談但它們解決的問題層次完全不同這種認(rèn)知偏差會(huì)在后面寫代碼時(shí)帶來很大的方向性問題。1.1 手動(dòng)刷新丟失的不僅是時(shí)間還有心流狀態(tài)改一個(gè)CSS顏色值人眼在編輯器里看的是代碼里的#409EFF但最終效果在瀏覽器渲染層才能看到。如果每次改完都要切窗口、找刷新按鈕、等資源重新加載一天下來這個(gè)動(dòng)作不知道要重復(fù)多少次。這種機(jī)械操作最傷的不是時(shí)間而是專注力——每次打斷都要重新進(jìn)狀態(tài)比網(wǎng)絡(luò)請(qǐng)求慢多了。熱重載頁面把這個(gè)環(huán)節(jié)壓縮成了保存即看到結(jié)果。它本質(zhì)上是在幫你完成一個(gè)動(dòng)作鏈文件系統(tǒng)發(fā)生變化 → 監(jiān)聽器檢測(cè)到事件 → 通知瀏覽器 → 瀏覽器重新拉取資源。鏈條上的每一步都值得單獨(dú)優(yōu)化這也是我后面把架構(gòu)拆成三個(gè)組件的原因。1.2 現(xiàn)有方案的兩類局限黑盒依賴和殺雞用牛刀大部分人在真實(shí)項(xiàng)目里用的是腳手架自帶的HMR功能比如創(chuàng)建項(xiàng)目時(shí)自動(dòng)配好的開發(fā)服務(wù)器。它確實(shí)好用但有個(gè)共同特點(diǎn)你只看到的是一行配置或一句命令內(nèi)部的工作機(jī)制被完整封裝。一旦遇到文件改了但頁面沒刷新這類基礎(chǔ)問題你翻開文檔也只能找到重啟開發(fā)服務(wù)器這種粗放解法。另一類方案是通用刷新工具比如帶自動(dòng)刷新的編輯器插件或?yàn)g覽器插件。這類工具勝在配置簡單但它的監(jiān)聽范圍、刷新策略都是固定的你沒法針對(duì)特定目錄做精細(xì)控制也沒法在頁面里加入自己的處理邏輯——比如我只想在CSS變化時(shí)替換樣式而不想整頁刷新通用工具就很難滿足。1.3 自己實(shí)現(xiàn)熱重載頁面能獲得什么做輪子不是目的理解機(jī)制才是。自己用Node.js寫一遍熱重載你會(huì)獲得三層收益首先是原理層面的認(rèn)知你會(huì)清楚知道瀏覽器和本地服務(wù)之間的消息是怎么流動(dòng)的其次是定制能力想監(jiān)聽哪類文件、想合并多快內(nèi)的變更事件、要不要排除目錄全都變成幾行配置最后是故障排查能力以后再用任何工具熱更新失效你能迅速判斷是哪一環(huán)出了問題。我這次的目標(biāo)很明確不用任何重型框架只依賴Node.js原生模塊和一個(gè)WebSocket庫寫一個(gè)約百行代碼、能跑起來的完整熱重載服務(wù)。這個(gè)量級(jí)正好適合把原理講透也足夠在真實(shí)項(xiàng)目中頂一陣子。2. 自己從零搭熱重載的三大核心件靜態(tài)服務(wù)、文件監(jiān)聽、消息通道整個(gè)熱重載由三個(gè)相互獨(dú)立又需要協(xié)作的組件構(gòu)成。我把它們比作三個(gè)齒輪靜態(tài)文件服務(wù)是貨架負(fù)責(zé)把磁盤上的資源按請(qǐng)求發(fā)給瀏覽器文件監(jiān)聽是哨兵盯著文件系統(tǒng)有沒有變動(dòng)消息通道是傳令兵把變更信號(hào)及時(shí)送到瀏覽器。少了任何一個(gè)鏈條都轉(zhuǎn)不起來。2.1 靜態(tài)文件服務(wù)Node.js十幾行代碼就能撐起一個(gè)本地站點(diǎn)瀏覽器要訪問本地文件最直接的方式是file://協(xié)議打開HTML。但這種方式?jīng)]法建立WebSocket連接——瀏覽器安全策略允許頁面在HTTP(S)下建立WS連接卻不會(huì)給file://頁面這種能力。而且file://協(xié)議下跨域加載資源也經(jīng)常出問題所以熱重載第一步必須是一個(gè)真正的HTTP服務(wù)。Node.js的http模塊做這件事非常順。核心邏輯就是根據(jù)請(qǐng)求URL拼出磁盤路徑讀取文件后按擴(kuò)展名返回對(duì)應(yīng)的Content-Type。像HTML、CSS、JS這類文本文件還要注意字符集我一般用text/html; charsetutf-8這種格式避免瀏覽器用默認(rèn)編碼猜出亂碼。這里有一個(gè)容易被忽略的細(xì)節(jié)靜態(tài)服務(wù)最好把目錄邊界守住。因?yàn)閁RL路徑經(jīng)過解碼后可能包含../這類片段如果不做校驗(yàn)用戶可以通過構(gòu)造特殊的URL讀出項(xiàng)目目錄之外的敏感文件這在你把本地服務(wù)暴露到局域網(wǎng)時(shí)尤其危險(xiǎn)。我在這篇文章的實(shí)現(xiàn)里會(huì)用path.join加startsWith雙重檢查確保最后解析出的路徑一定在項(xiàng)目根目錄之下。2.2 文件監(jiān)聽fs.watch不是免費(fèi)的午餐你需要知道它的脾性Node.js提供的文件監(jiān)聽API是fs.watch它基于操作系統(tǒng)原生事件實(shí)現(xiàn)響應(yīng)非??旎臼呛撩爰?jí)。用法上很簡單指定要監(jiān)聽的目錄或文件回調(diào)里就能收到變化事件和文件名。但我在實(shí)際使用中很快發(fā)現(xiàn)它有幾個(gè)脾性首先是Linux平臺(tái)對(duì)recursive: true的支持并不理想在本地開發(fā)機(jī)上你可能用macOS或Windows能遞歸監(jiān)聽但一到部署調(diào)試環(huán)境或者某些Linux生產(chǎn)服務(wù)器上遞歸參數(shù)就直接失效目錄里深層文件的變化根本監(jiān)聽不到其次是同一個(gè)保存動(dòng)作可能被系統(tǒng)拆成多個(gè)事件比如很多編輯器保存時(shí)會(huì)先寫入臨時(shí)文件再原子替換回調(diào)可能被觸發(fā)兩三次最后是回調(diào)返回的filename在某些平臺(tái)上可能是null如果你不做兜底下面的路徑拼接會(huì)直接報(bào)錯(cuò)。針對(duì)這幾個(gè)問題答案不是去找一個(gè)萬能API而是采取組合策略遞歸監(jiān)聽能力不可靠就自己寫深度遍歷函數(shù)逐個(gè)目錄注冊(cè)fs.watch事件觸發(fā)太頻繁就在外層加防抖合并filename可能為空就用目錄本身做兜底。這些經(jīng)驗(yàn)會(huì)在后面的代碼里完整展示。2.3 消息通道WebSocket對(duì)比輪詢到底贏在哪瀏覽器收到文件變了這個(gè)信號(hào)有兩條路可走一種是頁面定時(shí)用HTTP去請(qǐng)求后端有沒有變化這叫輪詢另一種是后端主動(dòng)把消息推給瀏覽器這就是WebSocket。輪詢的問題在于實(shí)時(shí)性和開銷沒法兩全。把輪詢間隔設(shè)成500ms頁面就要每秒發(fā)起兩次HTTP請(qǐng)求即使什么都沒變網(wǎng)絡(luò)棧和服務(wù)器也要處理一堆空請(qǐng)求功能上能跑但顯然不是最優(yōu)解。WebSocket則不同它在HTTP基礎(chǔ)上做一個(gè)協(xié)議升級(jí)后建立一條全雙工的長連接數(shù)據(jù)可以從服務(wù)端主動(dòng)推給客戶端實(shí)時(shí)性天然就是毫秒級(jí)而且沒有變更時(shí)幾乎零額外流量。我選擇WebSocket作為熱重載的消息通道還有一層考慮以后想讓頁面顯示開發(fā)服務(wù)器已斷開的提示或者從瀏覽器向服務(wù)端發(fā)送自定義指令WebSocket雙向通信的能力都能直接覆蓋。這個(gè)選擇在代碼實(shí)現(xiàn)上只需要客戶端一二十行并不復(fù)雜。3. 一個(gè)可直接抄走的完整實(shí)現(xiàn)百行代碼跑通熱重載理論鋪墊完現(xiàn)在進(jìn)入實(shí)操。下面這套代碼我做了簡化但保持完整核心文件就一個(gè)server.js你把它放到任意項(xiàng)目的根目錄運(yùn)行后訪問http://localhost:3000就能體驗(yàn)到保存即刷新的效果。我會(huì)邊貼代碼邊解釋每一段的設(shè)計(jì)動(dòng)機(jī)這樣你能真正理解它而不是只知道復(fù)制。3.1 項(xiàng)目結(jié)構(gòu)一個(gè)文件搞定不搞額外工程化這里不打算引入構(gòu)建步驟。項(xiàng)目結(jié)構(gòu)保持最簡your-project/ ├── index.html ├── css/ │ └── style.css ├── js/ │ └── app.js └── server.js你在自己的項(xiàng)目根目錄放一份server.js然后執(zhí)行node server.js控制臺(tái)會(huì)打印一行提示。這個(gè)腳本默認(rèn)把啟動(dòng)目錄當(dāng)作靜態(tài)服務(wù)的根目錄所以你在哪個(gè)目錄下啟動(dòng)就把哪個(gè)目錄作為網(wǎng)站根目錄來服務(wù)。需要說明的一點(diǎn)是這個(gè)實(shí)現(xiàn)需要安裝一個(gè)第三方依賴用于WebSocket我選的是Node生態(tài)里最常見的ws庫安裝一行命令npm init -y npm install wsws庫的特點(diǎn)是底層封裝得干凈API小巧用來做開發(fā)期工具非常合適。如果你連依賴都不想裝理論上可以基于原生HTTP自己實(shí)現(xiàn)一個(gè)簡化版WebSocket握手和幀解析但那是純學(xué)習(xí)目的日常開發(fā)完全沒必要重復(fù)造這個(gè)輪子。3.2 靜態(tài)文件服務(wù)和HTML注入腳本讓頁面自帶熱更能力下面這個(gè)文件包含了HTTP服務(wù)、WebSocket服務(wù)、文件監(jiān)聽三大部分我的做法是放一個(gè)壓縮版先讓你看到整體結(jié)構(gòu)再拆解重點(diǎn)段落。const http require(http); const fs require(fs); const path require(path); const WebSocket require(ws); const PORT process.env.PORT || 3000; const ROOT process.cwd(); const MIME { .html: text/html; charsetutf-8, .css: text/css; charsetutf-8, .js: text/javascript; charsetutf-8, .json: application/json; charsetutf-8, .jpg: image/jpeg, .png: image/png, .svg: image/svgxml, }; const INJECTED_SCRIPT script (function () { let ws; function connect() { ws new WebSocket(ws:// location.host); ws.onmessage function (event) { var msg JSON.parse(event.data); if (msg.type reload) location.reload(); }; ws.onclose function () { setTimeout(connect, 1200); }; } connect(); })(); /script ; function shouldIgnore(filePath) { return filePath.split(path.sep).some(function (segment) { return segment node_modules || segment .git; }); } http.createServer(function (req, res) { const urlPath decodeURIComponent(req.url.split(?)[0]); let filePath path.join(ROOT, urlPath); if (urlPath /) filePath path.join(ROOT, index.html); if (!filePath.startsWith(ROOT)) { res.writeHead(403); res.end(Forbidden); return; } fs.stat(filePath, function (err, stats) { if (err || !stats.isFile()) { res.writeHead(404); res.end(Not Found); return; } let content fs.readFileSync(filePath); if (path.extname(filePath) .html) { content content .toString() .replace(/head, INJECTED_SCRIPT /head); } res.writeHead(200, { Content-Type: MIME[path.extname(filePath)] || application/octet-stream, }); res.end(content); }); }).listen(PORT, function () { console.log(熱重載服務(wù)已啟動(dòng): http://localhost: PORT); });第一段靜態(tài)服務(wù)用了最直觀的同步讀取。開發(fā)期工具我偏向用同步API因?yàn)槲募ǔ:苄 ⒉l(fā)也不高同步代碼的可讀性和排錯(cuò)性遠(yuǎn)好于回調(diào)嵌套。這里最關(guān)鍵的設(shè)計(jì)是HTML注入我不要求開發(fā)者手動(dòng)在頁面里加任何額外的script標(biāo)簽服務(wù)端在返回HTML時(shí)自動(dòng)把熱更客戶端腳本插入到/head之前這樣原有的項(xiàng)目文件完全不用改動(dòng)。注入腳本里的location.host非常關(guān)鍵它動(dòng)態(tài)取出當(dāng)前頁面的域名和端口確保WebSocket連接地址永遠(yuǎn)和頁面訪問地址一致不用手工配置端口參數(shù)。斷線重連的邏輯也放在這里如果開發(fā)服務(wù)重啟已打開的頁面會(huì)自動(dòng)在1.2秒后嘗試重新連接頁面無需人工刷新就能恢復(fù)熱更能力。shouldIgnore函數(shù)是整個(gè)方案里值得單獨(dú)說的一點(diǎn)。你監(jiān)聽整個(gè)項(xiàng)目目錄時(shí)node_modules和.git這種目錄的變動(dòng)頻率非常高尤其是安裝依賴時(shí)會(huì)有成千上萬次文件寫入每次都會(huì)觸發(fā)事件。如果不把它們排除掉熱重載服務(wù)會(huì)被無意義的文件事件淹沒甚至導(dǎo)致頁面每次裝包時(shí)瘋狂刷新。按路徑段逐個(gè)匹配的方式比較穩(wěn)妥只要是路徑的某一段叫node_modules就跳過能防住各種深層嵌套場(chǎng)景。3.3 文件監(jiān)聽加防抖保存一次只能刷新一次下面是文件監(jiān)聽和消息廣播的部分這其實(shí)是熱重載的核心引擎。const wss new WebSocket.Server({ server: httpServer, }); const clients new Set(); wss.on(connection, function (socket) { clients.add(socket); socket.on(close, function () { clients.delete(socket); }); }); let pending new Set(); let timer null; function broadcast(message) { const data JSON.stringify(message); for (const client of clients) { if (client.readyState WebSocket.OPEN) { client.send(data); } } } function handleChange(filePath) { if (shouldIgnore(filePath)) return; pending.add(filePath); clearTimeout(timer); timer setTimeout(function () { const files Array.from(pending); pending new Set(); console.log([熱更觸發(fā)], files.join(, )); broadcast({ type: reload, files: files }); }, 100); } function watchDir(dir) { fs.watch(dir, function (eventType, filename) { const fullPath path.join(dir, filename || ); handleChange(fullPath); }); fs.readdirSync(dir, { withFileTypes: true }).forEach(function (entry) { if (entry.isDirectory() !shouldIgnore(entry.name)) { watchDir(path.join(dir, entry.name)); } }); } watchDir(ROOT);fs.watch的回調(diào)觸發(fā)頻率比很多人想象的高。我做過一次統(tǒng)計(jì)用某代碼編輯器保存一個(gè)文件時(shí)系統(tǒng)可能依次觸發(fā)重命名、新建、屬性變更等多次事件如果不做任何處理一個(gè)保存動(dòng)作會(huì)讓頁面連續(xù)刷新好幾次體驗(yàn)反而比手動(dòng)刷新還差。所以我在handleChange里用clearTimeout加setTimeout做一個(gè)100毫秒的防抖窗口同一次保存引發(fā)的多個(gè)事件會(huì)被聚合到一次廣播里。這里我用Set而不是一個(gè)簡單變量是有講究的。防抖窗口內(nèi)如果先后改了多個(gè)文件比如一次格式化操作同時(shí)寫入了多個(gè)文件這些文件路徑都會(huì)被記錄在集合里。廣播出去的消息帶有一個(gè)files數(shù)組雖然客戶端目前只是整頁刷新但服務(wù)端日志能清楚看到哪些文件被納入了此次刷新排查問題時(shí)很有用。watchDir遞歸函數(shù)解決了recursive參數(shù)在Linux上不可靠的問題。它先監(jiān)聽當(dāng)前目錄再讀取這個(gè)目錄下的所有子級(jí)目錄分別注冊(cè)監(jiān)聽實(shí)現(xiàn)一個(gè)跨平臺(tái)可用的遞歸監(jiān)聽。每一層回調(diào)收到變更時(shí)都把相對(duì)路徑拼成絕對(duì)路徑再交給handleChange處理。這個(gè)實(shí)現(xiàn)雖然簡單但已經(jīng)能覆蓋絕大多數(shù)項(xiàng)目的目錄結(jié)構(gòu)。3.4 跑通驗(yàn)證三種改法的預(yù)期效果部署完成后拿起項(xiàng)目里的HTML文件做三個(gè)實(shí)驗(yàn)。實(shí)驗(yàn)一打開頁面后直接改CSS文件的顏色值。保存的同時(shí)頁面會(huì)在100毫秒后自動(dòng)刷新你看到的新背景色就是剛保存的效果。實(shí)驗(yàn)二往HTML里加一個(gè)標(biāo)題文字。保存后頁面刷新新內(nèi)容直接出現(xiàn)。實(shí)驗(yàn)三在頁面上的輸入框里輸入一些內(nèi)容然后保存任意文件頁面刷新后輸入內(nèi)容會(huì)丟失——這類整頁刷新的行為特征要提前知道如果項(xiàng)目里有需要保留的臨時(shí)狀態(tài)后面章節(jié)我會(huì)講怎么改。這三個(gè)實(shí)驗(yàn)分別驗(yàn)證了靜態(tài)資源服務(wù)、HTTP注入腳本、文件監(jiān)聽的完整鏈路。如果任何一個(gè)環(huán)節(jié)沒生效排查順序也很固定先看服務(wù)端控制臺(tái)有沒有打印[熱更觸發(fā)]沒有說明監(jiān)聽或防抖邏輯有問題有打印但頁面不刷新說明WebSocket連接或客戶端腳本有問題頁面刷新但樣式?jīng)]更新那可能真是瀏覽器緩存需要在響應(yīng)頭加禁用緩存的字段。這個(gè)排查思路我后來排查過不少類似問題現(xiàn)在分享給你。4. 真實(shí)遇到的四個(gè)坑和修復(fù)思路文件監(jiān)聽不是一成不變的手寫熱重載最大的價(jià)值不在那100行能跑的代碼而在你用它踩過坑之后積累的判斷力。下面這四類問題是我在實(shí)際使用過程中真真切切遇到的每一個(gè)都導(dǎo)致了頁面不刷新或者頁面亂刷新我按排查鏈路寫出來希望你一次就能避開。4.1 保存一次文件瀏覽器卻連續(xù)刷新好幾次第一次跑通時(shí)我覺得熱重載真爽結(jié)果馬上就發(fā)現(xiàn)一個(gè)問題我只保存了一下頁面卻像抽風(fēng)一樣反復(fù)刷新。打開Network面板看到頁面在短時(shí)間內(nèi)被請(qǐng)求了三次服務(wù)端日志也打出了三條[熱更觸發(fā)]記錄。原因就是前面提到的編輯器多重事件。保存動(dòng)作在文件系統(tǒng)層面是一系列操作先創(chuàng)建臨時(shí)文件、再重命名覆蓋原文件、再同步屬性元數(shù)據(jù)每個(gè)步驟都可能觸發(fā)一次fs.watch回調(diào)。我最初是在回調(diào)里直接廣播沒有防抖窗口于是瀏覽器就收到了多次刷新指令。修復(fù)方案就是引入100毫秒的聚合窗口。這個(gè)時(shí)長我試過50毫秒、100毫秒、200毫秒三個(gè)值最終選了100毫秒——太短擋不住同一保存操作的多重事件太長又會(huì)讓人明顯感覺保存后有一小段空窗期?,F(xiàn)在的通用建議是純文本文件開發(fā)場(chǎng)景100到150毫秒是甜點(diǎn)區(qū)間。4.2 Linux服務(wù)器上深層文件變動(dòng)毫無反應(yīng)有一次把熱重載服務(wù)拿到一臺(tái)Linux機(jī)器上跑卻發(fā)現(xiàn)項(xiàng)目根目錄下的文件改動(dòng)一切正常但兩層目錄深處的文件無論怎么保存頁面都不刷新。第一反應(yīng)是監(jiān)聽代碼出錯(cuò)了我用console.log把watchDir的遞歸路徑打出來發(fā)現(xiàn)目錄都正常注冊(cè)了但深層目錄的事件就是傳不上來。后來查了運(yùn)行環(huán)境的API說明才發(fā)現(xiàn)fs.watch的recursive選項(xiàng)在Linux上并不可用而我最初寫的監(jiān)聽邏輯依賴它結(jié)果就是只能收到根目錄直級(jí)文件的事件。這個(gè)坑特別隱蔽因?yàn)閙acOS和Windows上都不會(huì)暴露問題。最后的修復(fù)就是我上面代碼里的做法放棄依賴操作系統(tǒng)原生的遞歸能力改為自己遍歷目錄深度注冊(cè)單個(gè)監(jiān)聽。它確實(shí)會(huì)讓啟動(dòng)時(shí)多消耗一點(diǎn)時(shí)間讀目錄結(jié)構(gòu)但換來了跨平臺(tái)一致的行為這個(gè)取舍在開發(fā)工具里完全值得。記住一點(diǎn)凡是涉及文件監(jiān)聽的工具跨平臺(tái)兼容性永遠(yuǎn)是第一優(yōu)先級(jí)。4.3 編輯器原子寫入導(dǎo)致監(jiān)聽消失的詭異場(chǎng)景某天突然出現(xiàn)了一個(gè)更奇怪的現(xiàn)象頁面熱重載正常工作了幾個(gè)小時(shí)改某個(gè)特定文件時(shí)突然就不再刷新了而且重啟服務(wù)后又恢復(fù)。我一度以為是fs.watch監(jiān)聽的目錄數(shù)量太多觸發(fā)了系統(tǒng)的watch限制但排查后發(fā)現(xiàn)另有原因。這個(gè)文件是用的某款編輯器改的它保存時(shí)不是直接修改原文件而是先寫一個(gè)臨時(shí)文件再通過rename系統(tǒng)調(diào)用覆蓋目標(biāo)文件。這意味著原inode已經(jīng)被替換了。如果監(jiān)聽的是文件本身而不是文件所在目錄rename操作后原來的監(jiān)聽話柄可能就失效了。解決方案在代碼里其實(shí)已經(jīng)暗含了我堅(jiān)持只對(duì)目錄做監(jiān)聽而不是對(duì)文件做監(jiān)聽。監(jiān)聽目錄的好處是無論目錄下的文件怎么被替換刪除重建只要文件名能匹配回調(diào)照樣觸發(fā)。這是文件監(jiān)聽的一個(gè)基礎(chǔ)原則——想穩(wěn)定監(jiān)聽一批文件去監(jiān)聽它們的父目錄別盯著單個(gè)文件。4.4 開發(fā)服務(wù)中途重啟已打開的頁面怎么恢復(fù)熱重載服務(wù)有個(gè)使用頻率很高的操作改了服務(wù)端代碼比如改了server.js本身后需要重啟服務(wù)。重啟期間WebSocket連接會(huì)斷開但常見情形是頁面打開著沒關(guān)等服務(wù)重啟完成后你卻忘了去刷新頁面于是新服務(wù)已經(jīng)啟動(dòng)、頁面卻還停留在舊狀態(tài)。客戶端腳本里的斷線重連就派上了用場(chǎng)。ws.onclose觸發(fā)后腳本會(huì)在1.2秒后嘗試重新建立連接一旦服務(wù)端口重新監(jiān)聽頁面就自動(dòng)恢復(fù)了熱更能力。這個(gè)細(xì)節(jié)讓我免去了無數(shù)次服務(wù)刷完還要回頭手動(dòng)刷新瀏覽器的操作。順帶一提重連間隔不要設(shè)太短否則服務(wù)還在啟動(dòng)過程中會(huì)形成高頻無效連接請(qǐng)求1到2秒是兼顧恢復(fù)速度和資源開銷的合理區(qū)間。5. 從整頁刷新到模塊熱替換熱重載還能往哪走基礎(chǔ)版熱重載能做到保存即刷新但對(duì)很多應(yīng)用開發(fā)場(chǎng)景來說整頁刷新帶來的狀態(tài)丟失仍是個(gè)痛點(diǎn)。這就引出了熱重載的進(jìn)階形態(tài)——模塊熱替換HMR。理解HMR和熱重載的本質(zhì)差別才能決定你的項(xiàng)目到底需要哪一層能力。5.1 熱重載與HMR的本質(zhì)區(qū)別狀態(tài)保留的鴻溝熱重載最簡單的實(shí)現(xiàn)就是收到信號(hào)后調(diào)用location.reload()一切重建代價(jià)是內(nèi)存中的頁面狀態(tài)全部歸零。HMR則講究只更新變化的模塊其他不動(dòng)。以界面開發(fā)為例你修改了一個(gè)控件的樣式模塊HMR會(huì)找到哪個(gè)組件依賴這份樣式重新執(zhí)行樣式相關(guān)的代碼而組件自身的屬性和渲染結(jié)果盡量保留。這里的關(guān)鍵差異在于HMR要求項(xiàng)目具備模塊化邊界。你可以把頁面看成由一個(gè)個(gè)方塊搭建的積木熱重載是推倒整個(gè)積木塔重新搭一遍HMR則是抽換其中一塊積木而塔身不倒。傳統(tǒng)多頁面網(wǎng)站想用HMR就得先把自己改造成模塊化結(jié)構(gòu)——這也是HMR幾乎總是和現(xiàn)代前端框架配套出現(xiàn)的原因。對(duì)于純靜態(tài)頁面或簡單腳本項(xiàng)目做HMR的收益很低整頁刷新反而更可靠。5.2 如何讓CSS熱更新而不刷新頁面即便不做完整的模塊化改造有一個(gè)半步是很容易實(shí)現(xiàn)的那就是讓樣式文件變更時(shí)只替換CSS而不刷新頁面。這樣做的好處很大調(diào)試CSS的視覺反饋比整頁刷新更快而且不會(huì)打斷你在開發(fā)者工具里正在查看的DOM狀態(tài)。實(shí)現(xiàn)思路并不復(fù)雜客戶端腳本判斷收到的廣播中如果包含CSS文件的路徑就遍歷頁面里所有l(wèi)ink[relstylesheet]標(biāo)簽找到對(duì)應(yīng)的那一個(gè)給它重新設(shè)置一次href。為了繞過瀏覽器緩存要在URL后面拼上時(shí)間戳或隨機(jī)數(shù)參數(shù)。服務(wù)端廣播時(shí)帶上files數(shù)組客戶端檢查擴(kuò)展名再做分支處理。這種方式在骨架屏、彈窗、動(dòng)畫調(diào)優(yōu)這類場(chǎng)景下非常實(shí)用我強(qiáng)烈建議你試一試。5.3 完整HMR的工程化思路模塊圖、執(zhí)行環(huán)境和狀態(tài)遷移一旦進(jìn)入組件級(jí)別的熱替換復(fù)雜度會(huì)陡增。業(yè)界早期一種經(jīng)典做法是實(shí)現(xiàn)一個(gè)模塊分發(fā)系統(tǒng)每個(gè)模塊執(zhí)行后把自己注冊(cè)到一張全局表里當(dāng)某一個(gè)模塊變化時(shí)系統(tǒng)從模塊表里找出所有依賴它的模塊重新執(zhí)行這些依賴但保留最上層組件實(shí)例的狀態(tài)。這套機(jī)制的三個(gè)關(guān)鍵部件是模塊圖依賴關(guān)系的描述、執(zhí)行環(huán)境能在運(yùn)行時(shí)動(dòng)態(tài)加載新的模塊實(shí)現(xiàn)和狀態(tài)遷移舊實(shí)例怎么把數(shù)據(jù)交給新實(shí)現(xiàn)。任何一個(gè)部件做不好HMR就會(huì)退化成頁面上出現(xiàn)一個(gè)全屏遮罩強(qiáng)制刷新。對(duì)獨(dú)立開發(fā)者來說自己實(shí)現(xiàn)完整HMR投入產(chǎn)出比很低更好的策略是看清自己項(xiàng)目形態(tài)靜態(tài)頁面用熱重載模塊化框架項(xiàng)目直接用腳手架自帶的HMR兩頭都別別扭。5.4 熱重載工具的正確進(jìn)階方向輕量定制如果你不需要HMR又想把手寫的熱重載用得更順手我更推薦在工具友好性上做擴(kuò)展而不是硬啃模塊替換。比如給腳本加上命令行參數(shù)支持讓用戶可以指定--port、--ignore目錄把靜態(tài)目錄從啟動(dòng)目錄改為參數(shù)傳入增加一個(gè)配置文件讓不同項(xiàng)目各自維護(hù)自己的監(jiān)聽規(guī)則。這類擴(kuò)展不會(huì)引入新的概念復(fù)雜度但對(duì)日常體驗(yàn)的提升非常實(shí)在。我現(xiàn)在的server.js已經(jīng)支持了--port和--dir兩個(gè)參數(shù)后續(xù)想給每個(gè)項(xiàng)目配一套獨(dú)立端口啟動(dòng)命令改成node server.js --port 8080 --dir src就行。另外我更愿意把腳本封裝在項(xiàng)目的devDependencies里用npm scripts管理啟動(dòng)命令換機(jī)器重新npm install就能用省去各種環(huán)境記憶負(fù)擔(dān)。6. 這輪手寫腳本的最終沉淀我對(duì)熱重載的新認(rèn)知做完整輪手寫熱重載之后我對(duì)這類開發(fā)工具的看法有了明顯轉(zhuǎn)變。最直接的是排查問題的心態(tài)——以前遇到頁面不更新我只會(huì)拍腦袋試各種靈丹妙藥現(xiàn)在我腦子里會(huì)立刻畫出一條鏈路圖服務(wù)在不在、監(jiān)聽有沒有觸發(fā)、消息有沒有送達(dá)、客戶端有沒有執(zhí)行按位置逐段掐斷排查十有八九五分鐘內(nèi)能定位。其次是對(duì)工具取舍的判斷。熱重載類工具的價(jià)值錨點(diǎn)在于反饋速度和狀態(tài)保持兩者互相牽制想更快就全量刷新想讓狀態(tài)保留就要引入精細(xì)的模塊替換。我現(xiàn)在的日常流程是純展示頁、活動(dòng)Demo這些項(xiàng)目直接丟給我這套輕量腳本一個(gè)終端窗口運(yùn)行其余操作和打開普通網(wǎng)頁沒什么區(qū)別凡是要寫組件邏輯的大型項(xiàng)目該用腳手架用什么把HMR這類重型能力交給專業(yè)工具處理讓它們做它們擅長的事。最后再分享一個(gè)使用細(xì)節(jié)如果你把server.js放在項(xiàng)目根目錄但它只服務(wù)于src子目錄的前端頁面請(qǐng)記得把監(jiān)聽入口從根目錄改成src目錄否則你在根目錄下隨手新建的臨時(shí)文件、自動(dòng)補(bǔ)全工具生成的緩存文件都會(huì)觸發(fā)刷新徒增干擾。文件監(jiān)聽的范圍永遠(yuǎn)應(yīng)該比資源服務(wù)的范圍收斂一點(diǎn)這是我在實(shí)際使用里幾乎每個(gè)項(xiàng)目都會(huì)調(diào)整一次的習(xí)慣。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
伊人骚琪琪亚洲天堂网站| 四虎av在线| 91天天看| 视频二区美腿丝袜制服人妻欧美 | 一二三四视频中文字幕在线看| 狠狠操狠狠爱| 欧美日韩中文字幕不卡| 国内毛片无码一级毛片| 1204人成网站色www| 99精品视频在线观看免费| 激情露脸爱| 97亚洲在线| 91碰碰| 色九九九九九九| 韩国午夜理伦三级好看| 碰人碰碰人人开房人肉| 一本一道vs波多野结衣| 国内成人圈中文字幕无码视频| 国产精品无码av| 蜜桃视频一区二区三区| 国产美女mm131爽爽爽爽| 国内精品不卡无毒99999| 综合网亚洲| 大香蕉碰碰| 日韩有码专区| 91人人爽人人爽| 99热这里只有精品18| 日韩性爱电影一区| 欧美人妻熟女在线| 免费看欧美美女黄色大片| 狠狠2050在线观看| 国产高清无码一区二区三区四区皇冠| 熟女久久| 人人操人人摸人| 欧美偷偷网| 国产欧美岛国精品一区| 综合欧美色图| 七久久久| 国内偷拍精品一区二区| 91麻豆天美国产欧美日| 久久国产在线一区二区| 91成人国产综合久久精品蜜月| 无码 黑人一区二区三区| 91在线综合网| 日本性爱不卡视频| 欧美色五月| 综合久久97| 99在线免费视频| 欧美写真视频一区| 极品内射| AV污污污污| 99色热| 丁香五月综合| AA级电影三区| 亚洲欧美91√| 一区二区三区 丝袜高跟| 97chaopengongkai| 骚熟女AV网| A久久| 亚洲春色欧美激情自拍| 欧美激情精品久久久| 1禁看欧美黄片免费看| 欧美,日韩,中文,另类| 色欧美天天| 极品综合| 国产97av| 亚洲中文电影| 欧美在线视频99| 黄色香蕉视频网站一区| 人人妻人人爽一区二区三区| 人妻熟女一区二区| 天美国产精品| 亚洲丝袜二区| 男人的天堂一区三区| 一级性爱视频免费在线| 亚洲丝袜诱惑| 婷婷五月天久久精品视频一区二区三区| 免费在线黄片视频| 97香蕉网| 91操熟女视频| 亚洲男人的天堂在线看| 成年女人一区| 日韩欧美aⅴ综合网站发布| 校园春色亚洲| 中出91视频| 999综合色| 玖玖蜜臀资源网| av大香蕉| 97综合在线| 亚洲黄色a级片| 九九九九久久久久| 在线天堂资源亚洲| 99福利社| 久久亚洲色图中文字幕| jiujiujiujingpin| 99蜜月精品久久| 久久国产精品,久久国产| 日本污ww视频网站| 国产激情在线观看| 午夜久久无码1000合集| 国产强奸超碰AV| 秋霞怕怕片| 91亚洲综合| 国产精品白丝www| 青青草一区二区三区四| 941超碰| 天天操天天谢| 亚洲欧美综合网站| 啪啪视频免费在线观看| 少妇一区二区三区| 又大又大又大又粗爽高潮观看| 在线欧美亚洲| 天天射夜夜| 欧美中字不卡| 中文字幕av片| 亚洲一区中文精品| 不卡av免费在线网址| 97超碰人妻| 91少妇高潮| 久久久一区二区三区麻豆| 久久久78| 亚洲资源站| 欧美在线干| 久久久久婷婷精品av电影| 伊人久久大香蕉线AV五月天| 久插综合| 超碰日韩美妻| 欧美大片91| 久久青青草在线视频| 一起草视频在线| 久久在线观看免费视频| 日韩精品人妻一| 激情啪啪拍91| 婷婷性爱| 日韩av电影网站| 欧美综合 站| 亚州高清AV| 久久日韩肥臀| 色欧美综合| 青娱乐福利99| 老司机深夜影院18未满| 免费看日产一区二区三区| 超碰碰碰碰| 亚洲综合有玛| 一区二区国产视频在线观看| 亚洲成人在线资源| 亚欧免费观看视频| 日韩无码黄色片| 人人射人人操人人摸| 日韩三级视频一区二区三区| 91在线色| 亚洲中文字幕一区二区| 中文字幕高清精品一区| 久久夜黄色无码A级大片| 国产精品久久久久久久久AV大片 | 中 文字幕一区二区三四 五 区日 日 骚 | 免费操逼91| 亚洲一区二区三区中文字幕| 丰满人妻一区二区三区免费,| 狠狠躁AV| 亚洲好色人妻| 日韩一级二级三级| 人妻中文字幕精品无码 | 人人干黄色| 日韩无码服务区| 亚洲资源吧| 日韩免费三级黄片电影| www.av在线视频| 淫妻综合网| 日本天天色| 吉川爱美98堂在线| 后入式免费视频| 欧美1区二区三区公司| 五月婷婷综合网| 久久久性爱视频| 91久久| 91丨九色丨国产丨人妻在线| 99热18| 狠狠狠一区二区三区| 日欧毛片久久| 自拍偷拍国产欧美日韩韩| 婷婷伊人五月| 亚洲天堂东京热| 日本一卡二区在线| 国产精品探花在线| 玖玖爱一区在线| 亚洲资源一区| 国产视频一区二区免费| 传媒免费一区二区三区| 亚洲免费在线探花| 亚洲天堂另类小说男人| 亚洲丝袜诱惑| 青娱乐亚洲热| 男同专区一区二区三区在线| 黄色片大香蕉| 91网站在线播放| 少妇厨房愉情理伦片bd在线观看| 国产欧美伊人| 97免费在线视频| 天天日夜夜爽| 白嫩妹子国产骚| 一区不卡在线观看av| 东北女人的毛片| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 99免费视频| 久久久一区二区三区麻豆| 欧美色综合影院| 久久一本大香蕉| 四虎国产精品永久在线囯在线| 国产精品一二三区福利| 97操| 91高潮喷水美女| 成人日韩3| 欧美色图人妻| 333kkkk·亚洲com久久| 四虎精品亚洲| 五月天色色网站| 超碰色图| 97超碰jingpin| 亚洲欧美第一页| 免费看污网站| 无码人妻精品一区二区中文| 久久久久亚洲一区女同性恋中文字幕| 亞洲久久直播| 久久日韩肥臀| 久久的网站啊啊啊啊啊| 亚洲密乳AV| 亚洲欧美日韩中文久久自慰| 亚洲中文字幕三级在线| 久久久久久久久久9| 亚洲性天堂| 天天亚洲综合| av在线免费一区二区| 蜜桃臀一区二区三区久久| 玖玖爱免费观看视频| 少妇九九九九| 久都青青视频| 免费一级欧美片片线观看| 无码精品啪啪啪一区二区三区三州| 91丨九色丨国产打屁股| 九九九九热| 啊啊啊97视频| 一区三区啪啪| 级做a爱无码性色永久免费| 97频视在线| 啪啪啪大香蕉| 黄色一级视| 国产性爱强奸乱伦大全| 国产女人9999| 黄页大片在线观看| 欧美性爱中文字幕无线码| 蜜臀久久久99久久久久 | 亚洲五月婷婷| 精品无码久久久久久国产浪潮| 欧美在线干| 殴美,日韩国产伦精品| 久久精品人人做人人看| 97这里有精品| 啊啊啊不要好爽日韩无码一区| 欧美一区二区三区日韩| 亚洲欧洲无码bt精品合集| 久久精品国产97欧美精品亚洲 | 青青草白白色| 韩日精品四区| 国产精品一级毛片不卡视| 无码粉嫩白虎一线天b区| 嗯嗯啊啊视频一区二区三区| 激情五月激情综合网| 国产宅男宅女在线观看| 欧美精品23| 少妇久久久| 国内成人圈中文字幕无码视频| juliaann精品熟女一区| 日日夜夜干| 爱做久久久久久| 中日韩免费看男女操逼大全| 天天综合网91| 久9爱精品| 操曰本熟女| 91美女视屏| 五月天激情婷婷| 天天操夜夜操狠很操| 激情小说图片亚洲首页| 美女超碰978| 亚洲精品无码少妇久久| 乱伦av麻豆| 亚洲一曲日韩精品| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 伊人四虎综合| 国产成人资源| 99自拍B亚洲 | 色五月亚洲| 99爱爱| 亚洲无码久久久久久久| 久久精品国产亚洲AV成人直播| 午夜无遮挡男女啪啪视频| 男女猛烈无遮掩视频免费软件| 亚洲欧美碰碰| 日本不卡在线二区三区| aV中文麻| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 干婷婷综合网| 成人三一级一片aaa| 天天操夜夜嗨| 欧美,日韩综合久久| 国内精品久久人妻性色av| 国产精品 视频| 精品人妻一区二区三区视频在线| 亚洲欧美首页| av网站国产主播在线| 97爱综合| 国产一级特黄大片处女| 十八禁成人网站在线观看| 啪啪资源网| 精品国产人成在线| 亚洲Av无码成人精品国产| 蜜臀AV秘一区翔田千里| 亚洲色图欧美色图日韩色图| 国产无码久久高清| 麻豆久久一区二区三区| 五十路熟女人妻一区二区在线观看| 麻豆一区二区三区在线看| 99久久免费看精品国产一区| 日韩九九九| 国产黄色在线播放观看| 人妻9117c| 欧美少妇性爱网站| 91九色精品熟女内射| 免费A V在线| 67194国产| 成人贴图日韩欧美| 加勒比av中文| 宗合情欲网| 大香蕉欧美国产日韩高潮| 四虎影视 亚洲无码| 密臀成人视频久久久| 亚洲欧美天堂| 无码国产精品久久久久| 97青青操视频| 97欧美色综合| 激情综合网激情综合| 欧美精品二区视频在线| 乳欲人妻办公室奶水| 黄色大香焦1级‘′‘| 五月天综合| 五月开心网| 人妻熟女字幕一区二区| 人人艹亚洲| 五月天婷精品激情| 色av中文字| 欧美成人国产精品| 色综合加勒比| www色日本| 91丨国产丨白浆| 日本天天干天天搞一区| 搡老女人911熟妇老熟女| 蜜乳性色无码专日粉嫩骚逼AV| 婷婷97| 亚洲淫乱骚妇AV| 大香蕉日韩欧美| 91亚洲人| 狠狠色噜噜狠狠狠狠狠色综合久久 | 老熟女综合| av天堂天堂av日韩| 偷拍欧美综合| 夜夜嗨一区二区三区三州加勒比| 麻豆国产97在线| 婷婷深爱五月| 香蕉色网| 啪啪视频亚洲第一| 青娱乐 成人娱乐在线| 98超碰日本| 91麻豆天美传媒在线| 国产亚洲女v在线观看| 青青草吊丝| 日韩本不卡视频在线观看| 99re公开精品免费视频 | 91模特在线观看| 99久久亚洲精品无码毛片潘甜甜 | 男女猛烈无遮掩视频免费软件| 九九综合久久| 亚欧操逼片在线观看| 久久日韩精品一区二区| 欧美成人精品一区二区三区| 青青五月天| 一区二区三区精品久久| 久久9999 | 成·人免费午夜在线观看| 亚洲欧洲网站免费观看| 亚洲中亚日激情视频| 日韩欧美成人性爱在线| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 欧美AB在线| 性爱av在线免费观看| 青青草伊人久久| 欧美成人一级麻豆| 欧美性色综合网| 沈阳熟女高潮对白视频| 麻豆天美传媒在线视频天堂| 国产v片在线免费观看| 男人的天堂欧美| 1769一区| 加勒比海成人视频网 | 视频二区美腿制服人妻欧美| 亚洲 日本 一 二 三| 男人的天堂Va| 超碰超碰95| 9 9精品一区二区三区| 婷婷性网| 无码9区| 97免费视频在线观看| 美女久久久久久久| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 嗯~啊~轻一点 视频| 九九热在线精品视频| 久久精品国产亚洲粉嫩| 欧美五区| 久久成人国产| 欧美色图欧美| 亚洲aw毛茸茸在线| 国产精品无码av在线 | 台湾大香蕉99热| 91小视频| 欧洲精品一级二级精品综合视频综合| 插老姨肥穴| 国产一区二区三区视频在线看| 大香蕉日韩欧美| 色色婷婷五月天| 亚洲婷婷丁香在线| 青娱乐av在线| 日韩AV一起草| 欧美人人曰人人操人人射射| chaopen97久久| 欧美日日夜夜| 懂色天天爱天天日天天射天天澡| 中文字幕第2页| 欧美激情视频一区二区三区不卡| 操逼视频免费日韩无码| 999久久芭蕾| 日本一二区免费| 久久激情亚洲精品无码?V| 蜜桃臀av一区二区| 国产少妇高潮| 人妻啊啊人妻啊| 亚洲天堂人妻熟妇视频| 日本大香蕉综合网| 色踪合AV| 五月天婷婷社区| 中文字幕一二三av| 五月综合激情| 国产一区在线免费播放| 翔田千里无码中出中文字幕| juliaann欧美丝袜办公室| 9999久久久久| 久久久久久中文版| 97人人爱人人做人人乐| 日韩一999精品| 欧美极品少妇交| 久久精品国产精品亚洲艾通辽熟妇 | 久艹视频在线| 久久久熟女一区| 青青草AV色| 青青草大香蕉视频| 青青草久草| 国产熟妇 码视频户外直播| 不卡在线观看视频| 日韩精品在线视频,日韩精品……| 麻豆成人AV| 成年人黄色| 呦呦影院| 亚洲高清国产理伦片| 色乱二区| 亚洲 欧美 中文 日韩超碰| 欧美制服另类丝袜| 少妇69中文| 97超碰中文字幕| 亚洲男人的天堂亚洲| 白丝AV网站| 色婷婷电影网| 国产 热久久久久国产精品| 成人精品久久久午夜福利| 亚洲日产专区婷婷| 大香蕉伊人在线成人AV在线观看| 国产一在线观看| 欧美日韩亚洲国产中文永久天天看| 视频一区二区三区精品| 夜夜操二区| 99热这里只有精品1| 日韩大香蕉AV影片| 麻豆天美一区二区| 狠狠色伊人亚洲综合网站色| 91天射| 性爱精品一区| 欧美日韩中国x| 亚洲男人的天堂亚洲| 老熟妇综合| 婷婷丁香九月| 国产偷仑| 亚洲se电影| ji熟女.com| 97久精品| 不卡二三区人妻少妇| 久久av一级av少妇av高潮| 美女人妻色网站| 中文字幕一区二区无码成人| 国产福利影视| 后入式五六区| 亚洲欧美日韩精品久久久一区二区| 91精品人妻一区二区三区蜜桃臀| 久久国产成人精品国产成人亚洲 | 欧美黄色片AAAAA| 五月丁香| 欧美亚洲图片| 亚洲情色电影网| 99999re| 国产一级不卡在线观看| 亚洲国产中文字幕| 色婷婷五月综合激情中文字幕| 91国产在线精品| 播播亚洲小说亚洲| 淫淫综合网| 日本淫色网| 午夜福利无毒不卡| 日本丝袜美腿人妻九九| 国产亚洲欧美每日在线| 97超色| 久久激情视频| 黑人性暴力毛片| 欧美日日网| 奇米四色影视777久久久| 999熟女精品| 91视频观看网站| 一区二区三区黄片免费观看| 亚州人妻| 亚洲色综合| CCYY草草影院地址入口| 精品久久九| 丁香五月婷婷色| 久久久亚洲Av| 综合夜夜| 淫穴高潮色图| 中文字幕亚洲欧美在线不卡| 内射夫妻三片| 福利视频香蕉免费一区二区在线| 色色色天美视频| 91操人| 欧美在线第五页| 被男人吃奶很爽的毛片| 亚洲九月丁香| 超碰av在线| 久久久久久久久久久久黄色| 亚洲无码一区成人免费午夜| 91无遮挡| 日本操BAV| 天天色黄色影院天天操| 性猛交| 97精品97久久| 欧洲站一级二级三级h| 久久中文字幕一区不卡| 99欧美| 国产少妇肉丝在线观看| 久久精品日韩专区免费观看| 女欧美一区二三区| 日本在线激情一区二区三区| 日日黄色三级网站| 超碰成人公开| 日本性爱网址| 中国操逼无码| 青春草莓视频在线观看网址| 99热精品在线观看| 青青草国产一区二区三区| 3571色综合一区二区二区| 粉嫩av在线| 亚洲素人综合| 夜夜草网站| 肉动漫无遮挡h在线观看| 国产美女在线精品免费看| 丝袜美腿操av| 麻豆a'v电影| 欧美韩日精品资源| 狠狠亚洲| 欧美日韩婷婷中文| 91美女在线视频| 欧美激情久久久久| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 久久久久久久久久久97| 夜夜嗨一区二区| 日韩一级成人毛片免费观看| 亚洲成人性爱网站在线播放| 91精品微拍福利| 亚洲国产婷婷在线播放| 午夜男女爽爽大片免费观看| 伊人天天久久动态图| 中国一级αV| av网站免费线看| 国产无码三级视频在线观看| 女欧美一区二三区| 熟女五十路一区二区三| 人人爱人人操人人性| 成人乱人伦一区二区| 亚洲 一区二区 自拍| 一区在线观看中文字幕| 欧苏综合色综合| 中文字幕精品丝袜| 青青草字幕AV| 91五十路| 你想操日本小逼吗| 久久超碰爱| 97超碰逼| 男人的天堂VA| 我要去看2个日本美女.com曹逼| 国产在线观看一区二区三区 | 青青草好吊色| 久一区久久蜜桃| 日韩一级久久毛片| 日韩精品人妻一| 日韩九区| 欧美激情一| 天天操人人操狠狠插| 日本精品不卡一二三区| 精品美女少妇一区二区三区| 夜夜躁狠狠躁日日躁av| 99久久婷婷丁香| 蜜臀久久99精品久久久老,,| 天天做天天爱天天爽| 欧美日韩婷婷中文| 在线中文字幕视频| 久久性爱免费送| 天天干天天日天天射黄色片| 精品久久97观看在线视频| 国产强奸乱伦无码视频| 操逼日韩无码| 亚洲九九爱| 日本女人操逼| 日韩久射综合| 中文字幕国产精品1区| 超清福利精品视频在线| 91麻豆va国产精品| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲做性| 91丨国产丨白浆秘 洗澡动漫| 欧美真人抽搐一进一出gif | 亚洲中文字幕在现观看| 欧美久久九九| 黑人猛交| 91久久18禁| 国产精品不卡高清在线观看| 丰满人妻av一区二区三区 | 98精品国产乱码久久久久久| 日本成人A片免费看| 久久久∴| 人、人、摸,人、人、草| 偷拍新久久| www.狠狠| 精品一区二区三区国产| 天天弄欧美| 九九精品99| 毛片视频白嫩| 婷婷涩嫩草鲁丝久久午夜精品| 国产人妻精品久久久一区二区三区| 五十路三区在线| 欧美香蕉视xxx| 国产三级多多影院2022国产AA一级毛片无码 | 67914亚洲精品| 精产品久久| 无码欧美有限公司| 色哟哟AⅤ| 锕锕好爽 死我在线观看| 久久99综合| 久久AV无码AV| 亚洲精品久久一区二区三区蜜桃臀| 亚洲欧美中文一区二区三| 97超级久久| 中国黑人三级片网站上区| 国产树林里野战在线看| 亚洲无码 国产无码| 麻豆性爱视频在线播放| 岛国视频免费在线观看| av三级电影在线播放| 91精品导航| 99精品久久久久久| 免费看国产大AB| 国产精品。| 超碰在线人妻| 日本一区不卡| 日日骚中文字幕| 高清肉丝中文无码| 欧美乱色| 成人AV在线电影| 91小视频| av网站免费看| 色网亚洲人| 男女性扦B| 亚洲欧洲第二视频在线观看色图| 亚洲中文字幕有码视频一区二区三区| 婷婷综合在线| 五月香婷婷| 开心五月天激情网| 免费又黄又裸乳的视频| 日韩无码操逼片| 中英熟女操女| 午夜a成v人电影| 懂色av一区二区三区天美传媒| 操人妻视频| 黑人性欧美| 伦理第一页| 亚洲春色欧美| 东京热一区二区三区四区五区六区| 久久久久久午夜男人的天堂| 美女尤物福利视频| 加勒比AV网| 日本三级韩国三级99| 五月婷婷深深爱| 丝袜 亚洲 偷拍| 91原创在线观看| 欧美日韩免费专区在线| 精品国产72| 在线女人91| 亚洲国产丝袜在线观看| 综合性视频99| 人人妻人人澡人人爽久久av| 亚州男人天堂| 亚洲精品国产日韩无码AV永久免| 二男一女成人A片| 中文字幕一区av| 欧美白嫩女HD| 少妇激情AV| 黑人嘿嘿嘿超爽免费视频| 中文字幕视频2区| 熟妇人妻精品一区二区| 久久久久婷婷| 国产AV线| 精品久久久av无码免费| α√在线| 东北女人av| 99精品无码| 免费视频一二三区| 日韩色欲久久一二三四区| 嗯嗯啊操我| 中文字幕av片| 欧美日韩性爱无码| 无码视频一区二区| 人妻少妇精品| 色妺妺在线视频| 日韩一级二级三级| 亚洲AV成人无码久久精品播放| 成人黄页| 五月天婷婷在线看 | 男人的天堂亚洲| 久9爱经典视频| 久操网线| 日韩成人午夜精品久久高潮| 色妇综合网| 中文字幕一区 二区三四五 区日 日骚| 福利五区| 国内精品久久久久影院亚洲| 97在线观看免费视频l| 99亚洲精品| 久九干| 久久国产在线一区二区| 国产精品制服丝袜中文字幕日韩一区二区三区 | 欧美婷婷| 国产91 丝袜在线播放00-百度| 日本中文字幕在线视频| 蜜桃精品视频一区| 人人操人人搞人人草| 中出789在线视频| 欧美日韩操逼动图| 综合五月天| 亚洲……91| 国产综合在线视频网站| 久久久久78| 欧美一级A片在线看视频性色| 亚洲男人天堂视频| 美女91AV| 亚州性色| 成人麻豆av电影网站| 日本不卡高清免v欧美日韩在线观看| 精品人妻高清麻豆av| 日韩中文字幕人妻视频| 日韩无码AB| 口爆吞精在线观看| 国产精品天干天干综合网麻豆| 精品无码欧美三级| www.操| 在线欧美亚洲| 日韩美脚一区二区网站| 综合网亚洲1| 亚洲欧美大香蕉| 中文字幕一二区二三区人妻专区| 日本天天干天天日一区| 91麻豆天美国产欧美| 第四色奇米影视777| 久久久久斤小| 五月丁香六月婷综合成人综合| 色香天天| 久久伦理视频久久大香蕉视频| 91热爆在线| 色眯眯av| 91美女中出| 久草视频观看视频在线| 久久精品导航| 超碰97色色| 激情接吻视频久久久久久| 欧美97超碰| 免费人人搞97| 91干熟女| 国产多人在线观看视频| 天天搞欧美| 中文一区二区婷婷视频| 久久肏大逼| 久久AV无码AV| 国产丁香精品露脸视频| 97久久超碰国产网站| 午夜亚洲WWW湿好大| 99精品无码| 久久最新视频免费观看| 激情一区二区三区在线观看| 偷拍亚洲熟女视频播放| 亚洲久久久| 少妇内射视频| 亚州色国| 日韩资源网| 欧美亚洲影视| 韩国久久97| 另类在线| 99综合视频| 免费看日产一区二区三区| 看日韩操逼| 久久av一级av少妇av高潮 | 91撸色网 玖玖网 欧美| 欧美黑人猛交春色影视大全| 久久久一区二区三区四曲免费听| 日本护士高潮| www…国产操逼| 日本人妻A片成人免费看片| 人妻精品一区二区在线| 日韩探花精品在线视频| 国产CHASE男男GAYGA 毛多色婷婷| 久操凹凸视频| 12一15性XXXX粉嫩国产| 69视频入口| 久久欲| 超碰在线观看av不卡| 波多野结衣一级视频| 大香蕉黄色一级片免费看| 国产不卡免费在线视频| 影音先锋每日最新资源在线观看| 97精品一区二区视频| 亚洲成人在线高清| 久久九九国产精品| 国产精品白丝在线播放| 豆花视频操逼网址| 美国人人操人人操| 一区在线国产播放| 麻豆久久视频在线地址| 麻豆婷婷成人一二三| 熟女中出视频| 中出后入| 大香蕉线| 高潮的A片激情扒开一区| 午夜视频好爽啊| 18禁超污无遮挡无码免费网| 国产91久久九九免费精品无码| 免费一级视频特黄色大片| 亚洲欧美九九| 久久久久久久久久久999| 亚洲999综合| 熟妇视频一区二区三区在线| 91社操逼| 95精品在线| 97超碰无码网| 精品国产乱码久久久久久久| 精品人妻一区二区三区日产| 十八禁的黄污污免费网站| 丁香五月综合| 久久99草| 92性色国产午夜福利在线661| 亚洲 欧美 手机在线观看| 免费av大片| 久久久久无码一妻区| 婷婷五月天激情四射| 国产精品久久伊人| 亚洲伊人久久精品狠狠在线| 吉川爱美亚洲二区在线| 中字幕人妻一区二区三区| 国产人妻精品久久久一区二区三区 | 天天综合网1| 麻豆国产视频精品观看| 96精品在线| 无码男人天堂| 国产亚洲日韩欧| AV老汉| 377p欧洲日本亚洲大胆| 日韩AV中文字幕电影| 日本最新免费韩国1区2区视频播放| 中文字幕一区二区三区四五区| 久久无码电影| 天天综合麻豆视频| 一级性爱啪啪视频| 91中文精品日韩欧美在线| 操国产逼| 97干天天| 韩国成人精品久久久免费看| 日本最新免费韩国1区2区视频播放| 99热这里只有精品18| 在线观看一卡二卡| 美女久久久久久久久久久| 亚洲人成色9999精品久久| 九九九成人| 嗯啊不要在线观看嗯啊| 亚洲九九九| 九九热五区| 北约熟女超碰| 伊人久久亚洲色欲综合网站 | 中文字幕一区二区无码成人| 久久人妻办公室视频| 色吊丝 日日骚 清纯唯美| 青青11操操操操操操操操| 午夜男女爽爽大片免费观看| 亚洲情色1区| 影音先锋少妇| 91男人综合| 理论久久婷婷网 8| 97超碰磁| 色综合99999| 好吊妞转入那个网| 日韩福利综合一区| 成人一二三区| 99热精品青草在线| 91精品啪在线观看国产城中村| 亚洲AV不卡在线观看| 色噜噜婷婷| 国产成年免费大片黄在线观看| 欧美精品久久| 日韩乱中文 | 东京热亚洲一区二区| 色欲av国内精品久久久久久| 欧美曰韩国产精品| 欧美丝袜制服久久| 欧美亚洲| 国产亚洲精品美女| 吻戏激情性巴克| 日本性感人妻91| 欧美日韩人妻精品一区二区三区| 97人妻色| 中文激情网| 嫩草影院在线观看精品| 精品国产三级av韩国在线| 香蕉免费一区二区三区不读| 亚洲第一页欧美| 九九九网页| 天天综合网在线| 97人妻碰碰中文无码久热丝袜| 综合影视国产无码| 免费伦费视频在线观看| 久草网站免费在线观看| 岛国免费黄色网址| 欧美天天性| 欧美 色 亚洲| 狠狠色五月亚洲91| 农村少妇久久久久久久| 精品国产乱码久久久久久久久久毛片| 偷拍欧美亚洲| 日本免费二区三区| 欧美激情亚洲情色| 欧美久久人妻少妇一区二区| 四虎影视在线| 国产欧美一区二区| 无码人妻精品一区二区三区九九| 最新中文字幕av| 青青草久久在线| 狠狠躁久久躁| 日韩青久久| 伊人骚琪琪亚洲天堂网站| 欧美精品三区| 在线观看国产黄色| 99综合| 日本三级韩三级99久久| 欧美性爱97超碰| 欧洲小说色图视频另类| 热久久无毒不卡| 久久精品一区二区三区四区五区| 久久丁香久草综合网| 爱妃国产亚洲视频中文字幕| 操逼国产免费| 国产成人网址| 亚欧美综合网。| 少妇色| 久操精品网| 日韩99神马视频播放| 亚洲高清91| 久操凹凸视频| 爱欲AV| 9118禁| 天天干人妇| 97超碰热线| 亚洲一区二区AV| 国产精品婬乱一级毛片彝族| 热久久精品| 国产精品一区二区后入| 国产老太乱伦一区| 日韩AC| 久久久96精品| 久久久亚洲Av| 密臀AV在线| 白丝被操91| 炮色五月| 天天综合网91| 97网址www| 人人澡人人干| 少妇超碰在线| 欧洲精品二区| 国产精品熟女丝袜一区二区| 国精综合一二三区影视| 成人毛片免费| 少妇高潮99p| 精品免费一区| 性欧美另类高清| 一起草视频在线| 亚洲不卡AV在线| 亚洲风情在线观看| 中文字幕在线播放2中文字幕在线观看2| 天天超级碰碰碰| 国产精品黑人一区二区三区| 久久国产精品91| 精品美女少妇一区二区| 日韩999| 欧美色97| 无码99| 久久精品噜噜噜成人看免欧美大片| 色黄色美女大长腿午夜视频| 婷婷丁香一区二区三区| 日韩性爱毛片操骚逼| 99re69综合| 国产操操日韩三级黄| 精品一区二区久久| 丁香五月性爱| 久久久精品网站| 欧美大片天天看| 国产精品人人爽人人做可爱福利| 久久久久久中文版| 国产小u女在线观看| 色九久| 国产精品丝袜久久亚洲不卡| 日韩黄色成人性爱| 天天射天天操天天干天天吃2018| 国产精品高潮久久AV| 亚洲综合激情五月久久| 色吧5亚洲| www.acm成人黄色毛片| 天天综合网一91网| 夜夜影视四色| 久久大黄片| 男人的天堂com| 夜夜爽77777| 国产粉嫩出水在线播放| 99久久无码| 疯操AV| 九九AV| 九九综合网| 大香蕉九九| 亚洲性高潮| 狠狠图片青青草| 色9999日韩国产| 91综合中文字幕| 91痴汉| 欧美日韩人人精品| 91高清无码下载| 欧美日韩国产成人高清| 精吧天堂| 操b网站亚洲无码| 91碰碰碰| 久久精品国产亚洲AV无码电影| 国产三级片在线观看| 蜜桃传媒视频第一区入口在线看| 97超碰美国| 高清在线偷拍自拍视频| 亚洲国产尤物yw在线观看| 超碰91在线| 99re超碰| 91免费看中出视频| 日本久久久久久久久久| 久久久久元码视频| 黑人中出21连凳花野真衣| 爱爱60秒免费视频| 在线有码中文字幕| 就去色综合| 激情婷婷丁香网| 99re视频在线播放青草| 日本理论在线| 色爱综合网| 精品久久久久久亚洲| 亚洲麻豆精品二区三区| 992这里有精品| 黄色成品网站| 人妻在线大香蕉| 亚洲精品蜜桃久久久久久久| 欧亚揄拍偷拍精品视频| 国产人妻精品一区二区三区秋霞| 男人的天堂日韩| 9久9久| 天天草天天日| 欧美日韩国产黄色片| 成年人一级黄色毛片大全在线观看| 亚洲色图日韩精品| 婷婷五月天av| 爽爽爽免费视频| 综合激情一一91| 精品一区二区三区丰满熟女-亚洲欧美一区| 97天天操| 高清无码在线播放网站| 久久久久久AV无码免费网站| 97人人干人人操| 久久久熟妇熟女国产| 蜜臀久久99精品久久久老,,| 人人噜夜夜操| 久草新在线| 午夜福利在线合集| 特级大荫道BBwBBwBBW| 性交一区二区在线播放| 一起草三级AV电影在线观看| 亚洲中文国际强奸字幕| 五月丁香啪啪啪| 亚洲清纯唯美| 国产操逼网站亚洲一级黄色| 看一级黄色视频| 诱惑人妻欧美一区在线播放| 久久极品一区二区| 国产精品免费日韩| 亚洲精品 超碰| 97久久久网站| 欧美精品成人在线播放| 久久超碰亚洲人| 夜夜欧美 | 色牛aV| 操美女高潮抽搐白浆| 国产诱惑| 国产亚洲日韩欧| 2019AV天堂| 9久久久久| 91久久久久久久| 欧美色老汉| 精品无码久久久久久国产浪潮| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 中文字幕精品三级久久久| 天天夜夜rb| 亚洲美女自拍偷拍视频| 国产精品久久9| 国产深喉视频一区二区| 色区久久| 国产精品午夜福利| 人妻中文字幕日韩电影| 六月婷激情福利天堂69| 91N综合在线| 夜夜爽妓女| 粉嫩AV一区二区夜夜| 国模少妇一区二区三区| 性老妇一区二区三区| 一卡二卡在线播放|