99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

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

前端性能優(yōu)化:防抖與節(jié)流的核心差異、工程實(shí)現(xiàn)與場景選型 做前端這些年被問得最多的一類問題不是框架怎么選而是“這個(gè)滾動(dòng)監(jiān)聽卡得要死怎么辦”“輸入框每敲一個(gè)字就發(fā)一次請(qǐng)求后端同事快盯上我了”。這類問題的答案基本都落在防抖Debounce和節(jié)流Throttle這兩個(gè)詞上而它們又恰恰是前端性能優(yōu)化里投入產(chǎn)出比最高的兩個(gè)小工具。這兩個(gè)概念人人都聽過面試也能背出定義但真正在業(yè)務(wù)里寫對(duì)、用對(duì)、調(diào)對(duì)的人并不多——我見過太多把防抖寫成節(jié)流、把節(jié)流寫成“限流”、甚至在組件卸載之后還留著定時(shí)器默默執(zhí)行的代碼。這篇就把這兩個(gè)高頻回調(diào)控制手段徹底拆開講它們各自解決什么問題實(shí)現(xiàn)上有哪些坑等待參數(shù)該怎么算在搜索聯(lián)想、滾動(dòng)加載、按鈕防連點(diǎn)、埋點(diǎn)上報(bào)這些真實(shí)場景里怎么落地以及怎么和請(qǐng)求競態(tài)、組件生命周期配合起來。無論你是剛?cè)腴T還是已經(jīng)寫了兩三年業(yè)務(wù)代碼看完至少能做到一件事拿到一個(gè)高頻觸發(fā)的場景幾秒鐘判斷出該用哪個(gè)并且能徒手寫出來不用翻文檔。1. 先把這兩個(gè)概念釘死在場景里1.1 高頻回調(diào)為什么會(huì)把頁面拖垮瀏覽器的主線程只有一個(gè)JS 執(zhí)行、樣式計(jì)算、布局、繪制全都排在它后面。一個(gè)mousemove在高刷新率設(shè)備上一秒能觸發(fā)一百多次一次scroll在慣性滾動(dòng)里也能輕松跑到六十次以上input事件更是每敲一個(gè)字符就來一次?;卣{(diào)本身不貴貴的是回調(diào)里通常干的事讀scrollTop、讀offsetHeight、改 DOM、發(fā)請(qǐng)求。這里有個(gè)很多人不知道的細(xì)節(jié)在同一個(gè)任務(wù)里先寫 DOM 樣式、緊接著讀布局屬性瀏覽器為了給你正確的值會(huì)被迫立刻做一次同步布局計(jì)算。你寫十次讀十次就是十次強(qiáng)制重排。滾動(dòng)監(jiān)聽里那種“讀位置—改樣式—再讀位置”的寫法掉幀就是這么來的?;卣{(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é)果可能最后才回來把正確結(jié)果覆蓋掉用戶看到的聯(lián)想詞永遠(yuǎn)慢半拍。埋點(diǎn)上報(bào)更典型滾動(dòng)一次上報(bào)一次一篇文章從頭滑到尾能給你刷出幾百條日志服務(wù)端和客戶端兩邊都難受。所以這類優(yōu)化的核心思路從來不是“讓回調(diào)跑得更快”而是降低回調(diào)的執(zhí)行次數(shù)同時(shí)不破壞用戶感知的連續(xù)性。這就是防抖和節(jié)流要解決的問題兩者都在做“降頻”但降頻的規(guī)則完全不同。1.2 防抖與節(jié)流的本質(zhì)差異等安靜 vs 按節(jié)拍我習(xí)慣用一個(gè)生活場景來講這個(gè)區(qū)別。防抖像電梯門只要還有人往里走門就一直重新計(jì)時(shí)直到徹底沒人了才關(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í)長成正比持續(xù)越久執(zhí)行越多典型場景搜索聯(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é)果”還是“過程中的連續(xù)反饋”搜索框里用戶敲完才是最終結(jié)果用防抖滾動(dòng)視差每挪一段就要更新一次位置用節(jié)流。搞混這兩個(gè)代碼不一定報(bào)錯(cuò)但體驗(yàn)會(huì)很別扭——比如把滾動(dòng)加載寫成防抖用戶必須停下來不動(dòng)才會(huì)觸發(fā)加載滑到底部一直滑就一直不加載這個(gè) bug 我見過不止一次。2. 防抖從“最后一次才執(zhí)行”到可配置的工程實(shí)現(xiàn)2.1 最小可用版本與它的三個(gè)致命缺陷網(wǎng)上流傳最廣的防抖實(shí)現(xiàn)大概長這樣function debounce(fn, wait) { let timer null; return function (...args) { clearTimeout(timer); timer setTimeout(() fn.apply(this, args), wait); }; }十行不到日常用也確實(shí)能跑。但它有三個(gè)問題在真實(shí)項(xiàng)目里遲早會(huì)咬你一口。第一個(gè)是this指向。注意上面內(nèi)層用的是箭頭函數(shù)箭頭函數(shù)沒有自己的this它捕獲的是debounce執(zhí)行時(shí)的外層this。如果你把返回的函數(shù)掛到某個(gè)對(duì)象上或者用在類方法里this就丟了。穩(wěn)妥的寫法是內(nèi)層用普通函數(shù)同時(shí)在入口處把this存下來const ctx this;然后fn.apply(ctx, args)。第二個(gè)是返回值。有些場景需要拿到被包裝函數(shù)的返回值比如表單校驗(yàn)函數(shù)返回布爾值防抖之后返回值直接變成undefined調(diào)用方拿到就懵了。這個(gè)得靠debounced.flush()或者閉包里緩存result來解決。第三個(gè)最要命沒法取消。組件卸載了、路由切走了、彈窗關(guān)閉了那個(gè)setTimeout還在隊(duì)列里時(shí)間一到照樣執(zhí)行執(zhí)行時(shí)訪問的 DOM 早就沒了輕則報(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í)行、取消與返回值把核心邏輯拆開下面這版是我在項(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開始一直到回調(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)來就會(huì)用空參數(shù)調(diào)用一次原函數(shù)典型的“在控制臺(tái)看到一條參數(shù)為 undefined 的多余日志”。加了這個(gè)判斷flush在已經(jīng)執(zhí)行過的情況下就只返回緩存結(jié)果不會(huì)重復(fù)觸發(fā)。leading: true的場景很具體按鈕防連點(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)的延遲用戶基本無感超過 200 毫秒開始有“卡了一下”的感覺超過 1 秒就是明確的等待。所以防抖參數(shù)要在這個(gè)區(qū)間里找平衡。搜索聯(lián)想這類場景我一般給250 到 350 毫秒。低于 200 毫秒打字快的人還是會(huì)連發(fā)兩三個(gè)請(qǐng)求起不到合并效果高于 400 毫秒用戶敲完字會(huì)明顯感覺聯(lián)想詞“慢半拍”尤其是千兆寬帶下請(qǐng)求本身只要 30 毫秒返回延遲全壓在防抖上了。300 是個(gè)能兼顧兩邊的中間值。表單實(shí)時(shí)校驗(yàn)、自動(dòng)保存草稿這類可以放寬到500 到 800 毫秒。這些操作用戶本來就不期待即時(shí)反饋而且頻繁請(qǐng)求后端做唯一性校驗(yàn)服務(wù)壓力更敏感。窗口resize結(jié)束時(shí)重排圖表給150 到 200 毫秒就夠因?yàn)榉磸?fù)拖拽瀏覽器窗口邊框時(shí)觸發(fā)間隔本來就比較松散。這里還有個(gè)更容易被忽略的點(diǎn)輸入法組合輸入。用中文拼音打字input事件會(huì)在輸入拼音字母階段就觸發(fā)比如敲“xingneng”會(huì)連續(xù)觸發(fā)七八次但此時(shí)輸入框里的值是拼音串而不是漢字。如果只做防抖不做保護(hù)用戶拼音還沒選完就可能發(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本身就是防抖過的函數(shù)compositionend那一腳相當(dāng)于提前結(jié)算把拼音階段攢下的等待直接兌現(xiàn)用戶選完字的瞬間就能看到聯(lián)想結(jié)果體驗(yàn)比純防抖更順。3. 節(jié)流時(shí)間戳與定時(shí)器兩條路的取舍3.1 兩種基礎(chǔ)寫法差在哪節(jié)流的基礎(chǔ)實(shí)現(xiàn)有兩條路差異全在“首次”和“末次”上很多人背了代碼卻沒搞清楚這個(gè)差異用錯(cuò)了才發(fā)現(xià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è)沒問題頁面停下來時(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); }; }它反過來首次要等wait毫秒才執(zhí)行首延遲但最后一次一定會(huì)執(zhí)行末次必觸發(fā)。寬表格橫向滾動(dòng)同步表頭、拖拽結(jié)束后保存位置這類場景末次觸發(fā)很關(guān)鍵否則最后一下拖拽就丟了。3.2 組合版首尾都要觸發(fā)實(shí)際業(yè)務(wù)里最常需要的是“首次立即給反饋 末次補(bǔ)齊”把兩條路縫起來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í)間窗口已過立刻執(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é)值得說。remaining 0那個(gè)分支除了執(zhí)行函數(shù)還必須清掉已有的timer——因?yàn)榇翱谝呀?jīng)過了手動(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)了再打開重置時(shí)間基準(zhǔn)能讓第一次觸發(fā)立刻執(zhí)行而不是被上次遺留的時(shí)間戳卡住半個(gè)窗口。3.3 交給渲染節(jié)奏的 rAF 型節(jié)流如果節(jié)流的回調(diào)里要改樣式、做動(dòng)畫、算位置那又有一層更貼合瀏覽器的選擇用requestAnimationFrame代替定時(shí)器。原因很簡單瀏覽器一幀是 16.7 毫秒60Hz 屏幕你用setTimeout(fn, 10)去做滾動(dòng)動(dòng)畫觸發(fā)點(diǎn)可能落在兩幀之間瀏覽器得把這次的樣式變更攢到下一幀才渲染反而多一次無效計(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)聽里讀位置算聯(lián)動(dòng)、吸頂頭部切換、視差位移我基本都用這版。有個(gè)坑要避開頁面切到后臺(tái)標(biāo)簽頁時(shí) rAF 會(huì)被暫停ticking會(huì)一直卡在true回來之后所有觸發(fā)都被吞掉。所以如果這東西用在長生命周期的全局監(jiān)聽上最好在visibilitychange里重置一下狀態(tài)或者在頁面重新可見時(shí)手動(dòng)跑一次。4. 落地到真實(shí)業(yè)務(wù)三個(gè)高頻場景的完整方案4.1 搜索聯(lián)想防抖只是第一步競態(tài)才是真問題搜索框是防抖最常見的落地場景但只加防抖是半成品。真實(shí)情況是用戶先輸入“性能”請(qǐng)求 A 發(fā)出300 毫秒后又輸入“性能優(yōu)化”請(qǐng)求 B 發(fā)出。A 在路上堵了一下B 先回來了頁面渲染 B 的結(jié)果兩秒后 A 回來了把頁面覆蓋成“性能”的聯(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(); // 回來的時(shí)候如果序號(hào)已經(jīng)變了說明這是個(gè)過期請(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)前值回來時(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ú)過濾掉別讓它進(jìn)全局錯(cuò)誤上報(bào)。還有個(gè)體驗(yàn)細(xì)節(jié)請(qǐng)求發(fā)出到回來這段時(shí)間最好給輸入框一個(gè)pending狀態(tài)比如輸入框右側(cè)轉(zhuǎn)個(gè)圈。否則用戶敲完字之后 300 毫秒防抖 200 毫秒接口耗時(shí)加起來半秒多沒反應(yīng)會(huì)以為頁面卡了。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)聽器不會(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 像素就開始加載這個(gè)余量是為了讓下一頁在用戶真正滑到底之前就準(zhǔn)備好。如果你只有一個(gè)可滾動(dòng)容器比如固定高度overflow: auto的列表window.scrollY就用錯(cuò)了得換成容器的scrollTopinnerHeight換成clientHeightscrollHeight換成容器的scrollHeight。這種混用是滾動(dòng)加載不觸發(fā)的頭號(hào)原因我在好幾個(gè)項(xiàng)目里都遇到過。埋點(diǎn)上報(bào)的場景對(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)滿足條件或者長時(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它在頁面卸載時(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à)的防線別指望它解決全部問題??蚣芾镒铌P(guān)鍵的一步是清理。防抖和節(jié)流返回的函數(shù)都持有閉包和定時(shí)器組件卸載時(shí)必須調(diào)cancel否則定時(shí)器到期執(zhí)行時(shí)訪問的響應(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)來的新函數(shù)都會(huì)讓防抖實(shí)例重建定時(shí)器全部作廢防抖直接失效——這是 React 里防抖“看起來沒生效”的最常見原因。用 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)聽的問題。如果監(jiān)聽器掛在window上組件卸載時(shí)不僅要removeEventListener還要先cancel掉包裝函數(shù)。因?yàn)閍ddEventListener存的是包裝后的引用你remove的時(shí)候必須傳同一個(gè)引用很多人重新寫了一遍throttle(fn)去移除函數(shù)引用不同根本刪不掉監(jiān)聽器就這么一直掛著內(nèi)存和 CPU 一起漏。5. 選型、排查與踩坑速查5.1 一張決策表把選型問題關(guān)掉每次有人問我“這個(gè)該用防抖還是節(jié)流”我基本按下面這張表回答實(shí)測覆蓋了九成場景場景選擇建議參數(shù)關(guān)鍵配置搜索框聯(lián)想防抖250-350mstrailing: true配合請(qǐng)求序號(hào)表單實(shí)時(shí)校驗(yàn)防抖400-600ms監(jiān)聽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ì)算本身開銷可忽略最后一行值得單獨(dú)說。不是所有高頻事件都需要包裝像字符數(shù)統(tǒng)計(jì)、簡單的class切換開銷就是幾微秒硬套一層防抖反而增加復(fù)雜度還可能引入時(shí)序 bug。優(yōu)化的第一步永遠(yuǎn)是先測量performance面板跑一遍看看到底是哪個(gè)函數(shù)吃掉了時(shí)間別憑感覺上工具。5.2 常見問題排查表下面這些是我和同事在真實(shí)項(xiàng)目里踩過的、并且反復(fù)出現(xiàn)在代碼評(píng)審里的問題按現(xiàn)象整理成速查表現(xiàn)象大概率原因處理方式防抖“完全沒生效”每次觸發(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)求沒處理組合輸入compositionstart/end攔截聯(lián)想詞和輸入框內(nèi)容對(duì)不上請(qǐng)求競態(tài)序號(hào)校驗(yàn)或AbortController滾動(dòng)加載在某個(gè)位置永遠(yuǎn)不觸發(fā)只判斷了一次或取值對(duì)象用錯(cuò)換容器滾動(dòng)取值加distanceToBottom打印摘除監(jiān)聽后仍在執(zhí)行移除的引用和添加的不一致保存包裝函數(shù)引用先cancel再remove頁面切后臺(tái)回來動(dòng)畫不同步rAF 暫停導(dǎo)致ticking卡死visibilitychange里重置5.3 我踩過的三個(gè)坑第一個(gè)坑是防抖和節(jié)流混著用。早年做一個(gè)橫滑表頭的表格我給scroll套了防抖本意是等用戶停下滑動(dòng)再同步表頭位置。結(jié)果用戶習(xí)慣一路滑到底全程表頭紋絲不動(dòng)停下來的瞬間“啪”地跳過去觀感極差。后來換成 rAF 節(jié)流滾動(dòng)過程中表頭平滑跟隨問題當(dāng)場就沒了。這件事讓我記住凡是需要過程連續(xù)反饋的一律節(jié)流只有需要等最終結(jié)果的才用防抖。第二個(gè)坑是參數(shù)給得太激進(jìn)。有個(gè)項(xiàng)目的搜索聯(lián)想防抖給了 500 毫秒測試環(huán)境一切正常上了生產(chǎn)用戶反饋“輸入框像死了一樣”。排查半天發(fā)現(xiàn)接口在弱網(wǎng)下平均要 400 毫秒才返回500 400 將近一秒用戶早就不耐煩了。后來把防抖降到 250 毫秒同時(shí)在輸入框里加了個(gè) loading 指示觀感立刻好轉(zhuǎn)。防抖的延遲和接口耗時(shí)是疊加的不是取最大值算參數(shù)時(shí)必須把這段一起算進(jìn)去。第三個(gè)坑是過度包裝。有個(gè)列表頁給每一行的一個(gè)小圖標(biāo)都套了獨(dú)立的節(jié)流函數(shù)五百行就是五百個(gè)閉包加五百個(gè)定時(shí)器句柄頁面一進(jìn)去內(nèi)存就蹭蹭漲。這種情況正確的做法是把包裝函數(shù)提到列表外面所有行共享一個(gè)節(jié)流實(shí)例靠event.target或者行索引區(qū)分?jǐn)?shù)據(jù)來源。包裝函數(shù)是有成本的別在循環(huán)或者列表項(xiàng)里現(xiàn)造。后續(xù)如果還想往深里走可以看看這兩個(gè)方向一是把防抖節(jié)流和IntersectionObserver、ResizeObserver結(jié)合起來能用觀察者解決的問題就不用監(jiān)聽事件瀏覽器原生幫你算比 JS 里反復(fù)讀布局便宜得多二是去翻一翻成熟工具庫的源碼實(shí)現(xiàn)對(duì)比一下它們在leading/trailing邊界、maxWait這類擴(kuò)展參數(shù)上的處理方式會(huì)發(fā)現(xiàn)自己手寫版本里漏掉的很多邊角情況。我個(gè)人在實(shí)際操作中的體會(huì)是這兩個(gè)函數(shù)加起來不到五十行但真正吃透它帶來的收益遠(yuǎn)超五十行代碼本身——它訓(xùn)練的是對(duì)“事件頻率、執(zhí)行時(shí)機(jī)、生命周期”這三件事的敏感度這種敏感度放到任何性能優(yōu)化場景里都用得上。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本丁香五月| 婷婷六月激情在线视频| 99色综合久久| 99热99色| 久久精品亚洲一级牲爱综合| 4399在线观看免费高清电视剧| 亚洲成人AV高清字幕| www.99热这里只有精品| 天天色五月| 九月婷婷人人操人人舔人人爱| 五月婷婷中文| 秋霞电影理论| www,8050,午夜三级| 激情玖玖sh| 欧美婷婷色五月| 色婷婷六月| 夜夜天天久久婷婷| 高清视频一区| 丁香青青五月天| 99色中文| 免费AV在线| 精品网站99| tingtingcaobi| 亚洲性爱电影| 婷婷基地成人五月天| 99免费| 九九九干精品| 婷婷激情小说| 永久地址 色| 日韩精品一区二区亚洲AV观看| 五月天激情综合| 狠狠草综合网| 五月丁香六月婷婷综合网| 大香蕉人人人| 色播播五月天| 久久激情五月网| 色婷婷AAA| 色婷婷很很十八禁| 激情内射人妻1区2区3区| 亚洲 视频 导航 一区| 亚洲丁香五月天在线视频| 久久9久久| 在线视频区| 六月色色| 极品人妻VIDEOSSS人妻| 桃色五月天| 99噜噜| 五月婷婷啪啪啪啪| 激情五月色播五月| 久久久久久久人妻| 五月激情网五月综合网| 97人人射| 九九热AV| 激情五月天婷婷久久久久久久久久久 | 可以直接看的av| 五月丁香综合伦理片| 97碰碰在线看视频免费| 精品人人操| 久久久99精品免费观看| 超碰人人摸人人操| 久久区区一二三av| 亚洲成人另类| 97天堂| 啊v视频在线观看| av在线免费网站| 超级碰 久久9| 97五月综合网| 久久九九综合| 色插综合网| 夜精品无码A片一区二区蜜桃| 久久大香蕉同僚| 丁香五月亚综合图片| 五月天婷婷成人资源站| 五月天婷婷在线播放免费| 婷婷激情丁五月| 婷婷色播六月无码| 丁香婷婷色五月| 先锋av性爱成人电影| 五月综合激情图片| 综合激情站| AV操操操| 大香蕉AV在线| 亚洲AV另类| 婷五月天丁香婷五月| 激情五月天第四色| 超碰免费成人| 丁香五月在线观看综合| 色香欲综合| 色哟哟www| 丁香九月久久| 思思久久99热只有频精品66| 成人片在线免费看| 日韩三级片一区二区| AV 3P| 婷婷五月色亚洲| 午夜丁香婷婷| 人妻操逼视频。| RenRenSe在线视频网站| 色婷婷九月| 激情精品久久| 日韩成人中文| 伊久久婷婷| 色综久久久| 五月丁香婷婷色| 婷婷久久图片| 无遮羞AV| 92久久| 三级黄网站| 清色五月天| 这里只有免费精品| 成人电影一区| 超碰93在线观看| 午夜色色色极品视频| 婷婷免费无视频| 亚洲免费婷婷| 狠狠爱深色婷婷综合| www,99色| 好好干av| 丁香五月电影| 久久免费9| 六月激情婷婷综合| 色色激情五月天| 亚洲日本韩国| 狠狠色丁香久久久婷| 1995年关宝慧版蜘蛛女| 99色| 婷婷五月天综合网| 亭亭五月天黑人2014| 97婷婷在线| 美女va| 99视频网| 五月婷婷黄色网址| 亚洲色婷婷婷婷人人爽| 色五月婷婷丁香五月| 大香蕉伊然在亚洲90| 香蕉综合网| 久久色五月天激情小说| 久久婷婷艹| 色婷婷中文字母五月丁香| 国产色网站| 香蕉影院色| 99综合视频一体| 丁香欧美| 亚洲狠狠色丁香婷婷综合久久| 婷婷色五月激情| 五月丁香性| 少妇高潮呻吟A片免费看软件| 99热这里有精品首页10| 玖玖99免费视频| 久久婷婷免费| 丁香五月天视频在线播放| 丁香五月天社区| 色色五月婷婷久久| 粉嫩av懂色av蜜臀av熟妇| 色色综合院| 深爱激情五月天婷婷网| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 六月综合婷婷开心伊人 | 五月天激情社区| 人人妻人人澡| 色婷婷五月丁香在线观看| 成人片在线播放| Caoporn公开| 思思色综合网站| 五月婷婷六月丁香| 夜夜噜夜夜奇| 青青久久五月| 激情五月天电影| 999热这里只有美国精品| 五月丁香六月欧美综合| 刘玥av在线| 婷婷久久婷婷色五月| 97干在线| 六月香五月婷| 99在线小视频| 狠狠丁香| 色婷婷4| 中文字幕在线免费观看视频| 六月色色婷婷| 秋霞丝袜啪啪啪| 深爱开心激情| 99精品自拍| 91ncom.色| 大香蕉婷婷丁香天堂AV| 日日爽夜夜爽| 国产无套精品一区二区| 99久久综合网| 久久无码成人| 这里只有精彩视频| 99色这里| 丁香五月激情啪啪啪| 日韩三级高清无码| 五月婷婷综合热| 99精彩视频| 天天日夜夜草进麻麻的子宫| 久久婷婷色综合| 亚洲精品成人| 九九综合九九| 五月丁色AV| 成人无码髙潮喷水A片| 五月婷色丁香| 97碰碰碰| 婷婷成人五月天| 五月丁香色五月| 久久久宗合视频88| WWW久久久| 亚洲欧洲色色| 另类综合婷婷五月天欧美视频| 丁香五月婷婷在线| 99视频这里有精品免费观看| 狠狠色色综合| 六月成人网| 人妻久久久久久久| 人人操99| 丁香激情五月天| 日本熟妇精品99| 欧美亚洲999| 激情亚洲五月| 欧美婷婷综合| 婷婷五月婷婷| 婷婷五月精品在线| 99爱视频精品| 99男人的天堂| 亚洲视频另类| 超pen个人视频97| 色播播婷婷| 亚洲天堂99| Www.se.久久| 91丨九色丨熟女|新版| 色综合xx| 99热乎| 亭亭丁香97| 狠狠综合网| 婷婷射丁香| 五月丁香六月婷婷精品| 日本久久人| 思思视频精品| 五月色在线| 五月天久久小说| 99操碰| 99热免费精品| 色播婷婷大香蕉| 亚洲超碰中文字幕| 91丁香综合| 超碰av在线| 99视频只有精品| 五月激情综合五月| 丁香六月亚洲| 丁香香五月激情免费视频| 99超碰人人| 五月婷婷香蕉视频| 97在线观视频免费观看| 无码AV久久久久久久久| 大香网伊人久久综合| 五月婷婷六月色| 99re热视频| 99热这里只有99| 欧美五月婷婷| 激情久久五月天| 激情图片久久| 五月丁香激情综合啪啪| a九九热www| 成人VAV视频在线观看| 丁香五月综合狠狠| 激情婷婷狠狠干综合| 色噜噜狠狠色综合日日| 99热这里只有精品青草| 69精品人人人人| 国产美女视频久| 色色综合网络| 色 五月 天 婷婷 丁香 九月| 日本激情五月天‘| 另类激情五月天| 五月天欧美激情| 先锋男人99资源| 日韩三及成人AV片| 亚洲超碰青涩| 久久婷婷的综合色丁香五月| 97五月婷婷| 欧美色碰| 99热伊人| 日韩无码一区二区三区四区| 五月丁香啪啪激情| 婷婷五月天综合色| 大香蕉婷婷久久| 久久的爱大香蕉| 久久99精品久久久久久青青AR| 一起操 91N.com| 久re在线| 日本三级日本三级99| 武则天精品久久| 三级黄网站| 99惹在线精品免费观看| 亚洲性图一区二区| 超碰资源在线| 色色亚洲| 日韩伊人大香蕉| 国产免费一区二区三区三州老师F1F1.CC | 99精品一二三四视频| 婷婷狠狠操| 99无码视频| 国产这里只有精品| 九月丁香八月婷婷久久综合久97| 精品婷婷五| 日本ww亚洲| 99免费视频在线观看爱| 狠狠色婷婷777| 激情久久五月天| 午夜不卡久久精品无码免费| 99热精品网| www.婷婷五月天,com| 五月激情啪啪| 婷婷五月天激情开心网| 99热色精品| 91中文狠狠综合| 天综合日日夜综合7799| 只有精品在线观看| 日本色婷婷| 99热婷婷| www.一起草av| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 久久久性爱视频| www.婷婷网| 婷婷色狠狠| 五月丁香久久综合| 开心五月婷婷伊人| 五月丁香美女| 五月丁香久久久久| 综合九色| 久色五月| 少妇人妻丰满做爰XXX| 97自拍99| 精品皮股午夜AV| 综合AV在线| 欧美A A A A A| 91欧美| 天天色色天天| 黄色中文字目| 天干天天干天天天天天| 伊人激情综合网| 久热精品9999| 五月情四婷婷| 玖玖在线视频| 五月丁香激情四射综合| 久久天天| 91久久国产综合久久| 色婷婷丁香五月| www.AV在线| 婷婷成人综合免费视频| 婷婷丁香在线| 色婷婷免费观看| www.亭亭五月天| 五月天色综合| 夜夜夜天天操| 亚洲九九视频| 99热老网站| 五月天激情视频| 日韩欧美不卡| 99热这里只有精品13| 婷婷五月丁香综合| 久久资源网五月婷| 丁香五月久久| 成人精品在线| 99婷婷| 成人电影在线免费试看| 五月天操逼网| 超碰97人人操| 婷婷激情四射| 中文精品久久久久人妻不| 久久九九@| 久久综合网桃花| 99精品免费欧美小视频| 91女人18毛片水多国产| 少妇达人正片在线播放_ikun_福利吧| 欧美日韩国产成人在线| 狠狠干五月丁香综合网| 大香AV| 夜夜操狠狠操| 婷婷五月丁香久久| 色五月亚洲| 涩综合在线| 337p大胆噜噜噜噜噜91Av| 色香蕉影院| 99热国产| 五月色欧洲| 亚洲精品一区无码A片| 五月婷婷久久综合| 不卡成人免费| 五月天婷婷基地| 99综合熟女| 激情丁香九九五月综合网| 色婷久九| 婷婷色综合| 深爱五月激情网| 国产精品99久久久久久久女警| 国产1区2区3区在线观| 操一区| 日韩一区二区三区无码| www.久久久久久久久久.com| 亚洲乱码w在线观看| 欧美天堂久久| 成人无码精品1区2区3区免费看| 99久久99久久综合| 2025超碰| 影音先锋一区二区三区| 99精品视频在线| 3DAV亚洲香蕉久久 一区二区| 丁香五月婷婷香| 五月婷婷色影院| 色婷婷久久综合| 91九色精品女同系列| 五月婷婷黄色视频| 99热久久这里只有精品2010| 97色色婷婷五月天| 八戒青柠影视剧在线观看| 亚洲综合婷婷六月丁香五月| 久久人视频| 久久看婷婷| 六月色伊人婷婷| 激情小说色五月| 日日日日做夜夜夜夜无码| 色情婷婷| 思思热视频| 男女99免费视频| 少妇伦子伦精品无吗| 综合伊人狠狠| 日本精品在线噜噜噜| 欧美性生交XXXXX无码小说| 成人五月天视频播放| 97人人操在线| 日本天堂网站99| 激情综合无码| 成人开心五月天| 九九99久久| 亚洲五月婷婷在线| 日本三级中国三级99人妇网站| 俺去也在线官网| 久久婷婷网| 91男女视频在线观看| 婷婷六月色开 | 欧美日比视频| 免费在线观看av网站| 五月丁香久久综合| 婷婷亚洲综合| 色婷婷在线视频观看| 激情综合网五月在线播放| 色婷青青| 久久婷婷五月天| 国产中文亚洲欧美日韩性交| 五月婷婷性| 五月天婷婷色在线视频免费观看| 九草性爱| 五月婷婷精品| 伊人婷婷99热精品| www,奇米影视| 亚洲无AV在线中文字幕| 天天拍天天操| www.色婷婷| 五月天啪啪啪| 这里只有久久精99| 亚洲情a| 99热 免费| 99精品久久久| 久久99婷婷| 色婷婷色九月| 干一干xxxx| 亚洲区1| 亚洲性图一区二区三区| 丁香大香蕉| 97碰在线免费观看| 我想看国产大学生口爆吞精的视频| 五月开心久久| 综合激情视频| 天天爽天天操| 天天日天天操心| 91色久| 国产免费一区二区三区三州老师F1F1.CC| 六月狠狠综合| 99亚洲无码| 九九九九九九九热| 天天色激情| 天天天天天天噜| 久久3级片| 午夜亚洲AV日韩无码| 欧洲第一无人区观看| 九九性视频| 久机视频这只有精品| 人妻操日日| 日韩十国产极品久久| 五月天精品| 激情伊人五月天| 五月激情网综合| 久久久99精品| 99久久玖玖| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 思思热精品免费视频| 五月丁香婷婷婷婷综合网| 激情婷婷另类| 婷婷亚洲综合| 丁香五月六月综合激情| 欧美成人AAA片一区国产精品| 久热在线中文字幕色999舞| 日日干夜夜撸夜夜骑| WwW天天干| 天堂草在线观| 狠狠丁香| 亚洲最大成人综合网720P| 北条麻妃九九九国产精品视频| 97五月婷| 色婷婷19| 99精品在| 欧美激情综合色综合啪啪五月| 99操碰| 99精品无码| 久在热99| 大战熟女丰满人妻AV| 激情综合网激情五月婷婷| 久久久久久18| 操操操av| www.天天干| 26uuu成人网| 99色人| 天天日夜夜欢| 深爱五月亚洲| 婷婷色网站| 图片区 小说区 区 亚洲五月| 久久一操| 色五月丁香激情视频| 五月天婷婷激情在线色图| 综合大香蕉| 超碰在线免费观看日韩| 天天噜日日噜综合无码| 五月香六月婷| 日本九九九九| 碰97久久| 97丁香五月| 99在线免费观看| ady狠狠入| 新久久五月天激情| 亚洲免费观看高清完整版AV线| 成人综合网站| 91日视频| 另类视频丁香五月| 婷婷五月综合激情| 天天做综合网色综合| 婷婷射丁香| 成人VAV视频在线观看| 五月天激情小说婷婷| 色五月色五天免费视频| 成人.在线日韩| 久久99综合网| 欧美色五月天| 日韩av手机在线观看| AV在线免费播放| 第四色首页| 99热久久这里只有精品| 五月丁香婷成人网| 色色色9| 亚洲久艹| 六月婷婷久久大全| 日本WwW色偷偷丁香花久久久京东热| 激情综合五月| 久久精典| 久久狠婷婷| 色婷婷先锋| 久草热8精品视频在线观看| 婷婷成人视频| 97干网站| 五月丁香六月色| 丁香六月色婷婷| 婷婷伊人久久无码色五月| 激情五月天婷婷图| 丁香五月电影| 97成人丁香婷婷| 中文字幕不卡+婷婷五月| 久草婷婷视频| 五月天桃色深爱网| 99在线播放| 丁香五月六月婷婷殴美综合| 免费观看高清无码| 亚洲第一第二网站| 婷婷大香焦| 亚洲看av的网站| 少妇真实被内射视频三四区| 婷婷大美在线| 99热国产| 色插综合网| 国产日日操夜夜操的肉棒视频| 久久99综合网| 成人婷婷桔色| 亚洲色网络| 噜噜五月天综合| 天天噪夜夜爽| 婷婷五月天丁香综合网| 五月丁香亚洲婷婷| 欧美日韩国产日本精品四虎网网站物 | 天天透天天干| 综合久久高清| 、激情六月天| 人妻第九页| 六月天无码网址| 色欲AVV| 五月丁香啪啪伦理电影| 色婷婷丁香九月| 9久久精品| 丁香五月天天| 91呦呦呦| 99玖玖在线视频| 黄色AV日韩| 日日夜夜干| 日韩在线观看亚洲| 色偷偷综合| 日韩欧美一区二区三区四区| 五月天婷婷色综合| 五月婷婷免费在线观看| 丁香色影院| 99热自拍| 超碰不卡在线| 9999色色色色| 亚洲成人网在线观看| 久热在线中文字幕色999舞| 色婷婷激情五月天| 亚洲在线综合| 91蝌蚪窝视频在线| 超碰97干| 天天 青草 丝袜制服 在线| 国产综合A片| 巴基斯坦粉嫩无码视频| 99精品一二三四视频| 亚洲精品字幕在线观看| 天天做天天爽| 操操操操操电影网| 久久久人妻人伦| 激情五月九九九| 大香蕉av在线| 九九热黄色| 天天做天天爱天天要| 色婷婷中文字母五月丁香| 99人妻碰碰碰久久久久| 久久ri精品| 久久婷婷五月| 成人网站免费在线播放| 婷婷丁香五月综合激情视频| 五月婷成人网| 久久永久网址| 久久五月婷综合| 亚洲成人人人操| 激情五月天开心网丁香无码| 丁香六月婷婷综合啪啪| 4399精品一区二区| 玖玖伦理电影| 激情久久久久| www.夜夜| 丁香六月婷婷综合啪啪| 六月丁香好婷婷| 99re久热只有精品6在线直播| 色综合中文色综合网| 9久9久9久女女女九九九一九| 乱抡小BB| 日韩美一级毛卡片| 免费三级黄色| 免费看欧美成人A片无码| 天天日,天天插| 91丨九色丨熟女|老版| 天天操夜夜橾| 婷婷五月激情视频| 天天色综合图片| 色5月婷婷| 丁香五月第四色88| 丁香五月欧美色综合| 美女激情婷婷| 五月天婷婷五月| 深爱激情小说五月婷婷| 色播播之激情五月婷婷| 五月激情综合激情五月| 日 日干 日日做| 伊人天天色| 久久久月丁香| 99re在线这里只有精品视频首页| 国产精品蜜臀99| 五月天夜夜爱夜夜操| 丁香婷婷色五月天| 狠狠色综合网站久久久久| 天天爱夜夜爽| 99婷婷国产最新视频| 午夜成人天堂久久无码日韩久久| 日本综合色色| 日韩成人网址| 丁香婷婷天堂| 亚洲激情六月丁香| 欧美啪啪9| 婷婷天堂综合| 精品网站99| 99精品爱| 免费视频无码| 性色五月天| 少妇AB又爽又紧无码网站 | 亚洲AV综合在线观看| 六月婷婷综合| 亚洲亚洲人成综合网络| 久久网址99热| 97av在线视频| 亚洲 小说 欧美 激情 另类| 婷婷免费视频| 天天拍天天操| 激情综合九| 五月丁香啪啪综合网| 婷婷激情五月吧| av在线色五月丁香婷区久| 天天天天天天操| 久久99网站| 九九热黄色| 日韩青青| 色婷婷五月丁香色| http:色情日本com| 五月天丁香欧美激情| 超碰成人电影| 人人舔天天| 热久国产| 激情人妻蜜夜系列区| www.久久久久久| 久久五月天综合视频网站| 五月色网| 九九这里有精品| 激情五月婷婷丁香综合网| 欧美操人| 久操综合| 久久九网| 99视频这里只有免费精品| 激情色视频| www婷婷| 五月婷天堂视频| 国产99美少妇| 色婷久| 精品爱欲五| 久久综合中文| www99热| 色丁香婷婷美女视频网站| 激情com| 婷婷六月综合基地| 五月天开心色色网| 五月天激情国产综合婷婷婷就去爱| 色情综合网| 99热99在线| 激情啪啪五月| 久久精品亚洲一级牲爱综合 | 人人操人人爱丁香五月| 天天日天天插| 亚洲AV人人操| 五月天婷婷乱论小说| 99久久九九视频| AV堂狠狠干| 久久草中文日韩欧美| 免费色婷婷| 五月丁香六月婷婷亚洲激情综合| 狠狠干综合| 91成人电影| 亚洲色激情| 色综合久久久无码中文字幕999| 五月花婷婷在线精品视频| 婷色五月天| 99精品国产在热久久婷婷| 这里只有精品免费视频在线观看| 丁香五月亚洲天堂| 婷婷五月美女直播| 热热色色五月天婷婷| 操国产人妻| 九九热视频这里只有精品| 激情婷婷在线中文字幕| 91日日日| 99碰网站| 99热主页日本| 国产白丝在线一区| 操逼五月婷婷| 国内裸舞二区| 亚洲性天天| 狠狠久综合| 青草视频在线播放| 五月丁香亭亭A片| 五月天激情小说电影| 五月天播播| 色色热99| 天堂成人A片永久免费网站| 久思思久视频| 亚洲爆乳无码精品AAA片蜜桃 | 五月天无码视屏播放| 久久伊人大香蕉| 五月丁香色婷婷婷基地| 亚洲日韩一页精品发布| 少妇久久诱惑视频| 五月伊人91| 成人丁香婷婷| 激情亚洲婷婷| 91狠狠综合久久久久久| 婷婷四月 成人 狠狠干| 婷婷九月| 久久99这里只有精品视频| 九九爱激情| 五月丁香亚洲婷婷| 538任你爽视频不一样的| 色狠狠综合网| 开心婷婷五月激情网小说| 亚洲经典三级| 色婷婷五月视频| 热99精品视频| 婷婷爱五月| 热99这里只有精品视频| 伊人9草在线观看| 九九热自拍| 久久人妻乱子伦| 日操熟女| 97狠狠色| 五月天性色| 激情啪啪五月天| 伊人久久艹| 综合五月亭亭9| 91精品国产色猫| 五月婷婷综合网| 五月天自拍视频| 七月激情六月婷婷综合在线播放| 九九综合久久| 丁香激情婷婷网| 91色操| 福利视频在线播放| 激情网五月| 成人超碰AV| 久婷视频| 久久综合99| 欧美婷婷综合| 久久五月人人摸| sewuyuetingtingiii| 丁香六月激情| 五月天四色房丁香亭亭| 狠狠香婷婷五月| 五月天丁香综合在线| 99亚洲天堂| 天天日夜夜爽| 五月丁香av在线| 99爱99操| 婷婷五月激情欧美大胆视频| 婷色五月天| 五月婷婷自拍视频| 热99这里只是精品| 五月丁香六月欧美综合| 秋霞av吧| 高清无码视频网址| 五月丁香六月婷婷国产视频| 琪琪秋霞| www999日韩精品| 丁香五月玖玖| 国产成人网| 99热资源在线| 五月香六月婷| wwxx日本| 99热偷拍| 婷婷爱五月| 久久五月天影院| 91蜜桃婷婷狠狠久久综合9色| 天堂五月婷婷| 婷婷五月天激情综合深爱激情 | 看片视频在线免费日产在线看| 五月婷婷这里都是精品| 五月婷丁香| 五月婷久久久| 久热在线观看视频9| 久久精品一区二区三区四区| 在线只有精品| 婷婷五月激情网| 99爱视频| 五月天婷婷丁香基地在线观看| 色六月天| 六月婷婷色宗合| 深爱五月激情综合| www.99在线| 婷婷五月丁香花综合| 久久亭亭电影| 久热A片| 岛国在线观看91| 国产精产国品一二三在观看| 激情五月婷婷五月| 大香蕉久操| 丁香五月婷婷色情综合| 五月天 婷 欧美亚洲| 色 色 色综合com| 天天做天天爱天天综合| 五月婷婷激情四月| 五月花婷婷丁香| 亚州性爱99| 99热在这里只有免费精品| 色综合99色| 热99玖玖99玖玖99九九| 中文字幕无线久必| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 婷婷开心五月| 婷婷五月天堂一本在线| 狠狠干思思热| 天天爱夜夜爽| 六月综合婷婷开心伊人| 久久这里只精品| 色婷五月天| xx久久| 久久网日本| 色婷婷久久综合中文久久一本| 婷婷五月天成人| 99热只有| 97caop| 91精品91久久久久77777| av免费在线观看0| 人人操大| 夜夜资源站| 五月天激情小说| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 在线综合亚洲欧美65| 就爱日五月天| 五月婷婷激情日本| 狠狠丁香| 天天天天天色| 色色色色色网站| 天天爱天天操| 婷婷五月丁香五月| 夜精品无码A片一区二区蜜桃 | 亚洲综合新99视频| 久久成人精品视频| 亚洲第一第二网站| a在线观看| 99视频| 婷婷六月天| 4399在线日本A片| 久久久er热| se99视频| 天天插综合| 蜜乳久AV| 久久99久久99精品免观看粉嫩| 香蕉久久五月| bukadeavzaixian| 97干在线观看| 精品思思久久| 午夜国产精品AV在线播放| 久久久免费精彩视频| 少妇AB又爽又紧无码网站| 婷婷激情视频| 激情婷婷| 欧美日韩91| 91色在线/日韩| 麻豆AV一区二区三区| 亚洲天堂九九九| 大香蕉手机视频| 伊人五月天婷婷| 婷婷伊人网| 丁香五月婷婷综合啪啪| 五月停停999| 丁香婷婷五月六月天| 久草a片| 99精彩视频网站在线| 三级毛片7979| 影音先锋 婷婷| 无码啪啪| 热久91| 久久人妻乱子伦| 99爱视频| 淫视馆av三区| 五月天五月色婷婷综合| 精品人妻久久久久久| 亚洲色色色| 91婷婷搞| 情久久综合五月天| 五月天色五月| 操操人人| 丁香六月婷婷综合缴| 国产亚洲成AV人片在线观黄桃| 中文AV在线观看| 天天色综合综合| 热九九精品| 婷婷色色丁香五月天| 另类激情网| 丰满人妻妇伦又伦精品国产| 综合色色网| 五月天婷婷综合免费| 亚洲最大成人综合网720P| 色色五月婷| 99热碰碰| 99热超| 狠狠搞亚洲| 色婷婷成人做爰A片免费看网站| 中文字幕AV在线| 99在线免费观看| 美女爆乳18禁www久久久久久| 色综合天天网| 天天干天天日天天操| 超碰猛烈的性猛交| 婷婷开心激情| 激情婷婷五月社区| 婷婷丁香五月,狠狠综合| 婷婷97| 99精品热视频只有精品10| 激情综合网激情五月天| 碰碰操91| 99精品在线观看视频| 婷婷五月色综合| 婷婷丁香六月综合激情站| 99久精品视频| 亚洲av成人在线| 91人妻人人操| 丁香五月性| 亚洲av骚货| www.五月天。com| 丁香亚洲色综合| 大香蕉在线99热| 99久久婷婷国产综合亚洲| 韩日另类| www.久热| 婷婷性爱| 欧美激情综合五月色丁香| 79精品视频在线观看,| 欧美99视频| 国产精品18久久久| 五月婷婷导航| 亚洲色另类| 91丨九色丨老农村| 丁香成人五月天| 色婷婷激情五月天| 亚洲五月天另类小说图片| 超碰色人妾| 97五月天| 色呦呦美女| 五月婷婷激情综合| 99热在线播放| 色色婷婷丁香| 日本成人噜噜噜噜噜| 99精品国产在热久久| 日本激情五月天‘| 色色色色色色色色色色色色色色,网站| 丁香丝袜五月| 91久草五月天婷婷| www.玖玖婷婷在线| 爽天天天天天天天| 91久久| 久久伦乱| 99精品自拍视频| 婷婷五月天影院| 亚洲看av的网站| 日噜噜色| 99亚洲视频| www.99热日韩.com| 婷婷丁香91综合| 人人播| 色色色99| 国产亚洲精品久久久久苍井松 | 色噜噜狠狠插综合| 六月婷婷啪啪| 丁香五月激情啪啪| 99热无码| 五月香婷婷| 欧美情色电影一区二区| 色五月婷婷亚洲最大| 人妻中文在线| 久久综合五月天激情小说网站| 久久九九色| 成人深爱丁香五月| 亚洲性爱AV| 任你草| 极品五月天| 丁香蜜臀黄色婷婷五月天| 在线只有精品| 99热66| 五月婷婷激情四季| 极品五月天| 另类小说色婷婷| 婷婷色激情五月天| 婷婷五月四狠狠| 99热亚洲综合| 久久久激情| 五月天婷婷影院影院观看| 日日干五月天婷婷| 99re久热| 色五月激情婷婷| www夜夜操com| 丁香九月综合| 婷婷丁香社区| 五月丁久久| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 99久久国产宗和精品1上映| 特级西西4444www无码| 精品国产va久久久久| 大香婷婷| 一本大道伊人AV久久综合| Av九九| 色婷婷丁香五月色综合网| 久久久激情| 光棍影院日韩精品| 欧美色一级色| 日本片日本片祼观看网站在线看中文版网页在线看 | 黄色91在线观看| 国产又爽又猛又粗的视频A片| 99在线观看精品| 丁香五月六月激情久久| 激情综合婷婷五月| 九月激情综合| 综久久久| 色婷婷8| 可以免费观看的AV| 婷婷六月激情| 思思热在线观看| 这里只有精品免费观看网占| 色另类五月天| 综合激情五月丁香| 天天搞天天色综合| 成人五月天。COM| 人妻丰满精品一区二区A片| 夜夜操夜夜操| 大香蕉天堂| 亚洲成人五月| av人人操| 综合热无码| 天天人人天天爽| 激情五月天黄色小说| 六月丁香综合| 日本久久99久久| 四射综合网| 免费操超碰| 91熟妇大香蕉| 91制片厂久久久国产电影| 东京热免费视频| 亚洲综合色婷婷| 夜夜躁爽日日| 日日色综合| 天天日综合| 俺去也婷婷| 色爱综合网| 激情五月天婷婷五月天| 久激情网| 亚洲超碰在线| 91蜜桃婷婷狠狠久久综合9色| 狠狠香蕉| 五月激情六月综合| 91久久久久久| 色五月天在线观看| WWW.婷婷| 五月婷婷色| 成人做爰A片免费看视频| 图片区 小说区 区 亚洲五月 | 激情综合婷婷| 极品人妻VIDEOSSS人妻| 99热国产| 中国丰满熟女A片免费观| 婷婷色色综合| 久在线综合69| 日韩无码人妻一区二区| 色婷婷精品视频| 婷婷激情人妻| 碰碰91| 五月婷婷六月丁香激情深爱| 婷婷五月亚洲激情| 国产99久久久国产精品免费看| 9久热| 色色色色色色色色色影院| 激情六月婷婷啪啪| www.91AV.com| 4438激情网| 好好干Av| 69激情小说| 丁香五月婷婷色情综合| 丁香六月婷婷色播| 丁香六月在线| 成人美女网| 超碰色人妾| 久久99久久99精品免视看婷| 丁香综合伊人| 国产精品五月天婷婷| 综合色色婷婷| 婷婷色播婷婷| 丁香狠狠色婷婷久久无码视频| 99视频在线啪| 亚洲激情亚洲激情 | 久久成人性爱| 天天爽天天干天天| 九九人人精品| 深爱婷婷网| 天天干人人奸97| 久久大香蕉视频| 99无码免费视频| 激情五月少妇| 久久98| 97人碰人操| w婷婷五月婷婷w| 婷婷亚洲丁香五月| 六月激情综合| 五月天激情小说| 99啪在线视频| 国产永久一二一起草| www.婷婷.com| 日本欧美成人片AAAA| 久久密臀婷婷| 六月丁香婷婷五月天| 亚洲激情精品| 开心激情五月天网| 五月婷中文娱乐综合| 亚洲 综合中文| 老司机日日夜夜青草| 丁香六月啪啪| xxxx久| 综合福利网| 少妇激情基地| 九热视频| 无码少妇高潮喷水A片免费| 欧美日本高清视频99| 亚洲婷婷月丁香五月| 日本一级特黄大片AAAAA级| 婷婷色五月综合| 久操热线| 涩综合婷婷| 免费无码毛片一区二区A片| 97碰久久| 日狠狠| 亚洲无码影音| 婷婷五月综合婷婷| 综合网啪| 变态另类色图 | 五月丁香香蕉| 伊人久久大香线蕉综合网站| 无码G高清天| 色婷婷在线播放| 99色免费在线观看| 五月天色导航| 亚洲中文字幕av| 五月丁香无码| 五月天婷婷7米| 男人大jjc女人免费视频| 97亚洲色 torrent magnet| 超碰成人av| www.99久久久久99| 午夜婷婷六月天| 风流少妇A片一区二区蜜桃| 婷婷亚洲天堂| 亚洲性爱电影| 停停五月色宗合| 天天爽综合网| 99人人爽| 中文aV网| 风流少妇A片一区二区蜜桃| 色色色色热热| 少妇激情五月天| 激情综合九月| 人人操人人干AV| 国内久久亭亭| 99精品在线观看视频| 韩国97天堂| 久久99性爱视频| 丁香五月婷婷图片综合| 丁香色播五月天| 国产日韩欧美| 日韩一区二区三区无码| 狠狠综合网| 五月天伊人av| 综合激情五月天| 婷婷丁香色五月天久久88| 人妻久久久久久| 人人亚洲| 丁香五月激情综合| 五月天婷婷久久日| 91Chinese在线| 99热欧| 国产毛片精品一区二区色欲黄A片 99国产在线精品视频 | 婷婷99| 五月丁香婷婷网网网网| 九九久久精品|