亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

前端性能優(yōu)化:防抖與節(jié)流的核心差異、工程實(shí)現(xiàn)與場景選型 做前端這些年被問得最多的一類問題不是框架怎么選而是“這個(gè)滾動監(jiān)聽卡得要死怎么辦”“輸入框每敲一個(gè)字就發(fā)一次請求后端同事快盯上我了”。這類問題的答案基本都落在防抖Debounce和節(jié)流Throttle這兩個(gè)詞上而它們又恰恰是前端性能優(yōu)化里投入產(chǎn)出比最高的兩個(gè)小工具。這兩個(gè)概念人人都聽過面試也能背出定義但真正在業(yè)務(wù)里寫對、用對、調(diào)對的人并不多——我見過太多把防抖寫成節(jié)流、把節(jié)流寫成“限流”、甚至在組件卸載之后還留著定時(shí)器默默執(zhí)行的代碼。這篇就把這兩個(gè)高頻回調(diào)控制手段徹底拆開講它們各自解決什么問題實(shí)現(xiàn)上有哪些坑等待參數(shù)該怎么算在搜索聯(lián)想、滾動加載、按鈕防連點(diǎn)、埋點(diǎn)上報(bào)這些真實(shí)場景里怎么落地以及怎么和請求競態(tài)、組件生命周期配合起來。無論你是剛?cè)腴T還是已經(jīng)寫了兩三年業(yè)務(wù)代碼看完至少能做到一件事拿到一個(gè)高頻觸發(fā)的場景幾秒鐘判斷出該用哪個(gè)并且能徒手寫出來不用翻文檔。1. 先把這兩個(gè)概念釘死在場景里1.1 高頻回調(diào)為什么會把頁面拖垮瀏覽器的主線程只有一個(gè)JS 執(zhí)行、樣式計(jì)算、布局、繪制全都排在它后面。一個(gè)mousemove在高刷新率設(shè)備上一秒能觸發(fā)一百多次一次scroll在慣性滾動里也能輕松跑到六十次以上input事件更是每敲一個(gè)字符就來一次?;卣{(diào)本身不貴貴的是回調(diào)里通常干的事讀scrollTop、讀offsetHeight、改 DOM、發(fā)請求。這里有個(gè)很多人不知道的細(xì)節(jié)在同一個(gè)任務(wù)里先寫 DOM 樣式、緊接著讀布局屬性瀏覽器為了給你正確的值會被迫立刻做一次同步布局計(jì)算。你寫十次讀十次就是十次強(qiáng)制重排。滾動監(jiān)聽里那種“讀位置—改樣式—再讀位置”的寫法掉幀就是這么來的?;卣{(diào)頻率越高這種強(qiáng)制同步布局發(fā)生得越密集最終表現(xiàn)就是滾動條拖不動、手指劃下去畫面發(fā)黏。請求風(fēng)暴是另一個(gè)后果。搜索框如果不做控制用戶輸入“性能優(yōu)化”四個(gè)字會發(fā)出四次請求而且這四次請求的返回順序完全不保證——第一字的結(jié)果可能最后才回來把正確結(jié)果覆蓋掉用戶看到的聯(lián)想詞永遠(yuǎn)慢半拍。埋點(diǎn)上報(bào)更典型滾動一次上報(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é)流像地鐵班次不管站臺上擠了多少人車都是按固定間隔發(fā)一班人再多也不會連發(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é)束、自動保存滾動加載、滾動視差、拖拽跟隨、埋點(diǎn)上報(bào)、按鈕防連點(diǎn)用戶感知有“等一下才響應(yīng)”的延遲感響應(yīng)是連續(xù)的只是頻率被壓低了判斷標(biāo)準(zhǔn)其實(shí)一句話就夠了你關(guān)心的是“最終結(jié)果”還是“過程中的連續(xù)反饋”搜索框里用戶敲完才是最終結(jié)果用防抖滾動視差每挪一段就要更新一次位置用節(jié)流。搞混這兩個(gè)代碼不一定報(bào)錯(cuò)但體驗(yàn)會很別扭——比如把滾動加載寫成防抖用戶必須停下來不動才會觸發(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)目里遲早會咬你一口。第一個(gè)是this指向。注意上面內(nèi)層用的是箭頭函數(shù)箭頭函數(shù)沒有自己的this它捕獲的是debounce執(zhí)行時(shí)的外層this。如果你把返回的函數(shù)掛到某個(gè)對象上或者用在類方法里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ú)立的混用會出現(xiàn)“A 的輸入把 B 的計(jì)時(shí)清掉”這種極其難查的串?dāng)_。2.2 立即執(zhí)行、取消與返回值把核心邏輯拆開下面這版是我在項(xiàng)目里用了很久的實(shí)現(xiàn)支持首次立即執(zhí)行l(wèi)eading、末次執(zhí)行trailing、手動取消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毫秒之后才會變回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)來就會用空參數(shù)調(diào)用一次原函數(shù)典型的“在控制臺看到一條參數(shù)為 undefined 的多余日志”。加了這個(gè)判斷flush在已經(jīng)執(zhí)行過的情況下就只返回緩存結(jié)果不會重復(fù)觸發(fā)。leading: true的場景很具體按鈕防連點(diǎn)。用戶點(diǎn)第一下要立刻有反饋不能等 300 毫秒后面連續(xù)的狂點(diǎn)全部丟掉同時(shí)trailing: false避免最后一次點(diǎn)擊又補(bǔ)一個(gè)請求導(dǎo)致用戶只點(diǎn)了一次卻發(fā)了兩個(gè)請求。而搜索聯(lián)想恰恰相反要leading: false, trailing: true等用戶停手再發(fā)。這兩個(gè)組合別搞反。2.3 參數(shù)計(jì)算wait 到底該給多少wait給多少沒有標(biāo)準(zhǔn)答案但有幾個(gè)錨點(diǎn)可以參照。前端有個(gè)公認(rèn)的感知閾值100 毫秒以內(nèi)的延遲用戶基本無感超過 200 毫秒開始有“卡了一下”的感覺超過 1 秒就是明確的等待。所以防抖參數(shù)要在這個(gè)區(qū)間里找平衡。搜索聯(lián)想這類場景我一般給250 到 350 毫秒。低于 200 毫秒打字快的人還是會連發(fā)兩三個(gè)請求起不到合并效果高于 400 毫秒用戶敲完字會明顯感覺聯(lián)想詞“慢半拍”尤其是千兆寬帶下請求本身只要 30 毫秒返回延遲全壓在防抖上了。300 是個(gè)能兼顧兩邊的中間值。表單實(shí)時(shí)校驗(yàn)、自動保存草稿這類可以放寬到500 到 800 毫秒。這些操作用戶本來就不期待即時(shí)反饋而且頻繁請求后端做唯一性校驗(yàn)服務(wù)壓力更敏感。窗口resize結(jié)束時(shí)重排圖表給150 到 200 毫秒就夠因?yàn)榉磸?fù)拖拽瀏覽器窗口邊框時(shí)觸發(fā)間隔本來就比較松散。這里還有個(gè)更容易被忽略的點(diǎn)輸入法組合輸入。用中文拼音打字input事件會在輸入拼音字母階段就觸發(fā)比如敲“xingneng”會連續(xù)觸發(fā)七八次但此時(shí)輸入框里的值是拼音串而不是漢字。如果只做防抖不做保護(hù)用戶拼音還沒選完就可能發(fā)出去一個(gè)?qxing的請求。解決辦法一行就夠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)就會被丟棄末次不執(zhí)行。滾動視差用這個(gè)沒問題頁面停下來時(shí)位置本身就是對的。但如果是“滾動到底部加載更多”末次不執(zhí)行就意味著用戶正好停在一個(gè)卡在閾值附近的臨界位置永遠(yuǎn)不觸發(fā)加載得再動一下手指才行。定時(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í)行首延遲但最后一次一定會執(zhí)行末次必觸發(fā)。寬表格橫向滾動同步表頭、拖拽結(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)過了手動執(zhí)行完如果再讓老定時(shí)器到期補(bǔ)一發(fā)就變成執(zhí)行兩次了。if (!timer)這個(gè)守衛(wèi)保證一個(gè)窗口內(nèi)最多只掛一個(gè)補(bǔ)丁定時(shí)器不會越積越多。lastTime在補(bǔ)丁定時(shí)器里要重新賦值否則下一輪判斷的基準(zhǔn)還是舊的窗口會算短。cancel里把lastTime重置成0是個(gè)小技巧。如果組件銷毀后又被復(fù)用比如彈窗關(guān)了再打開重置時(shí)間基準(zhǔn)能讓第一次觸發(fā)立刻執(zhí)行而不是被上次遺留的時(shí)間戳卡住半個(gè)窗口。3.3 交給渲染節(jié)奏的 rAF 型節(jié)流如果節(jié)流的回調(diào)里要改樣式、做動畫、算位置那又有一層更貼合瀏覽器的選擇用requestAnimationFrame代替定時(shí)器。原因很簡單瀏覽器一幀是 16.7 毫秒60Hz 屏幕你用setTimeout(fn, 10)去做滾動動畫觸發(fā)點(diǎn)可能落在兩幀之間瀏覽器得把這次的樣式變更攢到下一幀才渲染反而多一次無效計(jì)算。rAF 會保證回調(diào)在渲染之前的那一幀執(zhí)行改動和繪制對齊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 毫秒一次。滾動監(jiān)聽里讀位置算聯(lián)動、吸頂頭部切換、視差位移我基本都用這版。有個(gè)坑要避開頁面切到后臺標(biāo)簽頁時(shí) rAF 會被暫停ticking會一直卡在true回來之后所有觸發(fā)都被吞掉。所以如果這東西用在長生命周期的全局監(jiān)聽上最好在visibilitychange里重置一下狀態(tài)或者在頁面重新可見時(shí)手動跑一次。4. 落地到真實(shí)業(yè)務(wù)三個(gè)高頻場景的完整方案4.1 搜索聯(lián)想防抖只是第一步競態(tài)才是真問題搜索框是防抖最常見的落地場景但只加防抖是半成品。真實(shí)情況是用戶先輸入“性能”請求 A 發(fā)出300 毫秒后又輸入“性能優(yōu)化”請求 B 發(fā)出。A 在路上堵了一下B 先回來了頁面渲染 B 的結(jié)果兩秒后 A 回來了把頁面覆蓋成“性能”的聯(lián)想詞。用戶看著輸入框里明晃晃的“性能優(yōu)化”四個(gè)字下面顯示的是“性能”的結(jié)果體驗(yàn)直接崩掉。處理方案是在防抖之外加一層請求序號校驗(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í)候如果序號已經(jīng)變了說明這是個(gè)過期請求直接丟棄 if (current ! seq) return; renderSuggest(data.list); } catch (err) { if (current ! seq) return; renderSuggest([]); } }, 300);seq是個(gè)單調(diào)遞增的計(jì)數(shù)器每次發(fā)請求前自增并記下當(dāng)前值回來時(shí)對比。這個(gè)思路比AbortController取消請求更省事因?yàn)橛脩羰炙倏斓臅r(shí)候可能一瞬間發(fā)出好幾個(gè)請求挨個(gè)取消反而麻煩序號校驗(yàn)的好處是請求照發(fā)只是結(jié)果按最新的一版渲染。當(dāng)然如果你更在意省流量用AbortController把上一個(gè)請求掐掉也行注意abort會拋出一個(gè)AbortError得在 catch 里把它單獨(dú)過濾掉別讓它進(jìn)全局錯(cuò)誤上報(bào)。還有個(gè)體驗(yàn)細(xì)節(jié)請求發(fā)出到回來這段時(shí)間最好給輸入框一個(gè)pending狀態(tài)比如輸入框右側(cè)轉(zhuǎn)個(gè)圈。否則用戶敲完字之后 300 毫秒防抖 200 毫秒接口耗時(shí)加起來半秒多沒反應(yīng)會以為頁面卡了。4.2 滾動加載與埋點(diǎn)上報(bào)節(jié)流 單調(diào)時(shí)鐘滾動加載更多的判斷邏輯本身不復(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)聽器不會調(diào)用preventDefault()瀏覽器就不用等回調(diào)執(zhí)行完再滾動滾動流暢度能明顯提升。滾動、觸摸移動這類高頻事件都該加上不加的話控制臺會給你一條“consider marking your touch and wheel event listeners as passive”的提示。二是閾值別給太小。distanceToBottom 300意思是距離底部還有 300 像素就開始加載這個(gè)余量是為了讓下一頁在用戶真正滑到底之前就準(zhǔn)備好。如果你只有一個(gè)可滾動容器比如固定高度overflow: auto的列表window.scrollY就用錯(cuò)了得換成容器的scrollTopinnerHeight換成clientHeightscrollHeight換成容器的scrollHeight。這種混用是滾動加載不觸發(fā)的頭號原因我在好幾個(gè)項(xiàng)目里都遇到過。埋點(diǎn)上報(bào)的場景對時(shí)鐘更敏感。用Date.now()計(jì)算時(shí)間差有個(gè)隱患用戶在系統(tǒng)設(shè)置里手動改了時(shí)間或者設(shè)備自動校時(shí)跳了一下Date.now()會出現(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ā)同步請求靠譜得多。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è)請求。所以服務(wù)端冪等唯一請求號和按鈕禁用狀態(tài)這兩層還是得有防抖只是第一道最廉價(jià)的防線別指望它解決全部問題。框架里最關(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ù)都會讓防抖實(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配合請求序號表單實(shí)時(shí)校驗(yàn)防抖400-600ms監(jiān)聽compositionstart/end自動保存草稿防抖800-1500ms卸載前flush一次窗口 resize 重排防抖150-200ms圖表類可配合ResizeObserver滾動加載更多節(jié)流150-250mspassive: true注意容器內(nèi)滾動的取值埋點(diǎn)曝光上報(bào)節(jié)流500-1000ms用performance.now()計(jì)時(shí)拖拽跟隨、視差rAF 節(jié)流跟幀走后臺切回時(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)在代碼評審里的問題按現(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ā)了一堆拼音請求沒處理組合輸入compositionstart/end攔截聯(lián)想詞和輸入框內(nèi)容對不上請求競態(tài)序號校驗(yàn)或AbortController滾動加載在某個(gè)位置永遠(yuǎn)不觸發(fā)只判斷了一次或取值對象用錯(cuò)換容器滾動取值加distanceToBottom打印摘除監(jiān)聽后仍在執(zhí)行移除的引用和添加的不一致保存包裝函數(shù)引用先cancel再remove頁面切后臺回來動畫不同步rAF 暫停導(dǎo)致ticking卡死visibilitychange里重置5.3 我踩過的三個(gè)坑第一個(gè)坑是防抖和節(jié)流混著用。早年做一個(gè)橫滑表頭的表格我給scroll套了防抖本意是等用戶停下滑動再同步表頭位置。結(jié)果用戶習(xí)慣一路滑到底全程表頭紋絲不動停下來的瞬間“啪”地跳過去觀感極差。后來換成 rAF 節(jié)流滾動過程中表頭平滑跟隨問題當(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)對比一下它們在leading/trailing邊界、maxWait這類擴(kuò)展參數(shù)上的處理方式會發(fā)現(xiàn)自己手寫版本里漏掉的很多邊角情況。我個(gè)人在實(shí)際操作中的體會是這兩個(gè)函數(shù)加起來不到五十行但真正吃透它帶來的收益遠(yuǎn)超五十行代碼本身——它訓(xùn)練的是對“事件頻率、執(zhí)行時(shí)機(jī)、生命周期”這三件事的敏感度這種敏感度放到任何性能優(yōu)化場景里都用得上。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本超碰97日韩精品人妻| 欧美91精彩| 少妇熟女视频一二三区| se吧提供91精品国产91久久久久久 | 久久久久久免费电影| 婷婷色导航| 久草综合视频| 日本人妻中文字幕精品| 加勒比性爱成人在线| 日韩少妇一区二区三区| 国产激情视频一区区三区| 欧美狠狠操| 成人亚欧免费视频| 色吧 综合| 一区二区 韩日AV| 9丨久久九九九| 欧美国产伊人久久久久| 就去色综合| 精品久久久久瑟瑟| AV色图| 日韩无码专区| 精品无码不卡视频| 韩日欧亚a级| 国产亚洲在线观看| 97超碰人人模人人拍人人| 国产精品老熟女一区二区| 伊香蕉综合久久久久久久噜噜噜 | 国产精品久久久久久久久久久久| 久久精精区一区二区一蜜桃一区二区| 少妇高潮九九九九| 久久精品高清无码一区| 美女啊啊啊啊pc| 郑州宾馆老熟女露脸啪啪| 欧美成人精品一区二区男人蜜臀| 九九热视频这里只有精品| 午夜无码精品免费看性色| 91岛国动作片| 老鸭窝黄色视频网站| 亚州精人品大香蕉| 激情婷婷丁香| 无遮挡h肉动漫在线观看| 牛牛AV人人夜夜澡人人爽| 亚洲牲交| 翔田千里Av在线| 97精| 日日骚一区二区三区| 丰满少妇精品一区二区| 中文字幕av片| 欧亚日韩综合精品国产| 亚洲91射| 人人妻人人玩人人澡人人爽| 狠狠爱大香蕉| 亚洲a色| 啊啊啊啊嗯嗯在线久久久| 国产风韵犹存熟妇三区| henhen91| 久久精品国产亚洲5555| wwwxxx日本爽| 一区二区三区免费岛国片| 久久一级无码精品毛片6| 国产美女裸体秘 永久无遮挡| 97香蕉网| 国产成人+综合亚洲+天堂| 激情99| 在线女人91| 精品福利视频| 久久久精品一区二区| 欧美高潮在线| 日韩精品一区,二区 九九...老司机| 超碰97在线 欧美 国产| 久久久一区二区三区麻豆| 欧美少妇人妻| 操逼网站视频漫画国产| 高树玛利亚无码流出| 国产精品999zyz| 性色av婷婷久久一区二区点复制| 另类视频在线| 久久一本大香蕉 | 国产无码成人无码| 亚欧日韩成人| 久久精品视频在线观看| 人妻丰满熟妇av无码区蜜桃| 性夜影院爽黄A爽免费动漫| 操比国产| 久久超碰免费的| 偷拍导航视频网站| 久久久日本电影| 无码乱人伦中文视频| 人妻久热在线| 日本幼女18+| 亚洲最新a在线观看| 91欧美美女日韩国产婷婷| 怡春院久久| 男人天堂2019| 国产精品4p在线观看| 色哟哟的毛片| 香蕉国产精品麻豆亚洲欧美日韩| 另类小说五月天| 久久αⅴ| 婷婷久久五月| 久久这里只精品| 天天插天天干| 在线播放成人高清免费视频| 天天日天天插| 日韩无码一级黄色av片| 超碰在线974| 日韩免费福利在线观看| 亚洲综合888| 麻豆天美一区二区| 97 国产一区| 久久国产AⅤ| 粉嫩国产精品久久久| 久久久精品网站| 午夜欧美神马久久久久| 免费观看的黄色的网站| 欧美极品| 国产日韩欧美| 青青草在线视频人人想人人上 | 啊啊啊啊一区| 超97在线精品视频| 97国产中文| 色999人与兽| 欧美亚洲素人制服精品| 9美女超碰在线免费观看| 可以看的av| 亚洲成人激情小说视频| 欧美日韩精品青青| 欧美性爱一区| 97操97色| 久99久视频精选| 日韩簧片免费看| 手机av亚洲丝袜美腿日韩第一页二页| 91粉芽高清在线一区二区| 诱惑网综合| 欧美天天综合站| 婷婷久久综合| 狠狠色婷婷7777久| 五月天婷婷色| 午夜丁香婷婷| 玖玖爱免费观看视频| 无码精品久久久久久亚洲| 欧美激情亚洲情色| 国产成人AV麻豆| 亚洲宅男天堂| 人妻-91porn| 久久五月天婷婷丁香中文字幕| 一本色道久久天天射天天干| 沈阳熟女高潮对白视频| 欧美探花网| 97超碰人人模人人拍人人| 国产精品日日摸天天碰| 亚州久久9| 一个人免费HD91视频| 亚洲国产美女久久久久| 四虎午夜影院| 探花视频免费观看国产专区| 欧美一二三| 最新国产精品久久精品| 国产97/欧美| 国产乱伦性爱AV| 日韩人妻网站| 丰满少妇人妻久久久久久| 99热婷婷| 天天插天天射| 中文一区二区三区影院| 天天上日日上日韩精品| 鸡巴插逼视频| 欧美性特| 四虎精品永久在线观看| WWW.操逼.COM| 日韩视频啪啪| 超碰97玖玖爱| 日韩国产在线观看av| 91天堂网| 二色av| 啊好爽受不了无码| 亚洲成人贴图| 99热只有这里有精品| 青青操97| 一本一道久久综合久久| 无码操逼网| 999在线电影香蕉| 国产欧洲精品亚洲午夜拍精品| 本道综合精品| 狠狠五月天| 欧美国产操逼| 超碰午夜| 亚洲综合另类欧美久久久| 天天舔日美女视频| 偷拍自拍在线视频观看| 男人的天堂在线| 国产又黄又爽| 日本丝袜美腿人妻九九| 东京热毛片177b2viP| 亚洲av强奸乱伦| 少妇一级无码精品| 97资源超碰| 精品久| 色婷婷五月天| 视频分类 国内精品| 日韩欧美综合激情| 欧天美中出| 色欲无码人妻日韩欧美精品| 亚洲另类久操网| 婷婷午夜清品久久久久久久性色视频观| 巨爆乳一区二区爆乳区 | 丝袜美腿欧美| 日韩综合无码一区久久92| 好吊色在线观看| 欧美天天射| 亚洲综合影片| 欧美丝袜制服久久| 一本色道久久综合精品婷婷| 亚州色交| 一级人妻性爱视频| 激情五月综合开心五月| 九九九精品一区二区无码| 国产精品久久久久久无码红治院| 精品国产乱码久久久久久久久1| 亚洲狠狠入| av中文字幕在线熟女| 91天天看| 91模特在线观看| 婷婷五月天丁香花| 中文字幕乱在线伦视频中文字幕乱码在线 | 蜜臀久久99精品久久久久久酒店| 中文字幕av久久爽Av| 国产综合网站在线播放 | 人人操人人色网| 91丨国产丨白浆| 最新岛国大片| 久操免费在线| 久久久久久电影| 成人区人妻精品一| 超碰一区二区| 欧美后进式| 午夜男人av| 欧美亚洲第一页| 91亚洲网站| 久久香蕉影院| 屌逼麻豆| 青青欧美| 99婷婷一区二区| 极品国产内射| 狠狠色婷婷7777久| 神马久久啊啊| 91东北熟女| 99在线观看| 日韩在线97| 风间由美日韩欧美久久| 国产精品原创巨作?v网站| 69精品人人人人| 色综合天天| 亚洲和欧美裸体美女双飞视频| 欧美在线色| 9久久久久久| 正在播放国产精品一区| 国产福利精品98视频| 91亚洲欧洲| 黄片qw| 黄在线| 色欲久久99精品久久| 中文字幕综合人妻| 亚洲另类色图片| 黄色av片三级三级三级免费看| 日日黄色三级网站| 色综合久久夜色精品国产天堂| 91伊人大香蕉| 操老熟女AV| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久久一区二区三区麻豆| 久久精品国产97欧美精品亚洲| AV天黑人| 秋霞 色色| 亚洲欧洲无码bt精品合集| 呦呦影院| 精品中文字幕第一页| 人人摸人人添人人操 | 少妇高潮99p| 极品丝袜无码| 亚洲,欧美,综合网| 欧美黄业| 久久高清欧美国产| 午夜天堂精品久久| 黄站在线免费观看| 中文字幕精品一区欧美| 99热精品在线| 欧美91色| 久久无码一区二区二三区性色| 国产成人www免费人成看片| 亚洲欧美精品一区天堂久久 | 密桃99999| 久9久9精品| 久久久久久十| 中国大陆国产高清AⅤ毛片| 女人午夜视频777| 亚洲AV无码成人精品久久| 懂色AV一区二区三区| 91天天美女| ji熟女.com| AV天堂丝袜| 久久在肏| 亚洲有码 欧美精品| 狠狠操狠狠燥| 殴美大黄片| 国产精品午夜福利视频| 一起草日韩| 人人妻人人色| 26uuu国产成人综合| 欧美日本天堂| 黄色av网站在线播放| 精久久久91| 一级性爱视频免费在线| 91九九九逼| 8050午夜少妇无码| 91 亚洲情侣偷拍 久久| 乳欲人妻办公室奶水| B049AV在线播放| 黄片com.| 日日橹狠狠爱欧美超碰| 黄色电影在线播放综合网站| 99九九久久| 人妻丰满熟妇一区二区三| 自拍盗摄一区| 操日韩第| 欧美日韩另类字幕中文| 日韩亚洲精品一区二区| 精久久久| 亚洲人妻AV| 中文操逼字幕| 国产精品久久久九九九| 色五月激情网| ji熟女.com| 碰人碰碰人人开房人肉| 黑丝91视频| 操逼操逼逼操操逼91| 成人小电影网站tex| 爱爱动态120秒| 变态乱伦伪娘灌肠一区二区| 天天综合色图| 超碰免费欧美7| 视频黄站| 亚洲免费精品一区| **一级毛片国产| 久久精品国产亚洲AV清纯| 亚洲成人妻日韩在线| 天天操天天干一区二区 | 麻豆久久视频在线地址| 一区二区三区在线资源| 成人看片网站| 插穴性爱视频在线观看| 夜嗨影院| 国产伊人自拍| 91精产一区二区三区| 精品人妻一区二区三区免费视频| 色哟哟 日韩精品| 欧美顶级黄色大片免费| 久久久久久久人妻| 福利在线视频一区二区| 91色交| 夜夜爽爽爽| 亚州操逼网| 久久久九九| 九月丁香| 欧美日韩国产三级黄色| 精品久久久久综合无码| 物尤视频一区二区| 五月激情啪啪| 日韩无码a片| 台湾佬中文娱乐网久久久久久久久久com | 99热婷婷一区二区三| 欧美一区二区三区日韩| www.人人摸在线视频| 中文一区二区婷婷视频| 日本精品第一视频在'| 蜜臀99久久精品久久久懂爱| 精品9999| 国产视频小说| 黑丝制服中文字幕| 啪啪视频免费在线观看| 自慰白浆在线观看| 日韩精品怡红院| 啊啊啊啊好疼| 日韩免费看黄片| 99re不伦| 91日韩国产欧美亚洲另类精盘州至城都| 免费A片三p视频| 九九热精品| 伊人96在线| 亚洲国产成人福利在线观看| 天天干天天做| 亚洲图片色图欧美另类| 大香蕉久| 欧美日韩狠狠爱| V A在线| 99热在线播放| 精吧天堂| 人人扣人人操| 欧美综合自拍亚洲综合图| 欧美日韩色综合网| 国产精品密臀网在线观看| 色欧洲| 激情四射五月天| 免费国产| 中文字幕一区二区三区视频播放| 日本亚欧爱爱| 欧美做爰无码A片视频| 精品无av| 97在线免费看| 韩三级a视频在线观看 | 日韩熟女视频二区| 婷婷久月| 国产精品无码论坛| 91这里只有精品| 婷婷九月丁香| 久久久久久久久久久久久久久久9| av天堂5| 久操免费观看| 九九成人视频| 青青草日韩无码| 亚洲成人ab| 神马午夜久久久| 国产懂色精品国产av| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | av天堂手机版追回| 久久久精品久久| 奇米四色影视777久久久| 欧美久久婷婷| 99久久e免费热视| 91男女| 亚洲精品视频在线播放| 久久精品店| 97中文字幕色| 99性爱在线观看| 久久久久密臀一区二区| 最新制服中文第一页| 九热超碰| 韩日精品福利视频一区不卡在线免 | 欧美日不卡| 中文字幕狠狠玩| 亚洲性爱电影| 国产精品第一区第一页| 91综合中文字幕| 亚洲 在线| 色噜噜狠狠色综无码久久合欧美| 日日爽熟女| 青娱乐 青青青操 日逼| 国产尤物在线三区| 日韩大香蕉AV影片| 久久这里只精品99re66图| 亚洲欧美碰碰| 久久精品国产AV一区二区三区| 色色五月婷婷| 日本中文字幕在线视频| 欲射影视| 一牛一区二区三区久久| 亚州熟妇精品| 欧美偷| 97综合激情| 亚洲黄色AV电影| 91色交| 午夜天堂精品久久久久91| 天天干天天做| 中文字幕亚韩| 九九热精品视频在线观看| 大色综合| 岛国毛片在线观看免费| 激情图片伦理国产一区二区日韩| 情色五月天网| 大香蕉123| 影音先锋视频在线| 99国产精品| 日韩中文字幕宗合在线| 影音综合网| 亚洲乱伦图片视频| 亚洲精品成人动漫在线| 国产99999| 色网综合网| 欧美中文字幕男人天堂久久精品| 91free福利| 18啪啪手机免费性爱| 亚洲色宗合| 久草热制服丝袜在线观看 | 亚洲一区制服诱惑| 伊人国产视频| 免费看污网站| 97香蕉碰碰人妻国产欧美| 性爱乱伦视频免费| 超碰欧美97| 麻豆亚洲AV成人无码久久精品| 色悠久久久av| 加勒比伊人综合| 极品粉嫩一区二区| 91精品成人www| 蜜臀99久久精品久久久久久| 日韩精品大香蕉伊人在线| 一区二区精品更新提醒| 青青青国产| 91neishe| 久久久久久夜夜夜夜夜| 国产精品白虎| 亚洲色图20p| 日韩精品.久久精品.AV女优.天美传媒| 久久精品色欧美aⅴ一区二区| 日亚韩精品视频二区三| 日本人人操人人操| 日本在线激情一区二区三区| 中文字幕一区电影在线观看 | 日产成人久久| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 色色色日本| 97香蕉网| 欧州一区二区三区四区| 欧美伊人久久综合网| 青娱乐国产剧情av一区| 日韩成人精品| AAAAAAAAA黄片| www.久久最新地址| 日本在线不卡v二区| 九九无码视频| 欧美日韩成人在线| 97精品国产97久久久| 日韩人妻操B| 粉嫩国产精品久久久| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 久久国产精品91| 天美一二三在线观看Av| 青青草久草AV| 精品人妻av区天天看片| 日语五十路和六十路亚洲国产精品 | 超97在线精品视频| 五月天婷婷基地| 少妇 综合| 超碰这里只有精品| 97se亚洲| 天天视频黄| 欧美亚洲另类在线蜜桃| 九九无码| 曰本人妻人人澡人人夹| 校园春色制服丝袜中文字亚洲| 色九九九综合| 丰满人妻-区二区三区| 日本色色视频网站| AV 少妇 人妻 偷拍| AV天堂电影网| 88在线一区二区三区| 神马久久久久久久| aaaa少妇高潮大片| 亚洲aw毛茸茸在线| 亚洲一二三四区在线免费看视频| 嗯嗯啊啊啊好爽| 久草精品国产99| 精品一区二区综合熟妇| 农村妇女一级二级三级视频| 欧美亚州综合图片| 青青草一区二区高清无码视频| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 91香蕉国产尤物视频| 超碰日韩人妻| 97超碰国产精品| 中文欧丝袜诱惑| A 天堂| 91在线精品| 亚洲AV免费在线观看| 久热这里| www..com操老师| 97亚洲一区| 日本幼女18+| 人人玩人人添人人澡免费| 丁香五月天堂网| 国产传媒美日韩av| 亚洲āv网址在线观看| 97色干| 2017超碰| 99老司机精品视频在线观看| 亚洲 欧美 天天| 性欧美第一页| www.久久最新地址| 久久久久ab| 欧美天天性| 中文字幕亚洲在线一区| 欧美亚州色的图| 午夜天堂精品久久久久91| 久久人妻一区二区三区高清 | 国产久久一区二区| 在线观看不卡一区二区三区| 人人色人人射人人妻| 少妇激情一区二区三区视频| 亚洲国产精品9999在线观看| 蜜臀99999| 日日操免费视频| 7月婷婷综合| 婷婷五月天激情四射| 99视频自拍| 一本久久久精品| 久久人人爽人人爽人人片Ⅴ| 国产人妻精品一区二区三区秋霞| 欧美一区二区三区入口| 97精品97| 成人aⅴ一区二区三区| 东北女人av| 视频国产欧美在线播放| 69AV女优男人的天堂| 九九九九九九视频免费| 97国产色综合| 免费A片三p视频| 九月丁香婷婷| 男女猛烈无遮掩视频免费软件| 啊啊啊com| 欧美性爱第一页久久| 蜜桃臀 后入 一区 二区 三区 在线| 啪啪啪亚欧美视频| 操穴国产| 狠狠操官网| 在线情色电影 91大 | AV色五月天| 免费A V在线| 狠狠爱夜夜| 爽爽歪在线视频| 日本操逼视频免费| 久久只有精品一区二区三区| 亚洲欧美自拍偷拍| 91AV国产精品| 3571色综合一区二区二区| 天天92av| 国产精品suv一区| 亚洲国产精品成人无码久久久| 天堂8在线新版官网| AV中文字幕三四五| 男人天堂2019亚洲| 久久中文字幕一区不卡| 青青草女人天天干| 日韩人妻精品久久久久| AⅤ片水多多| 丝袜狂射91| 色综合五月天| 国产AV色黄看到爽| 熟女少妇一区二区三区| 亚洲不卡不卡中文字幕不卡| 秋霞一集毛片观看| 婷婷久草| 青青草九九九九九| 操逼视频亚洲| 亚洲另类天堂| 国产乱子伦一区二区三区免看| 天天日日夜夜| 亚一综合久久久久久久久久| 欧美丝袜中文字幕07在线| 日韩伦理视频| 亚洲欧美成人在线| 视频不卡中文字幕| 欧美91网| 成人在线视频一区| 99亚亚热| 亚洲一区二区三区AV无码 | 亚洲成人碰碰| 日韩乱插| 亚洲精品成人动漫在线| 天堂亚洲欧美| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 伦激情人妻另类人妻| 一二区在线观看视频| 欧美日韩国产电影| 黑丝少妇| 亚洲天堂中文字| 日本成熟少妇A∨网站| 高清无码学生妹高潮| 91性高| 九九视品黄色| 99视频内射三四| 久久精品毛片免费不卡| 97超碰磁| 亚洲精品97| 色网亚洲人| 超碰97欧美日韩| 97干天天| 久久一二三四不卡| 欧美少妇第一页| 国产成人亚洲精品自产在线| 日韩成人大片一区二区| 成年人三级黄色片视频| 精品蜜乳AV免费观看| 天天欲望网| 嗯~啊~轻一点 视频| 亚洲欧洲综合成人av一区| 亚州男人天堂| 99少妇| 青青草亚洲一区| 97操97色| juliaann精品熟女一区| 久超碰在| 日韩高潮一区| 亚洲色图超碰在线| 99热在线播放| 久久五月综合| 日日夜夜天天| 99精品网| 日本精品第一视频在'| 黄色高清无码无码破解免费暗网| 人人操,操人人| 一线黄色免费性爱片| 日本精品网站在线中文| 久久久一区二区三区三州| 国产综合色精品在线观看| 99re这里只有精品9| 久热最新在线杭州| 1区2区3区视频| 中文字幕99999| 超碰色老头| 香蕉99秘 一区精品蜜桃臀| 天天天干977| 男女国产精品| 97超碰欧美| 亚洲欧美色图小说| av网页一区二区三区| 岛国激情视频在线观看| 久久精品国产72国产精品福利| 欧美国产伊人久久久久| 色色99| AV天天综合| 精品人妻一区春色| 人妻少妇久久| 成人性交午夜免费片| 欧在线一二区| 天天日天天搞天天干| 国产精品宅男免费| 综合网欧美在线| 久久综合18p| 久久亚码| 97超碰精品图片| 欧美亚洲国产91在线| 亚洲国产奇米影视久久| 五月天社区| 久久久com| 青青草日韩免费观看高清在线| 亚洲风情综合网| 人人看人人插| 人妻乱仑一区二区三区| 国产精品一区二区在钱播放| 91九九九小逼| 九九九九热只有精品| 亚洲成人激情小说视频| 91欧美性| 啊啊啊好舒服视频| xxxx网站亚洲精品| 天天操夜夜操| 久久亚码| 香蕉综合网| 日韩精品人妻一| 五月天婷婷影院| 国产欧美一区二区| 2020中文字幕在线| AV乱伦专区| 亚洲一区日韩| 美女淫穴| 中文乱码字幕观看视频| 18禁精品网站在线看| 9999伦理视频| 清纯唯美激情| 国产69精品久久久久99尤物| 亭亭丁香激情| 精品少妇人妻一区二区三区| 2018天天日天天日| www.色操逼| 蜜臀久久久国产| www.男人的天堂| 日韩人妻播放| 美女诱惑在线一区| 亚洲色图欧美一区二区不卡| 91超碰人人操| 成人片视频| 国产精品女aA片爽爽视频| 91久久久久久久久18| 97在线观视频免费观看| 一区二区三区视频| 六月丁香啪啪| 亚洲图片在线| 日韩综合无码色欲vv| 爱欲AV| 在线不欧美| 五月丁香婷婷色| 亚洲精品黑丝| 丁香六月激情| 成人精品视频一区二区| 97视频免费在线观看| 日本欧美亚洲高清在线看| 激情四射五月天| 欧美五十路熟| 校园春色欧美色图| 亚洲学生妹高清av| 91丝袜美女国产| 亚洲天堂另类| 色99视频| 欧美 亚洲 另类 综合| 家庭乱伦国产精品| 天堂资源欧美| 国产又粗又大硬免费色网视频| 日本Xx性爱| 大但人体久久久久| 国产麻豆福利av在线播放| 目产99999久久999| 久久精品国产亚洲AV高清演员表| 久久久一热在线播放| 91综合网站| 日本免费中文一区二区三区四区| 人妻熟妇一区二区三区| 操逼操网| 欧美视频边做饭边橾| 97网址97| 亚洲精品aa久久伊人| 2020中文字幕在线| 精品一区二区成人动漫| 激情综合 婷婷五月 红杏| 亚洲综合九九| 久热最新在线杭州| 91欧美高清| 黄色无码高清黄色无码网站| 久久国产精品,久久国产| 成人aⅴ一区二区三区| 91无码人妻精品一区二区三区蜜桃| 亚洲人妻AV| 尤物av网站免费在线播放| 蜜桃久久久久久久久久久久| 日韩一级欧美一级在线观看| 91久久久久久久久18| 亚洲揄拍网| 亚洲精品日韩国产欧美| 欧美 亚洲| www.欧精品| 粉嫩粉嫩一区性色AV片| 色九九久九九| 亚洲情色婷婷五月天| caoni国产亚洲av| 91色欧美| 欧美少妇内射| 人人干人人操人人..com| 另类欧美综合| 亚洲AO在线| 立川理惠无码一区二区| 日韩人妻丝袜中文字幕| 欧美狠狠鲁| 中国一区二区亚洲人妻| 国产传媒日韩| 美女AV一区二区| 91一起操| 国产精品久久久久久高清无码免费看| 成人天天爽| 欧美操逼一二三区| 夜夜操青青草| 天天欧美| 日韩三级性| 国产欧美一区二区| 强奸乱伦大香蕉网| 中文乱码字幕观看| 国产风韵犹存熟妇三区| 91美女视屏| 丁香啪啪| 做爱A级亚欧| 亚洲男人的天堂va亚洲男人社| 久久999久| 午夜大香蕉| 日韩欧美加勒比| 精品人妻久久久久一区二区三区| 好看的91视频| 长长久久88视频| 国产传媒操逼视频| 少妇被c 黄 免费观看| 久草综合视频| 九九九综合精品| 亚洲成人免费电影| 欧美综合娱乐久久| 久久国产成人精品国产成人亚洲| 97国产伦理| 天天碰操中国年青熟妇| 欧洲天天在线| 大香蕉五月天婷婷| 啪啪免费| 丝袜美腿校园春色| 91人妻爽爽人人做人人澡| 插欧洲美女欧美精品| 欧美日韩色综合网| 91AV入口| 蜜臀久久99精品久久久久久-DVD原版全| 97免费视频在线观看视频| 国产超碰在线一区| 色婷婷婷五月天激情四射| 久久国产视频性吧| 日韩成人网址| 日韩黄色成人性爱| 一级片视频啪啪| 亚洲自拍小说| 亚洲男人天堂视频| 久操 高清| 玖玖视频在线资源一区二区三区| 久操网无码在线| 久久精品午夜国产亚洲AV无码| 老熟妇91| 亚欧美色| 97免费视频在线观看| 大香蕉淫人网| 密臀在线一区尤物| 97超碰人妻| 美女91在线| 久久区| 97精品免费| 精品人妻伦一区二区三区久久| 亚洲在钱| 亚洲做性| 精品无人区麻豆乱码1区2区图片 | 伊人久久艹| 九九黄色视频在线观看| 国产精品亚洲一区二区三区四区| 黄色性爱网网| 思思热免费视频观看| a久久| 亚洲丝袜二区| 欧洲综合视频| 99热精品青草在线 | 日韩性爱一级片| 97超碰美女| 国产精品久久aV| 激情五月综合开心五月| 俄罗斯一区二区视频在线观看| 亚洲天堂一区二区久久| 亚洲欧美日韩免费电影| 久久老子无码午夜伦不卡| 亚洲精品色| 色999人与兽| 亚洲综合影视| 中文幕97| 99热在线只有精品| 国产乱子伦久久精品综合一区二区三| 亚洲丝袜综合| 久久亚州精品成人Av无| 久久美女国产| 99热免费| 国产性刺激| 日日摸日日碰| 综合熟妇一区二区三区| 亚洲91色| 97免费在线视频| 久久黄色视频一区二区三区| 中文久久爆乳| 久久久久13| 日日橹狠狠爱欧美超碰| 久久伊人网视频一区二区三区 | 久久99999| 春色综合免费| 大香蕉欧美| 岛国色情视频在线观看| 97超级久久强资源| 成人精品一区二区三区| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 温婉少妇玩3p| 91扒丝袜综合在线| 欧美国产操逼| 夜色91| 欧美成人四级在线播放| 激情丁香五月| 超碰97欧美日韩| 中文字幕在线免费观看| 素人一区二区三区日韩| 99热精品在线| 青青11操操操操操操操操| 亚洲综合射| 超碰91在线| 中文一区在线视频| 懂色AV一区二区三区| 有码人妻系列| 自拍六区| 青青操综合网| 一二三啪啪专区| 人人妻人人色一区二区三区| 免费的黄片有限公司| 女优免费一区二区永久| 91激情综合| 婷婷操视频| 成年人性爱日韩| 97视频7| 久久久人妻| 秋霞曰韩R级| 日韩99神马视频播放| 国产熟女精品一区二区| 白嫩国模丰满一二三区| 97一区二压| 热思思免费视频| 盗摄 精品 另类 一区| 蜜臀av网址| 老熟妇一区二区三区…| 欧美超碰9798| 精品午夜福利| 清柠毛片| 奶水 人妻 哺乳 在线| 青青草天天亲夜夜操网| 性爱AV天堂| 秋霞久久亚洲精品成人| 欧美有码激情视频一区二区三区| 91操熟女视频 | 欧美精品系列| 国产精品成人福利在线| 欧美白嫩在线放| 99re免费视频精品全部| 蜜桃精久三区| 天天爽夜夜爽夜夜爽精| 日韩AV片| 啊啊啊啊啊啊啊啊在线观看| 日本在线一二| 男人的午夜天堂| 丁香激情五月| 男人天堂网站| 亚洲av在线免费观看| 素人伊尹大香蕉免费下载视频| 思思热国产在线视频| 97操在线| 熟女精品va中文字幕| 九九av| 欧美人妻久久精品二区三区| 大屁股国产在线视频| 国产性久久久| 四虎精品亚洲| 巨爆乳肉感一区二区三区竹菊影视 | 国产无码精品久久久久久| 青青草原综合久久大伊人精品| 亲子敌伦对白在线播放| 95精品在线| 一级黄色性爱裸体视频| 精品999日本| 精品亚洲国产成人精品| 精品综合久久久久久97| 国产一区在线观看无码AV| 91精品久久久久久久久久| 国产一区二区三区导航| 久久久久久久久9| 人人操人人摸人 | 91人妻Pr| 精品69网| 日本一二区免费| Av手机版天堂网| 亚洲色图欧美视频| 熟女精品一区二区在线观看| 337p大胆噜噜噜噜噜91Av| 欧美色91| 暖暖精品二区三区观看| 伊人久久大香线蕉无码| 麻豆区久久久久亚| 久久久久久人妻| 麻豆精品一区二区三区四区免费观看| 国产精品九9| 精品国产91内射久久| 亚州男人的天堂| 夜夜肏2021| 日韩欧洲操屄视频| 伦理日韩国产久久| 五月天色综合| 亚洲色欲天天天堂色欲网女| 久久机热| 国产精品老熟女一区二区| 屁股久久久久久久| 九九九精品一区二区无码| 久久激情综合| 偷拍 欧美 日韩| Julia Annxxxxx| 婷婷五月天色色| 国产毛片片精品天天看视频| 亚洲欧美在线综合| 首页亚洲国产高跟丝袜诱惑视频| 精品人妻免费观看| 亚洲人精品午夜不卡| 五月久久HDAV| 国产极品99热在线播放69| 欧美 亚洲| 高跟伊人julia ann| 十八禁啪啦拍视频无遮挡| 91色五月俺来也| 五月丁香婷婷综合| 97色爱| www.亚洲黄色| 操少妞在线视频| 国产操逼逼网| 亚州操操穴网| 男人的天堂kva| 天堂无码精品国产久| 日韩精品中文字幕二区| 久久久久国产亚洲一区欧美色图日韩| AV久日| 黄骗免费网站| 日韩欧美大力操| 人、人、摸,人、人、草| 大香蕉丝袜一级片| 久久人妻四季| 偷拍三区| 2017av无码免费无线播| 歐美性天天| 亚洲情色91| 99天堂网| 欧美强奸乱| 强奸乱伦免费网站| 欧美成人免费在线观看| 欧美色亚洲色| 都市激情人妻一区二区青青操视频| 夜夜草网站| 26uuu性物| 男女啪啪网站免费视频| 欧美日韩中文字幕不卡| 91亚洲丝袜熟女| 99re这里| 神马午夜久久久| 午夜精品久久久99| 精品国产乱码久久久久久久久1 | 久久久久九九九| 五月天人妻综合| 后入式999| 欧美 亚洲 综合 制服 另类| 色综合加勒比四四季| 夫妻四区五区六区| 97舔舔| 亚洲色图大香| 大香蕉一区二区在线观看.| 9国产超碰| 蜜臀无码视频在线观看| 青青草毛片| 日韩中文字幕二区| 一级A片女人高潮叫床| 欧美性爱中文字幕无线码| 亚洲中文字幕久久人妻| 久热在线精品免费观看| 色综合一本| 日韩日本欧美在线观看| 亚洲无码视频免费在线观看网址!| 不卡视频一区蜜桃视频 | 国产精品蜜乳AV| 国产 热久久久久国产精品| 在线观看成人性爱免费小视频| 精品国产无码中文| 370p日韩欧美亚洲精品| 日韩无码人妻| 99久久久久久亚洲精品不卡| 强奸乱伦AV一天堂网| 久久久96| 高清国产无码av| 51久久夜色精品国产麻豆| 一起草视频在线| 亚洲精品久久久久毛片A片拉屎 | 日本蜜桃| 吉田爱美AV在线| 久久超碰av在线| 亚洲乱熟女一区二区| 91操熟女视频| 超碰在线人人射| 思思视频免费看网站| 欧亚性爱在线视频| 亚洲综合中文字幕有码| 六月激情婷婷| 禁片 高清 在线观看视频网站| 欧州激情视频在线一区二区| 久干网| 综合熟妇一区二区三区| 91狠狠| 国内偷自视频区视频综合 | 欧州激情视频在线一区二区|