色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

前端性能優(yōu)化:防抖與節(jié)流的核心差異、工程實(shí)現(xiàn)與場(chǎng)景選型

前端性能優(yōu)化:防抖與節(jié)流的核心差異、工程實(shí)現(xiàn)與場(chǎng)景選型 做前端這些年被問(wèn)得最多的一類問(wèn)題不是框架怎么選而是“這個(gè)滾動(dòng)監(jiān)聽(tīng)卡得要死怎么辦”“輸入框每敲一個(gè)字就發(fā)一次請(qǐng)求后端同事快盯上我了”。這類問(wèn)題的答案基本都落在防抖Debounce和節(jié)流Throttle這兩個(gè)詞上而它們又恰恰是前端性能優(yōu)化里投入產(chǎn)出比最高的兩個(gè)小工具。這兩個(gè)概念人人都聽(tīng)過(guò)面試也能背出定義但真正在業(yè)務(wù)里寫對(duì)、用對(duì)、調(diào)對(duì)的人并不多——我見(jiàn)過(guò)太多把防抖寫成節(jié)流、把節(jié)流寫成“限流”、甚至在組件卸載之后還留著定時(shí)器默默執(zhí)行的代碼。這篇就把這兩個(gè)高頻回調(diào)控制手段徹底拆開(kāi)講它們各自解決什么問(wèn)題實(shí)現(xiàn)上有哪些坑等待參數(shù)該怎么算在搜索聯(lián)想、滾動(dòng)加載、按鈕防連點(diǎn)、埋點(diǎn)上報(bào)這些真實(shí)場(chǎng)景里怎么落地以及怎么和請(qǐng)求競(jìng)態(tài)、組件生命周期配合起來(lái)。無(wú)論你是剛?cè)腴T還是已經(jīng)寫了兩三年業(yè)務(wù)代碼看完至少能做到一件事拿到一個(gè)高頻觸發(fā)的場(chǎng)景幾秒鐘判斷出該用哪個(gè)并且能徒手寫出來(lái)不用翻文檔。1. 先把這兩個(gè)概念釘死在場(chǎng)景里1.1 高頻回調(diào)為什么會(huì)把頁(yè)面拖垮瀏覽器的主線程只有一個(gè)JS 執(zhí)行、樣式計(jì)算、布局、繪制全都排在它后面。一個(gè)mousemove在高刷新率設(shè)備上一秒能觸發(fā)一百多次一次scroll在慣性滾動(dòng)里也能輕松跑到六十次以上input事件更是每敲一個(gè)字符就來(lái)一次?;卣{(diào)本身不貴貴的是回調(diào)里通常干的事讀scrollTop、讀offsetHeight、改 DOM、發(fā)請(qǐng)求。這里有個(gè)很多人不知道的細(xì)節(jié)在同一個(gè)任務(wù)里先寫 DOM 樣式、緊接著讀布局屬性瀏覽器為了給你正確的值會(huì)被迫立刻做一次同步布局計(jì)算。你寫十次讀十次就是十次強(qiáng)制重排。滾動(dòng)監(jiān)聽(tīng)里那種“讀位置—改樣式—再讀位置”的寫法掉幀就是這么來(lái)的?;卣{(diào)頻率越高這種強(qiáng)制同步布局發(fā)生得越密集最終表現(xiàn)就是滾動(dòng)條拖不動(dòng)、手指劃下去畫面發(fā)黏。請(qǐng)求風(fēng)暴是另一個(gè)后果。搜索框如果不做控制用戶輸入“性能優(yōu)化”四個(gè)字會(huì)發(fā)出四次請(qǐng)求而且這四次請(qǐng)求的返回順序完全不保證——第一字的結(jié)果可能最后才回來(lái)把正確結(jié)果覆蓋掉用戶看到的聯(lián)想詞永遠(yuǎn)慢半拍。埋點(diǎn)上報(bào)更典型滾動(dòng)一次上報(bào)一次一篇文章從頭滑到尾能給你刷出幾百條日志服務(wù)端和客戶端兩邊都難受。所以這類優(yōu)化的核心思路從來(lái)不是“讓回調(diào)跑得更快”而是降低回調(diào)的執(zhí)行次數(shù)同時(shí)不破壞用戶感知的連續(xù)性。這就是防抖和節(jié)流要解決的問(wèn)題兩者都在做“降頻”但降頻的規(guī)則完全不同。1.2 防抖與節(jié)流的本質(zhì)差異等安靜 vs 按節(jié)拍我習(xí)慣用一個(gè)生活場(chǎng)景來(lái)講這個(gè)區(qū)別。防抖像電梯門只要還有人往里走門就一直重新計(jì)時(shí)直到徹底沒(méi)人了才關(guān)上。節(jié)流像地鐵班次不管站臺(tái)上擠了多少人車都是按固定間隔發(fā)一班人再多也不會(huì)連發(fā)三趟。落到代碼上防抖關(guān)注的是“事件停止后的那一刻”它把一串密集觸發(fā)合并成最后一次或第一次執(zhí)行節(jié)流關(guān)注的是“固定時(shí)間窗口內(nèi)的第一次”它保證在一段時(shí)間內(nèi)最多執(zhí)行一次中間密集的觸發(fā)直接被丟掉。這個(gè)差異決定了它們的適用面維度防抖 Debounce節(jié)流 Throttle觸發(fā)時(shí)機(jī)停止觸發(fā) wait 毫秒后執(zhí)行每隔 wait 毫秒最多執(zhí)行一次中間觸發(fā)不斷重置計(jì)時(shí)全部丟棄窗口內(nèi)的觸發(fā)被丟棄窗口末尾恢復(fù)執(zhí)行次數(shù)一整串操作通常只執(zhí)行 1 次與持續(xù)時(shí)長(zhǎng)成正比持續(xù)越久執(zhí)行越多典型場(chǎng)景搜索聯(lián)想、表單校驗(yàn)、窗口 resize 結(jié)束、自動(dòng)保存滾動(dòng)加載、滾動(dòng)視差、拖拽跟隨、埋點(diǎn)上報(bào)、按鈕防連點(diǎn)用戶感知有“等一下才響應(yīng)”的延遲感響應(yīng)是連續(xù)的只是頻率被壓低了判斷標(biāo)準(zhǔn)其實(shí)一句話就夠了你關(guān)心的是“最終結(jié)果”還是“過(guò)程中的連續(xù)反饋”搜索框里用戶敲完才是最終結(jié)果用防抖滾動(dòng)視差每挪一段就要更新一次位置用節(jié)流。搞混這兩個(gè)代碼不一定報(bào)錯(cuò)但體驗(yàn)會(huì)很別扭——比如把滾動(dòng)加載寫成防抖用戶必須停下來(lái)不動(dòng)才會(huì)觸發(fā)加載滑到底部一直滑就一直不加載這個(gè) bug 我見(jiàn)過(guò)不止一次。2. 防抖從“最后一次才執(zhí)行”到可配置的工程實(shí)現(xiàn)2.1 最小可用版本與它的三個(gè)致命缺陷網(wǎng)上流傳最廣的防抖實(shí)現(xiàn)大概長(zhǎng)這樣function debounce(fn, wait) { let timer null; return function (...args) { clearTimeout(timer); timer setTimeout(() fn.apply(this, args), wait); }; }十行不到日常用也確實(shí)能跑。但它有三個(gè)問(wèn)題在真實(shí)項(xiàng)目里遲早會(huì)咬你一口。第一個(gè)是this指向。注意上面內(nèi)層用的是箭頭函數(shù)箭頭函數(shù)沒(méi)有自己的this它捕獲的是debounce執(zhí)行時(shí)的外層this。如果你把返回的函數(shù)掛到某個(gè)對(duì)象上或者用在類方法里this就丟了。穩(wěn)妥的寫法是內(nèi)層用普通函數(shù)同時(shí)在入口處把this存下來(lái)const ctx this;然后fn.apply(ctx, args)。第二個(gè)是返回值。有些場(chǎng)景需要拿到被包裝函數(shù)的返回值比如表單校驗(yàn)函數(shù)返回布爾值防抖之后返回值直接變成undefined調(diào)用方拿到就懵了。這個(gè)得靠debounced.flush()或者閉包里緩存result來(lái)解決。第三個(gè)最要命沒(méi)法取消。組件卸載了、路由切走了、彈窗關(guān)閉了那個(gè)setTimeout還在隊(duì)列里時(shí)間一到照樣執(zhí)行執(zhí)行時(shí)訪問(wèn)的 DOM 早就沒(méi)了輕則報(bào)Cannot read properties of null重則往已經(jīng)銷毀的 store 里寫臟數(shù)據(jù)。所以一個(gè)能上生產(chǎn)的防抖必須帶cancel。注意定時(shí)器句柄一定要在外層閉包里聲明成let不要掛到返回函數(shù)的屬性上也不要用全局變量。每個(gè)防抖實(shí)例的定時(shí)器是獨(dú)立的混用會(huì)出現(xiàn)“A 的輸入把 B 的計(jì)時(shí)清掉”這種極其難查的串?dāng)_。2.2 立即執(zhí)行、取消與返回值把核心邏輯拆開(kāi)下面這版是我在項(xiàng)目里用了很久的實(shí)現(xiàn)支持首次立即執(zhí)行l(wèi)eading、末次執(zhí)行trailing、手動(dòng)取消cancel和立即結(jié)算flushfunction debounce(fn, wait 300, options {}) { let timer null; let lastArgs null; let lastThis null; let result; const { leading false, trailing true } options; function invoke() { if (!lastArgs) return result; result fn.apply(lastThis, lastArgs); lastArgs null; lastThis null; return result; } function debounced(...args) { lastArgs args; lastThis this; // 判斷這次是不是“新一串事件”的第一次 const callNow leading !timer; if (timer) clearTimeout(timer); timer setTimeout(() { timer null; if (trailing) invoke(); }, wait); if (callNow) invoke(); return result; } debounced.cancel function () { if (timer) clearTimeout(timer); timer null; lastArgs null; lastThis null; }; debounced.flush function () { if (timer) { clearTimeout(timer); timer null; invoke(); } return result; }; return debounced; }關(guān)鍵點(diǎn)拆一下。callNow的判斷依據(jù)是!timer而不是別的標(biāo)志位——因?yàn)樵谝淮瓮暾撵o默周期內(nèi)timer從setTimeout開(kāi)始一直到回調(diào)里置空這段時(shí)間它都是真值只有靜默wait毫秒之后才會(huì)變回null。用timer本身當(dāng)狀態(tài)能避免引入額外變量導(dǎo)致的時(shí)序錯(cuò)亂。invoke里做了if (!lastArgs) return result;的空判斷。這是因?yàn)閒lush()和定時(shí)器回調(diào)都可能調(diào)用invoke如果上一次已經(jīng)執(zhí)行完把lastArgs清空了再進(jìn)來(lái)就會(huì)用空參數(shù)調(diào)用一次原函數(shù)典型的“在控制臺(tái)看到一條參數(shù)為 undefined 的多余日志”。加了這個(gè)判斷flush在已經(jīng)執(zhí)行過(guò)的情況下就只返回緩存結(jié)果不會(huì)重復(fù)觸發(fā)。leading: true的場(chǎng)景很具體按鈕防連點(diǎn)。用戶點(diǎn)第一下要立刻有反饋不能等 300 毫秒后面連續(xù)的狂點(diǎn)全部丟掉同時(shí)trailing: false避免最后一次點(diǎn)擊又補(bǔ)一個(gè)請(qǐng)求導(dǎo)致用戶只點(diǎn)了一次卻發(fā)了兩個(gè)請(qǐng)求。而搜索聯(lián)想恰恰相反要leading: false, trailing: true等用戶停手再發(fā)。這兩個(gè)組合別搞反。2.3 參數(shù)計(jì)算wait 到底該給多少wait給多少?zèng)]有標(biāo)準(zhǔn)答案但有幾個(gè)錨點(diǎn)可以參照。前端有個(gè)公認(rèn)的感知閾值100 毫秒以內(nèi)的延遲用戶基本無(wú)感超過(guò) 200 毫秒開(kāi)始有“卡了一下”的感覺(jué)超過(guò) 1 秒就是明確的等待。所以防抖參數(shù)要在這個(gè)區(qū)間里找平衡。搜索聯(lián)想這類場(chǎng)景我一般給250 到 350 毫秒。低于 200 毫秒打字快的人還是會(huì)連發(fā)兩三個(gè)請(qǐng)求起不到合并效果高于 400 毫秒用戶敲完字會(huì)明顯感覺(jué)聯(lián)想詞“慢半拍”尤其是千兆寬帶下請(qǐng)求本身只要 30 毫秒返回延遲全壓在防抖上了。300 是個(gè)能兼顧兩邊的中間值。表單實(shí)時(shí)校驗(yàn)、自動(dòng)保存草稿這類可以放寬到500 到 800 毫秒。這些操作用戶本來(lái)就不期待即時(shí)反饋而且頻繁請(qǐng)求后端做唯一性校驗(yàn)服務(wù)壓力更敏感。窗口resize結(jié)束時(shí)重排圖表給150 到 200 毫秒就夠因?yàn)榉磸?fù)拖拽瀏覽器窗口邊框時(shí)觸發(fā)間隔本來(lái)就比較松散。這里還有個(gè)更容易被忽略的點(diǎn)輸入法組合輸入。用中文拼音打字input事件會(huì)在輸入拼音字母階段就觸發(fā)比如敲“xingneng”會(huì)連續(xù)觸發(fā)七八次但此時(shí)輸入框里的值是拼音串而不是漢字。如果只做防抖不做保護(hù)用戶拼音還沒(méi)選完就可能發(fā)出去一個(gè)?qxing的請(qǐng)求。解決辦法一行就夠let composing false; input.addEventListener(compositionstart, () { composing true; }); input.addEventListener(compositionend, (e) { composing false; handleInput(e.target.value); // 組合結(jié)束后立刻走一次 }); input.addEventListener(input, (e) { if (composing) return; // 組合期間直接忽略 handleInput(e.target.value); });handleInput本身就是防抖過(guò)的函數(shù)compositionend那一腳相當(dāng)于提前結(jié)算把拼音階段攢下的等待直接兌現(xiàn)用戶選完字的瞬間就能看到聯(lián)想結(jié)果體驗(yàn)比純防抖更順。3. 節(jié)流時(shí)間戳與定時(shí)器兩條路的取舍3.1 兩種基礎(chǔ)寫法差在哪節(jié)流的基礎(chǔ)實(shí)現(xiàn)有兩條路差異全在“首次”和“末次”上很多人背了代碼卻沒(méi)搞清楚這個(gè)差異用錯(cuò)了才發(fā)現(xiàn)問(wèn)題。時(shí)間戳版本function throttleByTimestamp(fn, wait) { let last 0; return function (...args) { const now Date.now(); if (now - last wait) { last now; fn.apply(this, args); } }; }它的特點(diǎn)是last初始為0第一次調(diào)用時(shí)now - last是一個(gè)巨大的正數(shù)必然滿足條件所以首次立即執(zhí)行但最后一次觸發(fā)如果落在當(dāng)前時(shí)間窗口內(nèi)就會(huì)被丟棄末次不執(zhí)行。滾動(dòng)視差用這個(gè)沒(méi)問(wèn)題頁(yè)面停下來(lái)時(shí)位置本身就是對(duì)的。但如果是“滾動(dòng)到底部加載更多”末次不執(zhí)行就意味著用戶正好停在一個(gè)卡在閾值附近的臨界位置永遠(yuǎn)不觸發(fā)加載得再動(dòng)一下手指才行。定時(shí)器版本function throttleByTimer(fn, wait) { let timer null; return function (...args) { if (timer) return; timer setTimeout(() { timer null; fn.apply(this, args); }, wait); }; }它反過(guò)來(lái)首次要等wait毫秒才執(zhí)行首延遲但最后一次一定會(huì)執(zhí)行末次必觸發(fā)。寬表格橫向滾動(dòng)同步表頭、拖拽結(jié)束后保存位置這類場(chǎng)景末次觸發(fā)很關(guān)鍵否則最后一下拖拽就丟了。3.2 組合版首尾都要觸發(fā)實(shí)際業(yè)務(wù)里最常需要的是“首次立即給反饋 末次補(bǔ)齊”把兩條路縫起來(lái)function throttle(fn, wait 200) { let lastTime 0; let timer null; function throttled(...args) { const now Date.now(); const remaining wait - (now - lastTime); if (remaining 0) { // 時(shí)間窗口已過(guò)立刻執(zhí)行并清掉可能存在的補(bǔ)丁定時(shí)器 if (timer) { clearTimeout(timer); timer null; } lastTime now; fn.apply(this, args); return; } // 窗口內(nèi)不再執(zhí)行但保證末次一定被補(bǔ)上 if (!timer) { timer setTimeout(() { timer null; lastTime Date.now(); fn.apply(this, args); }, remaining); } } throttled.cancel function () { if (timer) clearTimeout(timer); timer null; lastTime 0; }; return throttled; }代碼里有三個(gè)細(xì)節(jié)值得說(shuō)。remaining 0那個(gè)分支除了執(zhí)行函數(shù)還必須清掉已有的timer——因?yàn)榇翱谝呀?jīng)過(guò)了手動(dòng)執(zhí)行完如果再讓老定時(shí)器到期補(bǔ)一發(fā)就變成執(zhí)行兩次了。if (!timer)這個(gè)守衛(wèi)保證一個(gè)窗口內(nèi)最多只掛一個(gè)補(bǔ)丁定時(shí)器不會(huì)越積越多。lastTime在補(bǔ)丁定時(shí)器里要重新賦值否則下一輪判斷的基準(zhǔn)還是舊的窗口會(huì)算短。cancel里把lastTime重置成0是個(gè)小技巧。如果組件銷毀后又被復(fù)用比如彈窗關(guān)了再打開(kāi)重置時(shí)間基準(zhǔn)能讓第一次觸發(fā)立刻執(zhí)行而不是被上次遺留的時(shí)間戳卡住半個(gè)窗口。3.3 交給渲染節(jié)奏的 rAF 型節(jié)流如果節(jié)流的回調(diào)里要改樣式、做動(dòng)畫、算位置那又有一層更貼合瀏覽器的選擇用requestAnimationFrame代替定時(shí)器。原因很簡(jiǎn)單瀏覽器一幀是 16.7 毫秒60Hz 屏幕你用setTimeout(fn, 10)去做滾動(dòng)動(dòng)畫觸發(fā)點(diǎn)可能落在兩幀之間瀏覽器得把這次的樣式變更攢到下一幀才渲染反而多一次無(wú)效計(jì)算。rAF 會(huì)保證回調(diào)在渲染之前的那一幀執(zhí)行改動(dòng)和繪制對(duì)齊function rafThrottle(fn) { let ticking false; return function (...args) { if (ticking) return; ticking true; const ctx this; requestAnimationFrame(() { fn.apply(ctx, args); ticking false; }); }; }它的“節(jié)拍”不再是固定毫秒數(shù)而是跟著顯示器刷新率走60Hz 屏幕相當(dāng)于 16.7 毫秒一次120Hz 屏幕就是 8.3 毫秒一次。滾動(dòng)監(jiān)聽(tīng)里讀位置算聯(lián)動(dòng)、吸頂頭部切換、視差位移我基本都用這版。有個(gè)坑要避開(kāi)頁(yè)面切到后臺(tái)標(biāo)簽頁(yè)時(shí) rAF 會(huì)被暫停ticking會(huì)一直卡在true回來(lái)之后所有觸發(fā)都被吞掉。所以如果這東西用在長(zhǎng)生命周期的全局監(jiān)聽(tīng)上最好在visibilitychange里重置一下?tīng)顟B(tài)或者在頁(yè)面重新可見(jiàn)時(shí)手動(dòng)跑一次。4. 落地到真實(shí)業(yè)務(wù)三個(gè)高頻場(chǎng)景的完整方案4.1 搜索聯(lián)想防抖只是第一步競(jìng)態(tài)才是真問(wèn)題搜索框是防抖最常見(jiàn)的落地場(chǎng)景但只加防抖是半成品。真實(shí)情況是用戶先輸入“性能”請(qǐng)求 A 發(fā)出300 毫秒后又輸入“性能優(yōu)化”請(qǐng)求 B 發(fā)出。A 在路上堵了一下B 先回來(lái)了頁(yè)面渲染 B 的結(jié)果兩秒后 A 回來(lái)了把頁(yè)面覆蓋成“性能”的聯(lián)想詞。用戶看著輸入框里明晃晃的“性能優(yōu)化”四個(gè)字下面顯示的是“性能”的結(jié)果體驗(yàn)直接崩掉。處理方案是在防抖之外加一層請(qǐng)求序號(hào)校驗(yàn)let seq 0; const fetchSuggest debounce(async (keyword) { if (!keyword.trim()) { renderSuggest([]); return; } const current seq; try { const res await fetch(/api/suggest?q${encodeURIComponent(keyword)}); const data await res.json(); // 回來(lái)的時(shí)候如果序號(hào)已經(jīng)變了說(shuō)明這是個(gè)過(guò)期請(qǐng)求直接丟棄 if (current ! seq) return; renderSuggest(data.list); } catch (err) { if (current ! seq) return; renderSuggest([]); } }, 300);seq是個(gè)單調(diào)遞增的計(jì)數(shù)器每次發(fā)請(qǐng)求前自增并記下當(dāng)前值回來(lái)時(shí)對(duì)比。這個(gè)思路比AbortController取消請(qǐng)求更省事因?yàn)橛脩羰炙倏斓臅r(shí)候可能一瞬間發(fā)出好幾個(gè)請(qǐng)求挨個(gè)取消反而麻煩序號(hào)校驗(yàn)的好處是請(qǐng)求照發(fā)只是結(jié)果按最新的一版渲染。當(dāng)然如果你更在意省流量用AbortController把上一個(gè)請(qǐng)求掐掉也行注意abort會(huì)拋出一個(gè)AbortError得在 catch 里把它單獨(dú)過(guò)濾掉別讓它進(jìn)全局錯(cuò)誤上報(bào)。還有個(gè)體驗(yàn)細(xì)節(jié)請(qǐng)求發(fā)出到回來(lái)這段時(shí)間最好給輸入框一個(gè)pending狀態(tài)比如輸入框右側(cè)轉(zhuǎn)個(gè)圈。否則用戶敲完字之后 300 毫秒防抖 200 毫秒接口耗時(shí)加起來(lái)半秒多沒(méi)反應(yīng)會(huì)以為頁(yè)面卡了。4.2 滾動(dòng)加載與埋點(diǎn)上報(bào)節(jié)流 單調(diào)時(shí)鐘滾動(dòng)加載更多的判斷邏輯本身不復(fù)雜核心是算距離底部的距離const onScroll throttle(() { const doc document.documentElement; const distanceToBottom doc.scrollHeight - window.innerHeight - window.scrollY; if (distanceToBottom 300 !loading hasMore) { loadNextPage(); } }, 200); window.addEventListener(scroll, onScroll, { passive: true });這里有兩個(gè)容易被忽略的點(diǎn)。一是{ passive: true }它告訴瀏覽器這個(gè)監(jiān)聽(tīng)器不會(huì)調(diào)用preventDefault()瀏覽器就不用等回調(diào)執(zhí)行完再滾動(dòng)滾動(dòng)流暢度能明顯提升。滾動(dòng)、觸摸移動(dòng)這類高頻事件都該加上不加的話控制臺(tái)會(huì)給你一條“consider marking your touch and wheel event listeners as passive”的提示。二是閾值別給太小。distanceToBottom 300意思是距離底部還有 300 像素就開(kāi)始加載這個(gè)余量是為了讓下一頁(yè)在用戶真正滑到底之前就準(zhǔn)備好。如果你只有一個(gè)可滾動(dòng)容器比如固定高度overflow: auto的列表window.scrollY就用錯(cuò)了得換成容器的scrollTopinnerHeight換成clientHeightscrollHeight換成容器的scrollHeight。這種混用是滾動(dòng)加載不觸發(fā)的頭號(hào)原因我在好幾個(gè)項(xiàng)目里都遇到過(guò)。埋點(diǎn)上報(bào)的場(chǎng)景對(duì)時(shí)鐘更敏感。用Date.now()計(jì)算時(shí)間差有個(gè)隱患用戶在系統(tǒng)設(shè)置里手動(dòng)改了時(shí)間或者設(shè)備自動(dòng)校時(shí)跳了一下Date.now()會(huì)出現(xiàn)跳變可能算出一個(gè)負(fù)的間隔導(dǎo)致節(jié)流失效now - lastTime變成負(fù)數(shù)永遠(yuǎn)滿足條件或者長(zhǎng)時(shí)間不觸發(fā)。穩(wěn)妥做法是用單調(diào)時(shí)鐘performance.now()const report throttle(() { const payload { page: currentPath, depth: Math.round((window.scrollY / document.body.scrollHeight) * 100), ts: Date.now() // 上報(bào)時(shí)用真實(shí)時(shí)間戳用于統(tǒng)計(jì) }; navigator.sendBeacon(/api/track, JSON.stringify(payload)); }, 800);注意分工控制頻率用performance.now()業(yè)務(wù)時(shí)間戳用Date.now()。兩者各司其職別混著用。另外上報(bào)優(yōu)先用navigator.sendBeacon它在頁(yè)面卸載時(shí)也能把數(shù)據(jù)遞出去比在unload里發(fā)同步請(qǐng)求靠譜得多。4.3 按鈕防連點(diǎn)與框架里的清理按鈕防連點(diǎn)用leading: true, trailing: false的防抖最合適const handleSubmit debounce(async (formData) { submitting.value true; try { await api.submit(formData); toast.success(提交成功); } finally { submitting.value false; } }, 800, { leading: true, trailing: false });wait給 800 毫秒是為了覆蓋一次接口往返。這里有個(gè)前提防抖只能攔住“快速連點(diǎn)”攔不住“網(wǎng)絡(luò)慢導(dǎo)致的重復(fù)提交”。如果接口要跑 3 秒用戶在 800 毫秒后再點(diǎn)一次照樣能發(fā)出去第二個(gè)請(qǐng)求。所以服務(wù)端冪等唯一請(qǐng)求號(hào)和按鈕禁用狀態(tài)這兩層還是得有防抖只是第一道最廉價(jià)的防線別指望它解決全部問(wèn)題??蚣芾镒铌P(guān)鍵的一步是清理。防抖和節(jié)流返回的函數(shù)都持有閉包和定時(shí)器組件卸載時(shí)必須調(diào)cancel否則定時(shí)器到期執(zhí)行時(shí)訪問(wèn)的響應(yīng)式變量、DOM 引用都已經(jīng)失效。React 里的封裝function useDebouncedCallback(fn, wait, deps []) { const fnRef useRef(fn); fnRef.current fn; const debounced useMemo( () debounce((...args) fnRef.current(...args), wait), [wait] ); useEffect(() () debounced.cancel(), [debounced]); return debounced; }fnRef這層是關(guān)鍵。如果把fn直接塞進(jìn)useMemo的依賴?yán)锔附M件每次重渲染傳進(jìn)來(lái)的新函數(shù)都會(huì)讓防抖實(shí)例重建定時(shí)器全部作廢防抖直接失效——這是 React 里防抖“看起來(lái)沒(méi)生效”的最常見(jiàn)原因。用 ref 存最新的函數(shù)、useMemo只依賴wait實(shí)例就穩(wěn)定了。Vue 3 里思路一致用onUnmounted收拾import { onUnmounted } from vue; export function useThrottle(fn, wait 200) { const throttled throttle(fn, wait); onUnmounted(() throttled.cancel()); return throttled; }順帶提一句全局監(jiān)聽(tīng)的問(wèn)題。如果監(jiān)聽(tīng)器掛在window上組件卸載時(shí)不僅要removeEventListener還要先cancel掉包裝函數(shù)。因?yàn)閍ddEventListener存的是包裝后的引用你remove的時(shí)候必須傳同一個(gè)引用很多人重新寫了一遍throttle(fn)去移除函數(shù)引用不同根本刪不掉監(jiān)聽(tīng)器就這么一直掛著內(nèi)存和 CPU 一起漏。5. 選型、排查與踩坑速查5.1 一張決策表把選型問(wèn)題關(guān)掉每次有人問(wèn)我“這個(gè)該用防抖還是節(jié)流”我基本按下面這張表回答實(shí)測(cè)覆蓋了九成場(chǎng)景場(chǎng)景選擇建議參數(shù)關(guān)鍵配置搜索框聯(lián)想防抖250-350mstrailing: true配合請(qǐng)求序號(hào)表單實(shí)時(shí)校驗(yàn)防抖400-600ms監(jiān)聽(tīng)compositionstart/end自動(dòng)保存草稿防抖800-1500ms卸載前flush一次窗口 resize 重排防抖150-200ms圖表類可配合ResizeObserver滾動(dòng)加載更多節(jié)流150-250mspassive: true注意容器內(nèi)滾動(dòng)的取值埋點(diǎn)曝光上報(bào)節(jié)流500-1000ms用performance.now()計(jì)時(shí)拖拽跟隨、視差rAF 節(jié)流跟幀走后臺(tái)切回時(shí)重置狀態(tài)按鈕防連點(diǎn)防抖500-800msleading: true, trailing: false輸入框字符數(shù)統(tǒng)計(jì)不處理—純計(jì)算本身開(kāi)銷可忽略最后一行值得單獨(dú)說(shuō)。不是所有高頻事件都需要包裝像字符數(shù)統(tǒng)計(jì)、簡(jiǎn)單的class切換開(kāi)銷就是幾微秒硬套一層防抖反而增加復(fù)雜度還可能引入時(shí)序 bug。優(yōu)化的第一步永遠(yuǎn)是先測(cè)量performance面板跑一遍看看到底是哪個(gè)函數(shù)吃掉了時(shí)間別憑感覺(jué)上工具。5.2 常見(jiàn)問(wèn)題排查表下面這些是我和同事在真實(shí)項(xiàng)目里踩過(guò)的、并且反復(fù)出現(xiàn)在代碼評(píng)審里的問(wèn)題按現(xiàn)象整理成速查表現(xiàn)象大概率原因處理方式防抖“完全沒(méi)生效”每次觸發(fā)都執(zhí)行包裝函數(shù)在每次渲染時(shí)被重建React 用useMemo固定實(shí)例Vue 放setup頂層報(bào)Cannot read properties of null組件卸載后定時(shí)器仍執(zhí)行卸載時(shí)調(diào)用cancel()節(jié)流第一次不觸發(fā)用了定時(shí)器版本首延遲換組合版或把lastTime初始化為-Infinity節(jié)流最后一次不觸發(fā)用了時(shí)間戳版本加補(bǔ)丁定時(shí)器或改組合版中文輸入發(fā)了一堆拼音請(qǐng)求沒(méi)處理組合輸入compositionstart/end攔截聯(lián)想詞和輸入框內(nèi)容對(duì)不上請(qǐng)求競(jìng)態(tài)序號(hào)校驗(yàn)或AbortController滾動(dòng)加載在某個(gè)位置永遠(yuǎn)不觸發(fā)只判斷了一次或取值對(duì)象用錯(cuò)換容器滾動(dòng)取值加distanceToBottom打印摘除監(jiān)聽(tīng)后仍在執(zhí)行移除的引用和添加的不一致保存包裝函數(shù)引用先cancel再remove頁(yè)面切后臺(tái)回來(lái)動(dòng)畫不同步rAF 暫停導(dǎo)致ticking卡死visibilitychange里重置5.3 我踩過(guò)的三個(gè)坑第一個(gè)坑是防抖和節(jié)流混著用。早年做一個(gè)橫滑表頭的表格我給scroll套了防抖本意是等用戶停下滑動(dòng)再同步表頭位置。結(jié)果用戶習(xí)慣一路滑到底全程表頭紋絲不動(dòng)停下來(lái)的瞬間“啪”地跳過(guò)去觀感極差。后來(lái)?yè)Q成 rAF 節(jié)流滾動(dòng)過(guò)程中表頭平滑跟隨問(wèn)題當(dāng)場(chǎng)就沒(méi)了。這件事讓我記住凡是需要過(guò)程連續(xù)反饋的一律節(jié)流只有需要等最終結(jié)果的才用防抖。第二個(gè)坑是參數(shù)給得太激進(jìn)。有個(gè)項(xiàng)目的搜索聯(lián)想防抖給了 500 毫秒測(cè)試環(huán)境一切正常上了生產(chǎn)用戶反饋“輸入框像死了一樣”。排查半天發(fā)現(xiàn)接口在弱網(wǎng)下平均要 400 毫秒才返回500 400 將近一秒用戶早就不耐煩了。后來(lái)把防抖降到 250 毫秒同時(shí)在輸入框里加了個(gè) loading 指示觀感立刻好轉(zhuǎn)。防抖的延遲和接口耗時(shí)是疊加的不是取最大值算參數(shù)時(shí)必須把這段一起算進(jìn)去。第三個(gè)坑是過(guò)度包裝。有個(gè)列表頁(yè)給每一行的一個(gè)小圖標(biāo)都套了獨(dú)立的節(jié)流函數(shù)五百行就是五百個(gè)閉包加五百個(gè)定時(shí)器句柄頁(yè)面一進(jìn)去內(nèi)存就蹭蹭漲。這種情況正確的做法是把包裝函數(shù)提到列表外面所有行共享一個(gè)節(jié)流實(shí)例靠event.target或者行索引區(qū)分?jǐn)?shù)據(jù)來(lái)源。包裝函數(shù)是有成本的別在循環(huán)或者列表項(xiàng)里現(xiàn)造。后續(xù)如果還想往深里走可以看看這兩個(gè)方向一是把防抖節(jié)流和IntersectionObserver、ResizeObserver結(jié)合起來(lái)能用觀察者解決的問(wèn)題就不用監(jiān)聽(tīng)事件瀏覽器原生幫你算比 JS 里反復(fù)讀布局便宜得多二是去翻一翻成熟工具庫(kù)的源碼實(shí)現(xiàn)對(duì)比一下它們?cè)趌eading/trailing邊界、maxWait這類擴(kuò)展參數(shù)上的處理方式會(huì)發(fā)現(xiàn)自己手寫版本里漏掉的很多邊角情況。我個(gè)人在實(shí)際操作中的體會(huì)是這兩個(gè)函數(shù)加起來(lái)不到五十行但真正吃透它帶來(lái)的收益遠(yuǎn)超五十行代碼本身——它訓(xùn)練的是對(duì)“事件頻率、執(zhí)行時(shí)機(jī)、生命周期”這三件事的敏感度這種敏感度放到任何性能優(yōu)化場(chǎng)景里都用得上。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久极品| 久久精品久久久久久久久| 夜夜夜夜爽| 欧美性爱无码一区二区三区| 大香蕉AV丝袜| 亚洲欧美国产va在线播放频| 91亚洲丝袜| 国产粉嫩出水在线播放| 久热这里| 亚洲人妻av| 美女十八禁| a在线观看| 91黄站| 色婷婷综合网站| 日韩无码视频黄色| 亚洲综合情色| 五月天伊人| 无码高清少妇久久| 国产精品久久| 国产 大胆 对白| 欧美日韩精品一区二区三区高清| www.人人摸在线视频| 欧美色图私拍91| 另类小说五月天| 试看日韩黄片| 狠操91,com| www九九热| 大香蕉免费3| 欧美与日韩97| 99热免费| 高清成年美女黄网站免费大全| 蜜桃一区二区三区| 亚洲宅男天堂| 99re公开精品免费视频| 日本人妻中文字幕精品| 四方色播| 亚洲男人天堂视频| 少妇色综合| 综合 亚洲 欧美| 国产黄a三级三级三级av在线看| 亚洲图片色图欧美另类| juliaann丝袜| 日本国产欧美一区三区二区| 免费成人自拍视频在线| 997色在线| 欧美少妇色综合| 五月丁香色婷婷| 少妇啪啪自拍| 国产一级内射高清视频 | 精品人妻一区二区三区蜜桃视频| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 欧美亚洲AN| 免费无码国产精品v片在线观看| 超碰97国产欧美| 高跟丝袜AV专区国产| 欧美综合自拍亚洲综合图| 日日日色色色色色| 婷婷性网| 操死我了啊啊啊| 韩国毛片一区二区三区| 欧美午夜熟妇黑人精品91| 午夜操操操| 欧美综合网A| a片偷拍视频| 一个国产在线综合网站| 欧美一级黄色18片免费看| 日韩综合成人免费视频| 精品在线观看视频在线| 99无码| 夜夜一区二区| 色优久久| 欧美一区二区在线资源| 久久久精品国产亚洲伊人| 亚洲美女自拍偷拍视频| 五月天婷精品激情| 性色一线| 999热日韩精品| 夜夜草我| A一区片| 日韩乱中文 | 欧美18老人禁| 亚洲中文字母在线播放| 69精品人人人人| 91在线免费观看处女| 色精品极品| 亚洲诱惑| 久久超碰网| 欧美牲| 成人亚欧免费视频| 日韩情色AV| 1204av韩国| 中文不卡视频| 郑州宾馆老熟女露脸啪啪| 精品区9| 国产亚洲精品美女| 最新av中文字幕高清| 色爱国产| 91大神电影天堂| 台湾佬中文娱乐网久久久久久久久久com | 欧美日韩99精品麻豆传媒| 开心激情婷婷| 午夜操一操| 亚洲乱码尤物193YW| 亚洲AV乱码专区国产噜噜亚洲 | 成年人黄色| 国产精品久久久久久照片| 久热99| 97资源亚洲| 手机在线视频国内精品| 美女高潮视频91| 狠狠做深爱婷婷久久二区| 亚洲综合影院| 国产色呦呦| 亚洲丝袜色图| 亚洲欧美另类激情小说| 97人妻碰碰中文无码久热丝袜| 青青伊人加勒比海| 搞中出久久| 久久精品人体AV| 日本媚薬中文字幕在线| 69精品久久久久中文字幕| 东北黄色电影| 欧美97爱| 超碰爽人妻熟女Av| 成熟熟女国产精品一区二区| 国产黄色小视频网站| 一道本东京热加勒比一区二区三区| 国产9熟妇视频网站| 欧美大香蕉专区网| 久久久久久久综合,国产| 黄片色区软件| 2019亚洲男人天堂| 九九探花视频在线观看| 91插B网站| 在线视频日韩欧美国产| 91天美免费| 久草福利在线资源站| 欧美在线综合| 男人天堂久久精品| 亚洲国产精品99久久久| 是还免费视频1727我| 国产aⅴ无码片毛片一级网站| yazhousetuoumei| 亚洲色欲天天天堂色欲网女| 后入式视频国产自| 国产精品成人在线| 久久精品国产亚洲5555| 日本蜜桃| 亚洲乱妇p22| 色噜噜人妻丝袜a∨先锋影| 免费男人的天堂| 99综合| 97精品一区二区三区免费| 久久免费老司机精品| 色综合av综合久久| 日韩视频小说在线观看| 最新AVzaixian| 一区二区中文| 欧美性综合| 国产免费永久精品无码| 亚洲素人网| 国产一区二区欧美日本| 日韩av无码网站| 99热网站| 亚洲精品乱码线路中文字幕 | 亚洲熟女乱综合一区二区三区| 黄色区免费观看中文字幕| 97人人色| 大香蕉手机在线| 尤物视频偷拍免费| 熟女熟妇一区二区三四区| 婷婷爽人人婷婷爽视频| 人妻无码久久一区二区三区免费| 五月天色图| 国产美女在线精品免费看| 狠狠爱AV| 一区二区三区日韩欧美 | 欧美人妻少妇| 东京热大香焦| 蜜伊人色综合97| 成人性爱电影一区二区| 97精品全部| 欧美久久婷婷| 混色激情av| 国产熟女| 亚洲中文日韩欧美大香蕉视频| 亚洲无码精品AV久久久| 欧美性xxxxx狂欢| av东京热男人的天堂| 九九色色| 国产高清精品福利| 日韩人妻播放| 99老司机精品视频在线观看| 久艹日日日| 99热18这里只有精品| 色穴精品| 在线人妻熟女一区二区三区四区五区| 91热爆在线| 一卡二卡三卡| 大香焦A片| 欧美性xxxxx狂欢| chaopen97久久| 欧美日韩人妻少妇 一区二区三区| 操操AV电影| 日本在线激情一区二区三区| 亚洲成人久久美女| 日韩性爱电影一区| 色色婷婷丁香| 任你爽视频| 夜嗨影院| 97久精品| 人人澡人人弄| 啊啊啊啊啊啊啊啊啊啊在线观看| 日本精品国产视频| 91快色色色色色| 日本东京热久久久电影| yw尤物av无码点击进入麻豆| 国产亚洲精品A在线观看下载| 人妻夜夜爽天天爽三区麻豆AV网站| 久久国产精品91| 高清有码一区二区| 欧美国产日韩高清在线| 男男H黄动漫啪啪无遮挡网站| 黑人白女精品一区| 人人扣人人操| 九九精品热| 99亚洲天堂| 亚洲色色色| 久久久久久久久久久六六| 操操AV电影| 色一射色一射| 综合97久久| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 久久色激情一区二区三区| 能看的AV| AV天堂男人的天堂| 亚洲色图 综合| 国产成人99久久亚洲综合| 岛国爱情动作片在国产AV无码专区亚洲AV漫画 | 婷婷久久久精品| 清纯唯美激情| 欧美成熟性爱精品| 久久精品三级影视| 久久久久久中文字幕中文字幕最新| 一区二区三区日韩欧美 | AV在线播放网址| 男人天堂新在线| 啊啊啊好多水| 亚洲精品影视老司机| 日本3级一区二区免费| 国产性感骚丝袜在线| 综合激情一一91| 国产精品农村妇女| 性爱免费视频成人| 超碰国产精品久| 亚州操逼网| 久久熟女人| 日本不卡二三区| 91热色| 婷婷婷婷婷婷久久久久| 激情开心五月天| 久久精品老司| 天天看人人操屄犊摸阴| 九九五月天| 中国一级操逼视频| 91色艳| 天美传媒av在线| 狠狠操狠狠操操| 日本亚洲熟女视频| 国产熟女二区| 欧美18老人禁| 欧美一二在线| 福利视频合集| 色婷婷久久| 91/欧美| 激情小说日韩无码| 欧美熟女激情| 青青草好吊色| 免费A V在线| 亚州综合AⅤ| 午夜性刺激视频免费观看| 国产超碰| 蜜乳av一区二区三区四区不卡| 欧美成人一级麻豆| 色呦呦、国产精品| 蜜臀久久99精品久久久久久婷婷| 视频二区美腿制服人妻欧美| 高树玛利亚无码流出| 天天色综合影视网| 欧美日韩国产色图在线| 亚洲国产成人精品久久久国产成人一区二区| 郑州宾馆老熟女露脸啪啪| 德国一二三不卡| 97日亚洲欧美| 久久这里精品国产99丫e6| 中文字幕视频在线观看| 伊人五月天| 超碰导航97| 自拍偷拍2025在线观看| 欧美综合色综合| 国产浮力影院第1页| 欧美久久久| 免费看国产曰批40分钟怎么下载| 日韩午夜精品一区二区三区电影| 美女AV一区二区| 亚洲精品乱码线路中文字幕| 欧美变态激情网| 亚洲av综合色区图片亚洲| 99热aaa| 人人妻碰人人免费| 色婷婷久久综合超碰| 日曰骚久久精品| 性性久久| 亚洲AV免费在线| 天美传媒麻豆一区二区三区国产精| 免费综合亚洲中文| 美欧色综合| 久久99国产综合精品女同| 男人天堂欧美| 国产精品网站免费 | 97香蕉碰碰人妻国产欧美| 国产2.3.4区| 精品国产乱码久久久久久久久1 | 大香蕉99热| 欧美一区二区三区入口| 青青久日| 综精品久久久aaaa| 欧美日韩操操操| 久久有码视频| 日韩av熟女一区二区三区成人| 国产精品原创巨作?v网站| 欧美亚洲厕所精品偷拍91| 久久九九视频九九视频| av天堂电影网| 欧美日动态视频| 五月综合久久| 天天草夜夜草高潮片| 蜜桃午夜视频一区二区 | AA特级绝黄| 97欧美综合| 亚洲第一二区另类图| 尤物一级在线免费观看| 亚洲本色精品一区二区久久| 嗯~啊~轻一点 视频| 操人人| 97久久久久久久久久| 人妻天天夜夜爽一区二区| 国产又猛又粗又爽又黄| 亚洲色图A| 日本一片一区| 屌逼麻豆| 国产精品无码AV网站| 啊啊啊在线观看| 精品人妻一二三四区视频| 天天欧美欧美亚洲网| 天天综合网日韩| 婷婷九月丁香| 中国小夫妻勾搭露脸淫荡对白| 97操碰| 18禁免费视频| 亚洲第一页第二页激情| 激情综合 婷婷五月 红杏| 熟妇亚洲一区二区三区| 九九九草| 欧美日本天堂| 91人妻视频在线| 久操热线| 人妻少妇av在线观看| 成人无遮挡毛片免费看| 日本韩高清无砖码22o| 欧美日韩人妻精品一区二区三区| 天天内射| 国精综合一二三区影视| 日本一区二区三区欧美日韩中文字幕| 欧美激情1区| 美日韩男女操屄视频| 日韩无码服务区| 级品肉射| 天天内射| 青青草色情网站视频| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久久久ab| 青青草视频爽一爽| 无码一区二区三区四区五区六区七区八区九区十区视频 | 日韩精品视频在线观看一卡二卡| 欧美αv.com| 日本人妻伦在线中文字幕| 亚洲激情视频| V A在线| 亚洲成a人v欧美综合天堂下载| 欧洲精品二区| 91综合网站| 国产按摩一区二区三区| 97超色| 2017超碰| 超碰到97情色| 亚洲Av诱惑| 日韩97在线| 午夜爽爽爽| 日韩无码极品| 亚洲日韩视频二区| 久久伦理视频久久大香蕉视频| 天天日天天干天天操| 一本久久精品中文字| 蜜桃中文字日产乱幕4区| 欧插网站| 精品人妻夜夜草| 国产9 9在线 | 亚洲| 国产午夜福利合集| 78操B| 日本999精品| 狠狠干狠狠干| 久久超碰爱| 久久一区无码| 91五月天| 中文字幕成人乱码熟女精品国50| 69天堂| 久久久久人妻二区精品叶可怜| 久久久久久电影| 偷拍自拍在线视频观看| 激情六月天| 亚洲高清视频在线观看| 国产精品69久久久久孕妇欧美| 夜夜嗨TV| 欧美日韩国产另类综合| 欧美 亚洲 偷拍自拍| 超碰97起碰| 蜜臀99999| 国产97在线播放| 91在线免费精品视频| 日日摸夜夜夜夜爽| 视频二区美腿丝袜制服人妻欧美| 九九亚洲精品| 日韩综合色图| 不卡啪啪视频| 欧美国产成人在线| 色欲天天综合久久久无码网中文| 四虎影视永久在线观看精品免费网站| 午夜免费福利视频一区| 有码人妻系列| 大香蕉草草| 日韩中文字幕视频| 91麻豆天美国产欧美| 金典av| 2024年最新色情网站在线观看| 青青操综合网| 九九亚洲精品| 欧美天天综合网| 国产极品99热在线播放69| 美中韩AV综合网| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 亚洲国产综合久久天堂| 欧美亚洲在线| 人妻乱仑一区二区三区| 亚洲第91页| 国产91福利小视频在线观看| 激情五月综合| 欲色综合| 日本精品成人无码| 欧美精品亚洲精品日韩传电影| 欧美在线永久天堂| 99热97| 91亚洲人| 一区二区三区机械有限公司| 99久在线精品99re8| 不卡一区二区日本视频| 夜夜国产一区| 久久透逼视频| 成人综合网 欧美| 国产精品久久久| 亚洲欧美成人在线| 九九九九九九综合| 日本超碰在线国产一区| 男人综合网| 一起草av| 少妇蹲下露出大唇5| 99精品久久久久久久婷婷蜜桃| 国产精品午夜福利视频| 久艹视频在线| 91亚洲欧美激情| 日本一级二级三级网站| 亚洲AV无码国产精品久久久久 | 国产精品ⅴ无码大片在线看.| 你操综合| 国产毛片毛片4p懂色| 一牛影视久久久一区二区三区| 久久加勒比| 中文啪啪视频| AA级电影三区| 97天天在线| 国产精品爽爽va在线观看98| 竹菊一区二区三区AV线| 精品色色| 日本αv| 九九九九九九九九九五码| 国产最新小视频在线播放下载 | 色欲无码人妻日韩欧美精品| 很很很很操| www.国产高潮精品| 色爱亚洲| 大香网伊人久久综合网eew| 亚洲网污污污污| 骚货人妻偷情自拍在线视频| 欧美天天综合网| 亚州精品丝袜-不卡成人免费| 国产Av超碰| 啊啊啊好疼| 思思视频免费看网站| 国产大片精久久久久久| 亚洲日韩美国人妻| 国产精品成人午夜福利| 天天做天天爱天天爽AV| 91精品国产麻豆国产自产在| 夜夜爽夜夜| 成人午夜无码视频| 国产美女口爆吞精视频| 久久一本大香蕉 | 9118禁| 免费看污网站| 国产粉嫩出水在线播放| 中文久久| 亚洲天堂少妇| 伊人网在线观看| 日韩人妻无码专区| 久久欲| 超碰97久| 精品人妻一区二区三区视频| 人妻少妇一区二区| 国产精品久久伊人| 免费的黄片有限公司| 日韩精品一二三| 久久精品国产久精国产| 中文字幕日产av人| 亚洲色五月| 做爱A级亚欧| 日本久久女同性恋视频| 深夜激情 | 精品蜜乳AV免费观看| 综合色久欲| 99抽插| 天天摸天天插天天日| 成人网站 免费观看| 国产一区二区免费福利片| 欧美激情精品| 91高清欧美| 茄子社区国产精品| 东北女人操比视频| 91色图片| 97爱欧美| 熟妇高潮一区二区免费视频| 99热91| 欧美顶级黄片AAAAA在线免费看| 成人小说视频在线精品欧美| 久久在线观看免费视频 | 99热免费| 亚州色图第三区| 欧美婷婷| 无码精品久久| 亚洲情色91| 婷婷丁香六月| 亚洲成人网站在线观看| 麻豆啪啪啪视频| 欧美日韩国产中文精品字幕自在自线| 91东京热男人的天堂| 国产精品人妻无码久久久互動交流| 亚洲风情综合网| 97jingpin| 超碰视97中文| 中出91视频| 亚洲 中文 欧美 日韩 在线| 97色欧洲| 欧美97爱| 久操操AV电影| 久久九九国产精品| 日韩一级片在线看| 91久久99久久91熟女精品| 精品亚洲国产成人AV制服丝袜 | 九月色婷婷| 丁香五月激情综合| 日本熟妇熟色97一本在线观看| 日本大片日本一区二区免费高清| 天天综合官网| 麻豆 美女 丝袜 人妻 中文| 精品天堂| 亚州熟女乱伦| 国产Aα| av日韩手机在线影视| 国产成人自拍视频在线| 男人夜色天堂ss| 91扒丝袜综合在线| 歐美性天天| 一区二区不卡免费| 精品午夜福利| 精品人妻中文字幕4399| 2020国产精品| 国产精品 亚洲情色| 东京热av男人的天堂| 欧美体内射精| 97啪啪| 一级黄色视频网| 日本3级一区二区免费| 欧美少妇大量自拍视频在线观看| 清清草影| 天天日夜干| 久久久麻豆精品| 超碰久热| 香港日本韩国人妇99www.wccm20| 欧洲一区二区| 伊人网青青| 91超碰人人操| 亚洲精品国产精品乱码不卡| 国产精品在线免费| 国产成人一级av88| 天美国产三级传媒| 国产中午字一暮区| 日韩免费高清大片在线| aaa一级黄片| 97干色天堂| 伊人国产AV| 不卡av在线中文字幕| 天天爽爽爽爽| 国产精品一二三| 看免费的黄片| 天天看片天天爽| 中文字幕1区2区| 日本一级婬片试看三分钟| 日韩有码一区三区| 亚洲图片 欧美电影| 亚洲图片激情综合另类| 97免费在线视频在线观看| 18禁久久| 黄页网站免费高清在线观看| 中文字幕天天天天天| 日本不卡一二区| 国产欧美日韩精品中文| 加勒比av中文| 欧美传媒| 在线 亚洲 网爆 自拍| 欧美女同在线| 91色伦综合| 日韩无码极品| 日韩精品 资源| 亚洲区小说| 美中日韩无码| 日韩精品电影| 亚洲无码免费看| 欧美视频第二页| 日韩精品资源专区二区| 欧美熟爽综合| 亚洲欧美人妻| 久久国产精品一级二级三级| 天天射日日干| 亚洲丝袜色| 久久99九九九九6666免费观看软件| 国产呦精品一区二区三区下载 | 张柏芝国产一区在线观看| 六月丁香五月婷婷| 久操免费观看| 亚洲春色激情小说| av网站免费看| 骚乳在线| 久操操AV电影| 97天天弄| 另类一区| 本道综合精品| 亚洲 91 在线| 岛国1区2区3区在线观看| 人人综合| av在线一区二区三区| 色悠久久久av| 久久色情| 啪啪视频免费在线观看| 久久久久久中文版| 秋霞曰韩R级| 国产精品播放| 老熟妇综合| 久久精品国产72国产精品福利| 色九九久九九| 亚洲精品色| 久久青青草原免费视频| www久久精品| 欧美性猛交美女自慰91| 亚洲精品国产无码高清| 亚洲1区2区三区高清中文字幕| 爽极品影院| av凤凰久久久| 亚洲另类综合欧美| A级毛片在线看免费| 嗯嗯啊啊的视频| 无码又爽又硬又激情免费视频| 青草综合| 91日日夜夜| 大香蕉碰| www.91理论| 我想要 啊 啊 啊| 久热久操| AA丁香综合激情| 亚洲精品国产日韩无码AV永久免 | 国产精品网址| 亚洲综合99999| 激情五月婷婷| av天堂天堂av日韩| 五十路三区在线| 91劲爆| 九一屌逼| 激情综合网激情五月天| 久久久久亚洲AV无码专区少妇| 91美女精品| 亚洲区限制级| 男人的天堂激情| 亚洲九区| 熟女精品va中文字幕| 亚洲天堂精品日韩电影| 舔人妻中文免费视频| 精品国产99| 日本91白丝| 综合一区中亚洲国产成人综合精品 | 亚洲97成人在线观看| 亚洲猛交| 91色s| 伊人991| 丰满少妇一区二区三区四区观看| 久久久激情| 1024人妻熟女一区二区三区| 人人妻人人爽 97人人看碰人免费公开视频| 南澳成人一级片在线播放| 天美传媒在线一区| 欧美一区二区日韩传媒搭讪精品| 99精品久久| 囯产乱伦一区二区三女| 国产理论视频在线播放| 亚洲国产成人精品999| 久草资源在线| 嗯……啊…嗯嗯…啊…好舒服| 六月婷婷综合| 色婷婷av在线观看| 亚洲最大无码中文字幕网站| 亚洲高清无码在线桃色| 天天操人人操狠狠插| 色色毛片| 亚洲天堂男人网| 97精品在线视频| 色女网日韩| 欧美精品99久久久| 51一区二区三区| 国产偷拍网站| 亚洲欧美国产中文视频| 亚洲色性| 欧成人精品一区二区三区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 乱欲视频| 就去色综合| 久久网亚洲| 成人欧美一区二区三区黑人一| 97欧美性爱| 国内外内射高清视频| 日韩97P| 清纯唯美第一页| 综合网亚洲1| 久9爱精品| 97精品视频在线| 青青五月天| 99超碰碰| 乱伦熟女论坛| 久久久久久久久久久免费精品| 天天谢天天干| 2019久久久久久久久福利| 51一区二区三区| 囯产操逼片| AA丁香综合激情| 91精品91久久久中77777| 91亚洲黑人| 亚洲另类久操网| 人妻在线大香蕉| 中文字幕超碰CAO| 欧美性五月| 亚洲人妻色图| 亚洲电影中字一区二区| 久久五月天婷婷丁香中文字幕| 国产精品爽爽va在线观看98| 一级久久久久久久久久久| 97天堂| 99色在线视频| av午夜玫瑰| 日本久久久精品电影| 久9九综合在线| 国产亚洲欧美每日在线| 亚洲九月丁香| 四虎AV无码| 青青欧洲黑| 亚洲综合网91| 影音先锋新男人| 丁香五月偷拍| 久久深夜无码| 97chaopengongkai| 日韩免费三级黄片电影| 色婷婷视频| 91久久久久久| 中文字幕诱惑制服人妻丝袜美丝袜美| 九九久久久| 久久久久久久九九九九九九| 久色网| 亚洲一区二区三区麻豆传媒| 亚州精品人妻一二三区| 国产精品人妻无码久久久互動交流 | 美女91在线观看| 日韩欧美~中文字| 国产黄色在线播放观看| 丰满人妻大屁一区二区| 九热大香蕉| 日日骚一区二区三区| 午夜激情成人在线观看| 色色五月天婷婷| 日本黄色天堂| 欧美日本成人一区二区| 日韩人妻无码专区| 亚洲精品1区| av黄图片在线观看| 欧美色图天堂在线| 青青草玖玖爱| 国产日韩区| 久久久久久久一级黄色打同平台| 欧美亚洲清纯| 国产一级内射无挡观看| 日本不卡高清免v欧美日韩在线观看| 午夜无码熟妇丰满人妻| 久热在线精品免费观看| 国产欧美日韩在线观看麻豆传媒公司| 天天久久久久久| 亚洲欧美日韩偷拍色图| 五月丁香六月婷| 视频二区美腿制服人妻欧美| 青青久久手机线视频| 欧美伦乱爱| 中文字幕国产在线天堂| 天天摸天天插天天日| 国产在线激情| 久久亚洲婷婷| 91老妇女| 午夜丁香| 欧美激情1区| www久久久| 欧美宗合色| 啪啪综合网| 97超碰超| 中文字幕精品一区二区精品| 九九九九九九九九九国产精品| 色综合天天| 操老熟女AV| 精品国产肉丝袜在线拍国语| 四虎免费视频| 国产97色在线| 欧美日韩制服| 超91综合网| 夫妻天天操岛国视频| 毛片17S| 少妇一级婬片免费放一级a性色.| 欧美 青青草| 欧美性爱第一区| 欧美中字二区| 日韩国产成人自拍视频| 美女91在线观看| 亚欧毛片基地国产毛片基地| 久99热| 91欧美综合| 欧美在线官网| 一级性爱啪啪视频| 97欧美色综合| 免费观看欧美日韩操逼视频| 亚洲一区二区三区婷婷| 久久久久久九九九九-美女久久久久久久-成人AV | 欧美亚洲情色| 97玖玖超碰| 欧美亚洲情色| 超碰综合色| 天天天天天干夜夜夜夜夜操| 欧美情色亚洲| 女人一区| 人妻中文字幕日韩电影| 啊啊啊免费| 日韩99神马视频播放片在线播放| 午夜啪| 日韩精彩视频| 五月大香蕉| 操www| 熟妇高潮二区三区| 色噜噜国产在线| 在线中文字幕极品av| 中出91视频| 青青草啪啪网| 五月天黄色激情视频| 麻豆天美91| 久久久久9999妇女| 自拍偷拍2025在线观看| 欧美高清无码免费视频高清版| 大香蕉啪啪啪啪在线| 色婷婷激情| 人人操,人人插| 淫淫综合网| 综合激情一一91| 国产亚洲人妻综合日韩 久久| 在线A日本| rion磁力链接| 台湾佬中文娱乐网久久久久久久久久com | 9l视频自拍9l九色成人| 东京热视频网| 老熟女91| 国产一区二区精品在线视频| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 日本黄页视频在线观看| av优播| 欧美性爱五月天| 天天射天天| 亚洲综合九九| 噜噜噜噜天天狠狠| 北京美女一区二区| 国产精品91一样| 青娱乐久久艹| 亚洲国产精品有声| 亚洲欧美首页| 成人开心网在线视频| 亚洲综合性网址| 91人妻超碰| 91粉芽高清在线一区二区| 久久久久亚洲av综合波多野制衣| 亚洲无码一区成人免费午夜| 天美传媒精品一区二区三区| 三级网站超变态精品| 亭亭丁香激情| 婷婷伊人网| 国产亚洲精品av一区| 国产综合在线视频网站| 97色在线视频| 99人妻| 久久 精品| 农村少妇久久久久久久| 国产人妻久久精品一区二区三区| 婷婷五月天无码 | 曰韩操B| 国产隔壁老王影院在线| 2019精品国产无码成人| 久久一区二区三区四区五区| 97精品免费视频网站| 超碰91在线| 六月丁香啪啪| 人妻 欧美亚洲| 久久久性爱视频| 久操B网| 色五91| 麻豆人妻精品一区二区| 国产精品秘 福利姬在线观看| 日本性爰一道本| 中文字幕久热视频在线| 国产成人手机视频激情| 免费无码国产精品v片在线观看| 国产高清吃奶免费视频网站| 欧美第五页| BBBBB97COM| 男人天堂2017| 91bbb| 日韩精品在线放| 久久久精品电影| 国产精品久久久久无码Av网曝门| 无码免费在线观看黄色片| 无码人妻一区二区三区色欲aⅴ| 老子午夜伦不卡影院| 亚洲国产一区二区入口| 国产高清成人mv在线观看| 全球成人中文在线| 翔田千里av一区二区三区| 大香蕉123| 色情亚洲日本成人| 精品免费国产二区三区| 超碰 av 女人天堂| 亚洲日本韩国极品一区二区| 91视频伊人| 加勒比日本在线| 欧美精品三区| 智利AV在线网| 天天日天天干少妇日| 看免费的黄片| 国产精品蜜乳AV| 色综合色色| 夜夜狼人妻| 97色涩| 亚洲欧洲网站免费观看| 蜜桃久久综合视频| 97久久久精品| 97超碰国产亚洲精品| 九七超碰| 日本人妻中文字幕精品| 色五月激情网| 91av天美性媒精品视频| 久久天堂网| AⅤ片水多多| 日本人人操人人操| 欧美人妻精品| 一区二区三区在线日韩影院观看| 色综91| 能在线播放的国产三级| 99热色这里只有精品| 一区二区 电影 亚洲| 美欧色综合| 成人免费福利在线观看| 玖玖综合.com| 97精品视频在线| 亚洲,日韩,欧美,成人播放| 深夜激情无码| av72网| 日韩欧美性吧婷婷乱伦大香蕉| 久久精品国产99精品亚洲蜜...| 男人的天堂不卡一区二区 | 久久精品超碰| 18禁精品网站在线看| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 亚州一区二区| 欧美顶级黄色大片免费| 免费9 1久久| 超碰色综合| 久久美女福利是上海美女| 成人十八禁日韩欧美一二三| 亚洲高清视频在线免费观看| 无码日韩网站| 美女网站黄页| 日va操| 91最新综合| 国产成人在线观看网址| 99色色| 亚洲久草AV色图| 久久久久久国产无码精品| 日韩啪啪啪视频| 欧美第二页| 欧美综合自拍成人自拍第二十页| 欧美高潮在线| 欧美五十路熟| 久久无码一区二区二三区性色| 99这里有精品视频| 91免费看中出视频| 久草视频在线视频在线视频在线观看| 久久偷拍人| 操操逼视频| 色综合中文字幕不卡| 欧美色网| 搡老女人老妇女老妇老熟女怎么读| 91模特在线观看| 亚洲无码一区二区三区三州| 久久久久人| 强奸国产在线| 人妻无码一区二区三区久久99| 中文字幕天堂在线| 精品妇女一区二区三区| 国产9区| 美国aaaaa一级黄片| 综合性视频99| 日韩av影片在线观看| 久久精品一区| 91在线视频免费播放| 日韩精品系列| 久久性爱精品一区| 九九九九九九九九九九九九九九九女| 一线黄色免费性爱片| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 91女日逼| 久操九九九九| 五月丁香激情四射| 亚洲 欧美 小说| 黄色区免费观看中文字幕| 成人天天爽| 精品久久99| 在线午夜成人无码视频| 久久99久久99精品免视看婷婷| 粉嫩av一区二区三区天美传媒 | 国产精品久久久三级无码| 999熟女精品| 五月香婷婷| WWW操逼| 91网站视频在线观看| 色噜噜人妻丝袜a∨先锋影 | 97干com| 国产欧美精选激情视频| 夜夜精品视频一区二区| 人人摸人人干| 亚洲黄片免费在线播放| 日日妻色网| 91美女丝袜诱惑视频| 久久超碰97| 色综合超碰超| 熟女人妻av在线资源,黄色的资源| 欧美组图日韩亚洲中文字幕| 久久人爽| 日本免费中文一区二区三区四区| 大香蕉日亚洲日本亚大| 97人人爱人人做人人乐| 大香蕉在线视频15| 亚洲色图久久成人| 按摩中文字幕| 亚洲欧洲第二视频在线观看色图| 国产AV毛片| 久久久久久久人妻丝袜| 97色色国产视频| 国产三级日产三级韩国三级| 欧美很很操视频| 国模吧 一区二区三区| 成人羞羞视频国产| 内射黑人| 国产精品青草综合久久| AV天堂国产| com 首页 18岁 禁区 女优 免费 精选 同城| 99色综合| 免费A V在线播放| 人人性爱视频免费| 97人人色| 中国小夫妻勾搭露脸淫荡对白| 色色热| 91午夜无码| 乱伦熟女论坛| 亚洲黄色| 欧美97视频| 天天影视网综合少妇| 99久久久无码国产精品性男| 69av一区二区三区| 97久久久久| 91激情国产| 人妻免费观看| 黄页大片在线观看| 九九热超碰| 久操不卡视频| 免费精品人妻一区二区三| 欧美加勒比| 91黄站| 97久久综合网| 超碰地址97| 丁香婷婷激情五月天无毒不卡| 丝袜熟女2P| 久久天天摸| 91操碰| 午夜丁香婷婷| 亚洲精品三| 操高情无码| 久久久久久国产手机AV| 国产精品国产自产高清AV| 八戒午夜福利理论片| 亚洲日韩电影| 欧洲精品一级二级精品综合视频综合 | 亚洲麻豆av一区二区| 999综合网| 亚洲欧美色图| 日本成人在线不卡一区二区三区| 久久婷婷一区| 亚洲女优有码无码高清| 97操97干| 夜夜嗨TV| 校园春色AV天堂| 亚洲天堂加勒比| 欧美少妇人妻| 麻豆精品.欧美精品.日韩精品.| 精品少妇99| 亚洲欧洲激情卡通另类文学四射小说网站 | 蜜臀一二三| 呦女网站|