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

ARTICLE DETAIL

資訊詳情

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

Vue 性能優(yōu)化:Forced reflow 排查與讀寫分離實戰(zhàn)

Vue 性能優(yōu)化:Forced reflow 排查與讀寫分離實戰(zhàn) 控制臺里突然刷出一屏[Violation] Forced reflow while executing JavaScript took 87ms然后頁面滾一下來一條、點一下來一條開發(fā)機上還沒什么感覺一上真機就開始滑動粘手打字掉幀——這個場景做 Vue 的同學(xué)基本都躲不掉。這條警告不是報錯不影響功能所以它常年被埋在日志里沒人管但它幾乎是所有頁面越用越卡問題的第一現(xiàn)場。它說的是一件很具體的事JavaScript 執(zhí)行過程中觸發(fā)了強制同步重排Forced reflow瀏覽器為了把最新的布局?jǐn)?shù)據(jù)交還給你被迫中斷當(dāng)前 JS 執(zhí)行提前把渲染流水線跑了一遍這一趟花了 87 毫秒。而 87 毫秒在 60 幀的節(jié)奏里等于你連丟五幀還多。這篇文章想解決的就是這一類問題Vue 項目里為什么特別容易踩到 Forced reflow、怎么用 DevTools 把它釘?shù)骄唧w那一行代碼、讀寫分離到底該怎么寫、第三方庫和動畫場景怎么繞過去。內(nèi)容偏實戰(zhàn)代碼可以整段抄走改適合寫過一兩個 Vue 項目、開始關(guān)心性能但還沒系統(tǒng)整理過渲染流程的同學(xué)如果你只是想知道警告關(guān)掉行不行那答案是不行后面會說為什么。1. 先把這條警告翻譯成人話1.1 瀏覽器渲染一幀要經(jīng)過哪幾步現(xiàn)代瀏覽器的渲染主流程可以粗略拆成五段JavaScript 執(zhí)行 → 樣式計算Style / Recalculate Style→ 布局Layout也就是重排 / Reflow→ 繪制Paint→ 合成Composite。JS 階段你改 DOM、改 class、改 inline style樣式計算把 CSS 規(guī)則解析成每個元素最終的計算樣式布局拿到計算樣式后算出每個盒子在頁面上的精確位置和尺寸繪制把盒子變成像素指令合成把這些指令按圖層拼成你看到的畫面。關(guān)鍵點在于布局這一步是惰性的。你在 JS 里改了el.style.width 200px瀏覽器不會立刻重算布局它只會在內(nèi)部標(biāo)記這個元素的布局臟了然后攢著。攢到什么時候攢到兩種時刻一是真的要畫下一幀了二是有代碼來問它要布局結(jié)果。后者就是災(zāi)難的起點。因為一旦你問它要布局結(jié)果它沒法用舊數(shù)據(jù)糊弄你舊數(shù)據(jù)已經(jīng)過期了只能立刻停下來把樣式計算和布局全部跑完再把答案給你。這中間你的 JS 是被打斷的主線程被布局占滿這就是同步重排。所謂 Forced重點在被迫——瀏覽器本來想拖到幀末一起算的被你逼著提前算了。1.2 到底哪些操作會逼瀏覽器重排能觸發(fā)強制重排的操作本質(zhì)都是讀取幾何信息。這些屬性不是存在元素身上的靜態(tài)值而是布局算完才有的結(jié)果所以讀它們就等于向瀏覽器要賬。常見的清單如下觸發(fā)源典型寫法說明偏移尺寸offsetTopoffsetLeftoffsetWidthoffsetHeight最常被踩的一類循環(huán)里讀它等于開重排循環(huán)客戶區(qū)尺寸clientWidthclientHeightclientTopclientLeft不含邊框常用于算滾動容器可視高度滾動尺寸與位置scrollTopscrollLeftscrollWidthscrollHeight寫scrollTop是寫操作但連著讀就會交替幾何矩形getBoundingClientRect()getClientRects()定位類組件、拖拽、Tooltip 全靠它計算樣式getComputedStyle(el).width等布局相關(guān)屬性讀color未必觸發(fā)讀width必觸發(fā)CSS 變量getComputedStyle(el).getPropertyValue(--x)變量參與了布局計算時同樣要 flush焦點與滾動定位element.focus()scrollIntoView()內(nèi)部需要知道元素位置才能滾動Range 相關(guān)range.getBoundingClientRect()富文本編輯器里非常常見這里有個非常重要的判斷標(biāo)準(zhǔn)很多人搞混連續(xù)讀是安全的連續(xù)寫也是安全的只有讀寫交替才致命。你一口氣讀一百個元素的offsetHeight瀏覽器只會重排一次因為第一次讀之后布局就是干凈的剩下的讀都在用同一份新鮮數(shù)據(jù)你一口氣寫一百個元素的寬高瀏覽器一次都不重排因為布局被推遲到幀末。但你要是讀一個、寫一個、再讀一個、再寫一個那就是一百次完整重排。注意console.log(el.offsetWidth)這種調(diào)試語句本身就是讀操作。有時候你只是加了幾行日志想看看尺寸警告就冒出來了別把這個鍋甩給業(yè)務(wù)代碼。1.3 警告里那個 took 87ms 是怎么來的Chrome 會把每一次強制布局的耗時算出來超過一定閾值經(jīng)驗上單次幾十毫秒級別就會在控制臺記一條 Violation。數(shù)字越大說明這次重排的代價越離譜。為什么能這么大因為一次重排不只是算你這一個元素布局的波及范圍可能是整棵子樹甚至整個文檔。改了外層容器的寬度里面所有依賴百分比的子元素、所有的文本換行、所有的 flex/grid 分配都要跟著重算。一個幾千行的表格一次重排干到幾十毫秒一點都不夸張。更麻煩的是它會累積。你在mousemove里搞一次強制重排鼠標(biāo)移動一秒觸發(fā)六十次那就是六十次重排主線程被切成碎片用戶看到的就是拖拽跟不上手。單看一條警告好像無所謂乘上觸發(fā)頻率就是災(zāi)難。2. Vue 項目為什么格外容易踩這個坑2.1 響應(yīng)式更新的批處理救了你也騙了你Vue 3 的更新是異步批處理的你在一個 tick 里改了十個ref它只會在微任務(wù)隊列里 flush 一次patch一次 DOM。這本身是非常好的設(shè)計它天然把寫集中起來了。問題出在讀上——Vue 只幫你批處理了寫沒管你的讀。于是很常見的寫法就變成了這樣組件里某個方法先改了一個狀態(tài)然后await nextTick()接著遍歷 DOM 子節(jié)點讀尺寸讀完根據(jù)尺寸再改一次狀態(tài)。這一輪下來寫、讀、寫交替得非常干凈每一次讀都在逼瀏覽器 flush。而且因為 Vue 的patch是深度優(yōu)先遍歷虛擬 DOM一個父組件的更新可能牽動幾十個子組件同時掛載你在onMounted里讀一次尺寸就是幾十次讀擠在同一幀如果中間還夾雜著子組件的寫操作交替就發(fā)生了。還有一個隱蔽的點Vue 的nextTick用的是微任務(wù)Promise.then它跑在瀏覽器渲染之前的任意時刻跟幀的節(jié)奏沒關(guān)系。你在微任務(wù)里讀布局瀏覽器一樣得立刻滿足你。所以nextTick不是等渲染完它只是等 DOM 更新完DOM 更新完不代表布局算完了。這個區(qū)別決定了你很多我已經(jīng)nextTick了為什么還有警告的困惑。2.2 組件化本身會制造隱形讀寫交替單文件組件寫多了你很難一眼看出哪里在讀哪里在寫因為讀寫散落在不同組件里。舉個我真實遇到過的例子一個父組件列表子組件里有個mounted鉤子用于根據(jù)自身寬度決定標(biāo)題要不要省略號。子組件掛載時會讀自己的clientWidth而父組件在插入這些子組件之前剛剛設(shè)置過容器的padding。結(jié)果就是子組件每掛載一個讀一次寬度而父組件的樣式寫入又讓布局臟掉下一個子組件讀的時候又得重排。一百個子組件就是一百次重排控制臺刷屏。這種問題在組件層級越深、復(fù)用越多的項目里越嚴(yán)重因為寫操作發(fā)生在祖先讀操作發(fā)生在后代中間隔著好幾層組件邊界你根本不會把它們聯(lián)系起來。這也是為什么我認(rèn)為這條警告不能只靠看到就改得建立一個意識任何讀 DOM 尺寸的代碼都要問一句我前面有沒有剛寫過樣式。2.3 Transition 和動畫鉤子里的固定開銷Vue 的Transition在實現(xiàn)上為了拿到過渡起點需要在元素插入后、添加過渡類名之前讀取一次布局信息這個操作本身就會強制重排。單個元素?zé)o所謂一兩個毫秒的事但列表過濾、v-show批量切換、路由切換帶動畫的時候同一幀內(nèi)可能有幾十個元素同時走這套流程代價就上來了。v-show還有額外一層display: none和display: block的切換會直接讓布局失效切完再去讀尺寸就是一次完整重排。有些同學(xué)為了做折疊展開動畫用v-show配合讀取內(nèi)容高度在長列表里滾動著展開卡頓感會非常明顯。2.4 第三方庫是重災(zāi)區(qū)而且你往往改不動ECharts、Swiper、各類拖拽庫、虛擬表格、富文本編輯器這些庫的定位邏輯基本都建立在getBoundingClientRect()上。它們初始化的時候要量容器尺寸resize的時候要重新量彈出面板的時候要算位置。你沒法改它們的源碼只能從兩個方向下手控制調(diào)用時機和控制調(diào)用頻率。時機上別在mounted同步初始化一屏幾十個圖表讓它們在requestAnimationFrame里排隊頻率上resize回調(diào)必須防抖而且防抖的落地方式最好是rAF節(jié)流加時間閾值不是簡單的setTimeout。這部分在第 5 節(jié)會展開寫具體代碼。3. 把這個警告釘?shù)骄唧w那一行代碼3.1 Performance 面板的正確讀法控制臺的 Violation 只告訴你發(fā)生了不告訴你在哪。真正定位得靠 Performance 面板。操作步驟是打開 DevTools切到 Performance點左上角的錄制按鈕然后在頁面上復(fù)現(xiàn)卡頓操作滾動、拖拽、切換列表三五秒后停止錄制。拿到火焰圖之后看頂上那幾條橫軸色塊。紫色偏藍的是 Layout布局深紫偏紅的是 Recalculate Style。如果你看到一串密密麻麻的小紫色塊每個都很短但數(shù)量巨大中間還夾著黃色Scripting的小塊那就是典型的 layout thrashing——讀寫交替的指紋。如果是一個巨大的紫色塊那說明是單次重排范圍太大方向就不一樣了該考慮的是減少布局波及面比如contain、content-visibility。再往下看切換到 Bottom-Up 或者 Call Tree 視圖按 Self Time 排序。通常在紫色塊下面能直接看到你的業(yè)務(wù)函數(shù)名點進去就能定位到源碼行。如果看到的是一堆getBoundingClientRect、offsetHeight之類的原生調(diào)用展開它的調(diào)用棧業(yè)務(wù)代碼一定在里面。3.2 用代碼給自己埋點抓出超時的那一次Performance 面板好用但它只能事后看而且信息量大、有學(xué)習(xí)成本。想快速定位我習(xí)慣直接給關(guān)鍵 API 打個補丁統(tǒng)計每次耗時和調(diào)用棧。這段代碼只在開發(fā)環(huán)境加上線前刪掉或包在if (import.meta.env.DEV)里// dev-perf.js —— 只在開發(fā)環(huán)境引入 if (import.meta.env.DEV) { const wrap (obj, name) { const raw obj[name] if (typeof raw ! function) return obj[name] function (...args) { const t0 performance.now() const result raw.apply(this, args) const cost performance.now() - t0 // 閾值可以調(diào)抓大放小 if (cost 5) { console.warn([slow ${name}] ${cost.toFixed(1)}ms, this) console.trace() } return result } } wrap(Element.prototype, getBoundingClientRect) wrap(Element.prototype, getClientRects) wrap(Range.prototype, getBoundingClientRect) // 幾何屬性是 getter用 defineProperty 包一層 const geometryProps [offsetWidth, offsetHeight, offsetTop, offsetLeft, clientWidth, clientHeight, scrollWidth, scrollHeight] geometryProps.forEach((prop) { const owner prop.startsWith(scroll) ? Element.prototype : HTMLElement.prototype const desc Object.getOwnPropertyDescriptor(owner, prop) if (!desc || !desc.get) return Object.defineProperty(owner, prop, { ...desc, get() { const t0 performance.now() const value desc.get.call(this) const cost performance.now() - t0 if (cost 5) { console.warn([slow read ${prop}] ${cost.toFixed(1)}ms, this) console.trace() } return value } }) }) }這里有個細(xì)節(jié)值得說offsetWidth這類屬性是getter不是方法所以不能像getBoundingClientRect那樣直接替換函數(shù)得用Object.getOwnPropertyDescriptor拿到原始 getter 再包一層。另外注意scrollWidth掛在Element上offsetWidth掛在HTMLElement上掛錯原型鏈會報錯我上面做了個簡單區(qū)分。埋點閾值別設(shè)太小5ms 以下的不看。跑一遍頁面控制臺會直接告訴你哪一行慢、調(diào)用棧是什么比在火焰圖里翻半天高效得多。3.3 一張現(xiàn)場排查清單真到了線上或者別人移交的項目里時間緊不可能慢慢打補丁。我整理了一張按現(xiàn)象反推原因的表先對號入座再動手現(xiàn)場現(xiàn)象大概率原因第一步做什么拖拽/鼠標(biāo)跟隨明顯延遲mousemove里讀getBoundingClientRect并寫樣式把讀取挪到mousedown移動過程只寫transform長列表滾動頓挫列表項內(nèi)讀offsetTop做吸附/瀑布流改用IntersectionObserver或緩存偏移量輸入框打字掉幀input事件里讀scrollHeight做高度自適應(yīng)用rAF節(jié)流 textarea的field-sizing或緩存彈層/下拉定位抖動Popper 類庫在滾動事件里持續(xù)測量限制resize/scroll觸發(fā)源或用 CSS 定位一屏圖表初始化時白屏卡住多個圖表mounted同步初始化爭搶主線程用rAF分批初始化配合骨架屏折疊展開動畫卡v-show切換后立刻讀內(nèi)容高度改v-if加緩存高度或用grid-template-rows動畫窗口拉伸時整體卡頓resize回調(diào)沒防抖全量重排rAF節(jié)流只在幀內(nèi)算一次這張表覆蓋了八成左右的常見情況。如果你遇到的警告既不屬于拖拽也不屬于滾動那大概率是某個第三方組件的初始化或resize用第 3.2 節(jié)的埋點腳本跑一遍最快。4. 核心解藥讀寫分離到底怎么做4.1 為什么讀寫分離能根治原理其實一句話把同一幀內(nèi)所有的讀集中在前半段所有的寫集中在后半段讀之前保證布局是干凈的寫之后不再去問布局要數(shù)據(jù)。這樣一幀內(nèi)最多強制重排一次甚至零次如果讀的時候沒有臟布局。這套思路業(yè)界叫 fastdom名字來自 FastDOM 這個庫核心就是一個兩階段隊列measure放讀任務(wù)mutate放寫任務(wù)統(tǒng)一調(diào)度。自己實現(xiàn)一個簡化版完全夠用五十行以內(nèi)。4.2 一個可以直接抄的調(diào)度器// scheduler.js const readQueue [] const writeQueue [] let rafId 0 let flushing false function flush() { rafId 0 flushing true // 第一階段集中讀此時布局應(yīng)當(dāng)是最新的 const reads readQueue.splice(0) for (let i 0; i reads.length; i) { try { reads[i]() } catch (e) { console.error(e) } } // 第二階段集中寫寫操作不會立刻觸發(fā)重排 const writes writeQueue.splice(0) for (let i 0; i writes.length; i) { try { writes[i]() } catch (e) { console.error(e) } } flushing false // 寫入過程中如果又產(chǎn)生了新的任務(wù)常見于寫里嵌套了讀排到下一幀 if (readQueue.length || writeQueue.length) schedule() } function schedule() { if (rafId) return rafId requestAnimationFrame(flush) } export function measure(fn) { readQueue.push(fn) // 關(guān)鍵如果當(dāng)前不在 flush 中說明還沒到幀可以立即安排 // 如果正在寫階段追加讀任務(wù)絕不能同步執(zhí)行否則立刻退化成 thrashing schedule() } export function mutate(fn) { writeQueue.push(fn) if (!flushing) schedule() }有三個地方是我踩過坑之后特意加固的第一schedule用requestAnimationFrame而不是微任務(wù)。微任務(wù)在當(dāng)前宏任務(wù)結(jié)束時就跑了可能還在同一幀的 JS 階段里讀到的布局照樣要 flushrAF回調(diào)發(fā)生在瀏覽器決定要渲染這一幀的時刻此時上一輪寫入的樣式已經(jīng)被瀏覽器納入計算讀起來更干凈。第二用一個flushing標(biāo)志判斷當(dāng)前階段。如果mutate階段的函數(shù)里又調(diào)了measure絕對不能同步執(zhí)行那個讀否則你精心設(shè)計的讀寫分離當(dāng)場失效。我的做法是讓它在flush結(jié)束時檢測隊列非空重新排一幀。第三每個任務(wù)包try/catch。調(diào)度器是全局的一個任務(wù)拋錯不能拖垮整批任務(wù)線上排查時這一點很關(guān)鍵。4.3 在 Vue 組件里怎么落地有了調(diào)度器業(yè)務(wù)代碼的改法就很機械了——把讀包進measure把寫包進mutate。但 Vue 里有幾個地方要注意。第一不要在measure回調(diào)里直接改響應(yīng)式狀態(tài)。改狀態(tài)會觸發(fā) Vue 的更新調(diào)度雖然它也是異步的但在這個上下文里容易讓數(shù)據(jù)流變得不可預(yù)測。清爽的做法是讀階段把結(jié)果收集到一個普通對象里寫階段再拿這些數(shù)據(jù)統(tǒng)一提交給 Vue。第二await nextTick()之后不要直接讀尺寸。正確的姿勢是import { nextTick } from vue import { measure, mutate } from ./scheduler async function syncLayout() { await nextTick() // 等 DOM 更新完 measure(() { // 再等一個渲染幀讀干凈布局 const items [...listRef.value.children] const heights items.map(el el.offsetHeight) // 連續(xù)讀只重排一次 mutate(() { items.forEach((el, i) { el.style.setProperty(--row-h, heights[i] px) // 連續(xù)寫 }) }) }) }注意這里讀和寫的順序先nextTick保證 DOM 存在再measure保證布局新鮮讀的時候用map一次性收集完不要在循環(huán)里寫然后mutate里批量寫。這套流程下來整個函數(shù)最多觸發(fā)一次強制重排。第三組件卸載時要清理。調(diào)度器是模塊級的如果組件卸載后隊列里還有引用著已銷毀 DOM 的回調(diào)讀的時候就會拿到null。我的處理是在回調(diào)里做空值判斷或者給任務(wù)加一個cancelled標(biāo)記在onUnmounted里置位。4.4 什么情況下不用調(diào)度器直接 rAF 就夠調(diào)度器解決的是多個模塊零散讀寫的問題。如果你只有一個函數(shù)讀寫都在里面那直接requestAnimationFrame更輕let pending false let cachedRect null function onScroll() { if (!pending) { pending true requestAnimationFrame(() { pending false // 這里集中做讀寫注意讀必須放在寫前面 const top container.getBoundingClientRect().top sticky.style.transform top 0 ? translateY(${-top}px) : none }) } }這個模式叫rAF 節(jié)流本質(zhì)上是把一個高頻事件壓縮成每幀最多執(zhí)行一次。它在滾動、拖拽、mousemove、resize場景里幾乎是萬能的代碼量小、沒有依賴建議先把這個用起來再考慮上調(diào)度器。提示resize事件還有個更現(xiàn)代的替代品ResizeObserver。它比window上的resize精準(zhǔn)得多能觀察單個元素但要注意它的回調(diào)本身也是布局之后、繪制之前執(zhí)行回調(diào)里讀尺寸是安全的寫尺寸卻可能觸發(fā)循環(huán)。要寫就包一層rAF或者直接在回調(diào)里做防抖。5. 高頻場景逐個擊破5.1 拖拽把讀取挪到事件開始那一刻拖拽是 Forced reflow 的頭號來源。壞的寫法幾乎人人寫過// 反面教材每一幀都在讀寫交替 function onMouseMove(e) { const rect box.getBoundingClientRect() // 讀強制重排 box.style.left rect.left e.movementX px // 寫布局臟了 box.style.top rect.top e.movementY px }每一次mousemove都是讀一次、寫一次而且讀的還是自己剛剛寫臟的元素重排跑不掉了。正確做法是把狀態(tài)存在變量里事件開始時讀一次移動過程純計算加寫const state { startX: 0, startY: 0, originLeft: 0, originTop: 0, moving: false, x: 0, y: 0 } let rafId 0 function onMouseDown(e) { const rect box.getBoundingClientRect() // 整個拖拽過程只讀這一次 state.startX e.clientX state.startY e.clientY state.originLeft rect.left state.originTop rect.top state.moving true document.addEventListener(mousemove, onMouseMove) } function onMouseMove(e) { if (!state.moving) return state.x state.originLeft (e.clientX - state.startX) state.y state.originTop (e.clientY - state.startY) if (!rafId) rafId requestAnimationFrame(paint) } function paint() { rafId 0 // 用 translate3d 而不是 left/top box.style.transform translate3d(${state.x}px, ${state.y}px, 0) }兩個改動帶來兩個收益第一整個拖拽只強制重排一次第二用transform替代left/top元素在合成層上移動連布局和繪制都省了只剩下合成流暢度是數(shù)量級的差別。這個技巧是我做拖拽交互時最常用的一招記住動位置用 transform不動 left/top基本能躲掉一半的卡頓。5.2 長列表與虛擬滾動v-for渲染幾千條數(shù)據(jù)然后在某個方法里遍歷子元素讀offsetTop這是瀑布流和吸附滾動的經(jīng)典寫法也是經(jīng)典的重排炸彈。改法有兩條路。輕量的一條是緩存加批量在列表數(shù)據(jù)變化之后用一個measure任務(wù)一次性把所有子元素的偏移量讀出來存到數(shù)組里之后滾動過程中只查數(shù)組不碰 DOM。注意這個緩存要在容器尺寸變化時失效重建ResizeObserver是合適的鉤子。徹底的一條是上虛擬滾動。虛擬滾動的核心思想是只渲染視口內(nèi)的元素元素數(shù)量從幾千降到幾十任何遍歷操作的代價都變得可以接受。如果要自己實現(xiàn)關(guān)鍵點是行高固定或提前測量、用絕對定位撐開滾動高度、滾動事件用rAF節(jié)流。行高不固定的場景通常做法是先按估算行高渲染再用ResizeObserver或者measure任務(wù)逐個修正真實高度并回填緩存。對于大多數(shù)業(yè)務(wù)項目我建議直接用成熟庫而不是自己寫。選庫的時候看一眼它在滾動過程中有沒有讀取getBoundingClientRect有的庫為了做滾動到指定項會在每次滾動時測量那就得配個節(jié)流。5.3 動畫優(yōu)先動不會觸發(fā)布局的屬性做動畫有一條鐵律只動transform和opacity其他屬性盡量別碰。原因是這兩個屬性在合成階段處理改它們不會引起樣式重算和布局重排而改width、height、margin、padding、top、left、font-size這些必然重排而且很可能牽連一大片。Vue 的Transition默認(rèn)用的是opacity和transform之外的類名切換所以自定義過渡的時候要自己寫對。常見的折疊展開如果想平滑別用height: 0到height: autoauto沒法過渡而且會重排用grid-template-rows: 0fr到1fr或者transform: scaleY加transform-origin。前者是純粹的小技巧兼容性不錯。如果用 Vue 的 JS 鉤子做動畫before-enter、enter這類記得每次在enter回調(diào)里做一次el.offsetHeight強制重排來激活過渡這是標(biāo)準(zhǔn)做法但別在循環(huán)里對幾十個元素同時做。批量過渡的場景我通常改成 CSS 類切換加transition-delay錯開讓瀏覽器自己安排。5.4 第三方庫控時機、控頻率、控范圍第三方庫有三個可下手的地方??貢r機指不要在mounted里同步初始化。一屏十個圖表每個初始化都要量容器、算布局堆在一起就是幾百毫秒。把它們?nèi)MrAF或者用IntersectionObserver做進視口才初始化onMounted(() { const io new IntersectionObserver((entries) { entries.forEach((entry) { if (!entry.isIntersecting) return io.unobserve(entry.target) requestAnimationFrame(() initChart(entry.target)) }) }, { rootMargin: 200px }) chartEls.value.forEach(el io.observe(el)) })rootMargin: 200px是提前量用戶還沒滾到就初始化完了體驗更順??仡l率指給庫的resize、scroll回調(diào)加節(jié)流。很多庫自己不做這件事。如果它的 API 允許傳回調(diào)就在外面包一層rAF節(jié)流如果它是監(jiān)聽window.resize的可以自己在初始化前先把尺寸算好傳進去減少它內(nèi)部測量的次數(shù)??胤秶赣?CSS 限制布局的波及面下一節(jié)講。5.5 CSS 側(cè)的兩個低成本優(yōu)化contain屬性可以讓瀏覽器知道這個元素的內(nèi)部布局不影響外部從而把重排范圍鎖在局部。常用值是contain: layout paint布局和繪制都不外溢列表項、卡片、彈層都很適合加。加了之后改動內(nèi)部的尺寸不會引起整個頁面的布局重算收益非常直接。content-visibility: auto更進一步讓屏幕外元素的渲染被跳過。長文檔、長列表里效果明顯但要配contain-intrinsic-size給它一個占位尺寸否則滾動條會跳。這兩個屬性現(xiàn)代瀏覽器都支持得不錯屬于加一行、收益立竿見影的類型。還有will-change: transform很多人拿它當(dāng)萬金油到處加。它的作用是提前把元素提升為獨立合成層減少動畫過程中的重排和重繪。但別濫用——每個合成層都要占顯存幾十上百個層會把內(nèi)存吃光反而更卡。我的習(xí)慣是只在確實要做高頻動畫的元素上加動畫結(jié)束就移除。6. 常見問題與避坑速查6.1 問題速查表問題原因解決nextTick之后讀尺寸仍報警告nextTick是微任務(wù)不等渲染幀讀操作包進rAF或調(diào)度器單個元素動畫也報警告動畫屬性觸發(fā)了布局width/height/top改用transform/opacity只在低端機上卡高端機重排耗時低低于閾值不報用 Performance 面板看別依賴控制臺加了will-change反而更卡合成層數(shù)量過多占顯存只在動畫期間加結(jié)束后移除resize里代碼很少也卡沒節(jié)流一次拉伸觸發(fā)幾十次用rAF節(jié)流并加最小間隔生產(chǎn)環(huán)境沒有警告Violation 只在 DevTools 打開時采集生產(chǎn)排查靠 Performance 性能指標(biāo)組件卸載后報錯調(diào)度隊列里的回調(diào)引用了已銷毀 DOM回調(diào)內(nèi)判空或加取消標(biāo)記列表用index做 key 更卡復(fù)用錯位導(dǎo)致大量 DOM 重建用穩(wěn)定的業(yè)務(wù) id 做 key6.2 幾個容易搞反的細(xì)節(jié)第一個反直覺的點getComputedStyle讀color、font-weight這類純繪制屬性通常不會觸發(fā)重排但讀width、height、margin這些布局屬性一定觸發(fā)。所以別一看到getComputedStyle就緊張看你讀的是哪個屬性。第二個scrollTop的讀取是重排的來源之一但對滾動容器來說它更常見的坑是讀scrollHeight算總高。這個屬性依賴全部子元素布局代價很高能緩存就緩存。第三個v-if和v-show在這件事上的表現(xiàn)不同。v-if是增刪節(jié)點插入新節(jié)點必然讓布局臟掉v-show是切換display同樣讓布局臟掉。兩者都不省區(qū)別在渲染成本和狀態(tài)保持上別指望用v-show能繞開重排。第四個offsetTop是相對于offsetParent的不是相對于視口。很多同學(xué)算錯位置是因為沒注意offsetParent會被position: relative的祖先改變。算視口坐標(biāo)老老實實用getBoundingClientRect。6.3 我在實際項目里踩過的坑第一個坑是埋點本身拖慢了頁面。有一段時間我在Element.prototype上包了好幾層補丁本地跑得好好的一上真機開發(fā)包就卡成幻燈片。原因是補丁里的performance.now()和console.trace()本身開銷就不小console.trace()尤其重在mousemove高頻場景里直接拖垮主線程。后來我改成只在超過閾值且做了采樣比如每 20 次記錄一次的情況下才打日志問題就沒了。第二個坑是調(diào)度器里的死循環(huán)。我最初的版本在flush結(jié)束時無條件重新schedule()結(jié)果一個任務(wù)里不斷往隊列里塞新任務(wù)把rAF變成了忙循環(huán)頁面反而更卡。后來加了單幀最多迭代兩次的限制超出的任務(wù)順著排到下一幀才穩(wěn)下來。第三個坑是以為transform是萬能藥。transform確實不觸發(fā)布局但如果它作用的元素上有一個filter或者復(fù)雜的box-shadow照樣會觸發(fā)重繪代價并不低。還有transform會影響position: fixed子元素的定位基準(zhǔn)做全屏遮罩的時候要特別注意。第四個坑比較隱蔽document.body上的 class 切換會引發(fā)全頁重排。項目里做主題切換、字號切換的時候我在body上切了個 class里面包含font-size變量結(jié)果整頁所有文本重新?lián)Q行一次重排上百毫秒。后來改成用 CSS 變量配合contain把影響限制在主要內(nèi)容區(qū)才把這一下優(yōu)化掉。說到底Forced reflow 這條警告的價值不在于它本身而在于它是一個信號——它告訴你你的代碼正在用一種命令式、逐步確認(rèn)的方式跟瀏覽器打交道而瀏覽器更希望你一次說清楚。把讀和寫分開、把動位置交給transform、把高頻事件壓到每幀一次這三件事做到位控制臺里那串紅色的[Violation]基本就會消失頁面手感也會跟著變一個檔次。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
第四色大香蕉| 情婷婷五月天在线| 国产成人AV不卡| 亚洲综合狠狠艹| 亚洲综合另类| 色婷婷丁香社综合| 成人久碰| 亚洲综合色婷| 中字幕视频在线永久在线观看免费| 婷婷激情社区| 国产精品婷婷午夜在线观看| 五月天另类综合网| 永久思思热在线| 综合激情九月婷婷,激情综合婷婷中文字 | 激情久久综合网| 五月天丁香| 五月婷激情| 另类婷婷丁香| 2050人人操免费工开爱| 婷婷五月天最新综合你懂的 | 99热免| 天天久久66xxx| 色狠狠色噜噜AV天堂五区| 九九精品亚洲| 国产99久9在线| 国产精品人人做人人爽人人添| 国产精品爽爽久久久久久| 色天天久婷婷| 99热这里只有精品1998| 五月天色婷婷伊人网| 综合亚洲五月天| 先锋资源91| 激情小说色五月| 五月丁香婷婷综合网| 综合一本道| 五月激情精品视频| 日本在线噜噜| 天天婷婷色六月| 襙逼网| 天天激情综合| 欧洲日韩一区二区三区| 久久机热这里只有 | 99精品偷自拍| 国产成人AV| 亚洲99热| 五月婷丁香| 99九九视频| 六月婷婷色综合| 久久 婷婷 五月天| a久久| 精品久久久人妻| 色丁香婷婷| 色噜噜五月天| www.婷婷五月天.com| 婷婷涩五月| 色五月色五天色情网| 亚洲激情综合| 九九色综合| 欧美激情综合色综合啪啪五月| 97在线综合| 婷婷黄色| 天天日中文| 欧美性猛交99久久久久99按摩| 91久久婷婷| 色色色综合网| 五月天丁香啪啪啪啪| 久久一伦| 激情综合网丁香| 激情丁香婷婷六月天| 99re熱| 五月六月丁香激情视频| 婷婷五月天BBw| 伊人在线视频| 丰满少妇猛烈A片免费看观看| 激情综合五月| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 狠狠色噜噜狠狠狠狠综合| 激情爱爱网站| 久热这里精品免费| 在线天堂9| 97人人操人人干| 欧美黄色AA片哗啦啦啦| 1024AV视频| 丁香五月婷婷Av| 九九色影视| 天天拍夜夜撸| 久久WW| 丁香五月激情综合| 中文字幕不卡视频| 天天干-天天日| 亚洲色热| 婷婷五月天桃花网| 综合久久99| 五月婷婷婷自由综合| 婷婷激情社区| 亚洲三A| se99热久久一本| 丁香六月婷婷激情综合| 五月开心色| 色五月婷婷丁香五月| 激情操逼婷婷| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 色婷婷久久综合久色综| 成人在线观看精品| 免费色色色| 色播五月网| 天天操天天干天天日| 西西4r午夜剧场| 91婷婷搞| 日韩 中文 欧美| 第四色在线观看| 91大屁股精品| 直接看的AV| 久草五月天| Av中文在线| 色色色色综合网| 色欲资源网| 少妇高潮一区二区三区99欧美| 婷婷五月天97干| 91久久1118| 五月精品免费XXX| 婷婷五月天色色| 五月婷婷亚洲色图| 五月天开心激情综合网| 亚洲色五月婷婷| 丁香五月天婷婷久久综合| 99热成人| 激情图片婷婷丁香五月| 婷婷综合视频| 久久婷婷五月天激情四射| 99小视频网站| 久久一伦| 国产激情av| 久超免费视频| 久久久久久人妻久久久久久久久久人妻久久久 | 少妇高潮A片无套内谢麻豆传| 亚洲色婷婷五月天| 99精品无码| 丁香婷婷老司机久操| 丁香五月六月婷婷自拍| 日本人妻伦在线中文字幕| 九九九九国产| 午夜一区| 婷婷深爱五月天在线| 日日.c| 夜夜大香蕉婷婷丁香| 天天激情| 色玖玖爱| 色五月婷婷久久| 六月婷婷激情| 日日夜夜天天| 很很干五月天| 97成人超碰免| www.婷婷六月天| 超碰99久久| 色婷婷综合久久久久| 小色小蛇伊人婷婷色香五月| 自拍偷窥99热| 五月丁香婷婷国产精品综合| www久久久久久久| 色噜噜狠狠狠综合曰曰曰| 欧美亚洲色色色色| 丁香五月在线播放| www.日本久久videos| 99久久激情视频| 精品婷婷五| 色五月网址| 色婷婷五月天天天天天天天天天| 20253AV| 性生活视频98791| 婷婷五月成人社区| 五月丁香婷婷综合网| 婷婷天堂站| 久久天天| 爽天天天天天天天| 五月综合婷婷开心网| 蜜乳av一级av| 91色综合网| 欧美成人无码一区二区三区| 丁香婷婷五月综合欧美另类| 婷婷色五月天在线观看| 26uuuuuuuu国产| 色五月自偷自拍婷婷婷婷| 91干视频| 丁香网五月天激情| 狠狠色色| 激情文学 综合 九月| 97碰碰在线看视频免费| 激情综合色五月丁香六月亚洲| 六月丁香激情| 欧美五月停| 免费亚洲婷婷五月| 欧美综合在线五月天色婷婷| 狠狠色噜噜狠狠狠狠综合| 五月婷婷色播| 国产激情在线| 开心激情播播五月天| 五月婷婷激情性爱| 国产高清视频91九九九久久久| 九九婷婷综合| 狠狠色丁香久久婷婷综合五月| 国产操B视频| 五月激情小说| 任你艹| 五月婷婷丁香综合| 亚洲开心激情网| 亚洲AV永久无码影院黑人| 五月丁香婷婷色色| 色欲久久久久久综合网综合网| 久热这里有精品视频| 欧美操综合| 日本熟妇乱妇熟色A片蜜桃| 99精品性爱| 色之综合网| 亚洲无码AV片| 九九热内射| 天天干 夜夜爽| 六月丁香影院| 天天操天天爱天天玩| 99re思思| 亚洲网视屏| 人妻Av在线| 日日夜夜干| 婷婷狠狠操| 婷婷激情五月天在线视频| av在线免费网站| 色啪久| 五月婷婷六月激情| 亚洲五月婷| 在线另类视频| 91九色熟女| 天天婷婷色六月| 亚洲激情高潮| 最新激情五月天| 另类在线| 天天做天天爱天天日| 碰97久久| 国产激情综合| 精品成人久久久久久久_一二三四视| 丁香啪啪中文字幕| 色八戒操婷婷| 99re视频在线| 非洲一级AV| 伊人久久大香线蕉AV最新午夜| 丁香五月激情图片婷婷| 性爱111111| 国产伦亲子伦亲子视频观看| 老妇六区| 狠狠狠狠青草| 国产精品视频免费看| 青青草Avb在线| 九色亚洲| www.99精品视频| 91超级碰人人操| 久久久色情| 4399精品一区二区| 97欧美在线| 国产ava| 日韩在线99| 性爱五月丁香| 色欲人妻综合aaaaaaaa网| 噜噜噜噜婷婷五月天| 综合网色| 精品人妻久久久久久久| 91婷婷五月天嫩女| 在线视频你懂得| 日韩成人电影AV| 久久激情五月| 精品影院| 久久影视婷婷五月| 天天色天天搡| 五月婷婷九月婷婷九月婷婷| 天天干,天天日| 久热黄色| 91中文狠狠综合| 丁香八月综合激情| 激情综合无码| 丁香激情六月天婷婷| 亚洲激情综合五月婷婷啪啪| 中文字幕成人影视| 老师的粉嫩小又紧水又多A片视频| 五月综合激情婷婷六月色窝| 久久久香港| 97热在线精品| 五月婷婷色情| 亚洲色综合| 色婷婷狠狠| 另类婷婷五月天啪帕帕| 一区二区三区视频| 直接看的AV网站| 久草热在线视频| 九热视频| 操逼综合网| 色综合久久天天综合网| 狠狠色狠狠色综合日日91| 婷婷五月天激情网站| 五月丁香六月成人| 亚洲99精品九九在线| 久久玖玖综合| 丁香五月亚洲综合| 欧美色婷婷| 99re欧美精品| 天天插天天插天天操| 丁香五月天成人| 久久婷婷五月综合伊人| 色色色色色色色五月| 91热在线| 日本高清综合网五月丁香| 婷婷五月色| 日本大人久久| 青草久久五月婷伊人| 99精品无码| 乱岳熟女50岁| 天天噜天天插| 99久久久免费| 九九热精品99| 欧美一级操逼视频| 五月日韩中文字幕| 亚洲色婷婷婷婷人人爽| 91欧美| 五月天婷婷丁香人人操91| 永久的网站AAAA | 久久9精品视频| www.色婷婷。com| 激情五月色婷婷| 丁香五月天AV在线 | 啪啪黄页网| 俺五月| 九九99久久| 色情五月天导航| 久草久青福利| 婷婷色五月天在线| 丁香综合网| 五月天天爱| 99年操人人爽| 六月丁香婷婷尤物| 99热 精品在线| 成人电影一区| 综合久久婷婷| 久久久18| 深爱激情五月网| 色情婷| 亚艹艹| 天天干天天爽天天操| 99国产精品白浆在线观看免费| 爆乳熟妇一区二区三区爆乳照片| 99九无网码| 91热手机在线| 性热视频99精品| 婷五月天| 久久色9| 婷婷九色| 久久色婷婷| 91综合色| 青青草五月天| 色六月丁香婷婷狠狠干| 五月丁香六月激情网站| 5月婷婷激情网| 狠狠操狠狠色| 激情五月天婷婷在线网址发给我| 91久久电影| 开心婷婷中文字幕| 婷婷丁香五另类网站| www.日韩国产| 久久五月天色婷婷| 成人美女网| 婷婷五月天.com| 午夜天堂一区人妻| 17.c黄色| 91成人看片| 另类专区在线| 五月色 亚洲| 国产乱妇乱子在线播视频播放网站| 色婷婷婷综合五月天| 99热热热99精品丁香| 五月婷婷影视| 综合激情sV| 婷婷五月天xxx| 国产日韩精品SUV| 五月丁香六月日逼| 天天日P天天射P| 亚洲视色| 超碰在线成人| 丁香六月天婷婷色| 亚洲熟妇无码乱子AV电影| 色五月婷婷操逼| 五月丁香啪啪啪啪| 伊人国产婷婷五月天| 日本久久色| 五月婷婷九| 欧洲永久精品| 五月丁香婷婷激情四射迷人| 三级三久久线久久99久目本WW| 日韩黄黄| 一级黄色片看看| www.夜夜操| 五月婷婷免费在线| Av在线不卡一区| 五月 成人 婷婷| 综合五月草| www.久99| 婷婷久热| 这里只有精品视频| 26UUU精品一区二区Com| 91精品久久久久| 五月天激情美女久久| 天天色天天操天天射| 五月婷婷丁香啪啪| yazhochengrenavwang| 这里只有精品视频99| 丁香五月激情六月综合| 久久99精品九九久久久婷婷| www.久操| 免费视频WWW在线观看网站| 婷婷五月天开心激情网| 婷婷爱综合| 九九热91| 桃色五月婷婷| 无码人妻少妇色欲AV一区二区| 激情五月,激情综合网| 99视频久久| 五月天色软件| 婷婷丁香社区| 99久久网站| 九九婷婷网五月天| 婷婷色色网| 97香蕉碰碰人妻国产欧美| 激情操逼婷婷| 人妻熟人中文字幕一区二区 | 婷婷深爱五月天在线| 色色九九五月天 | 国产激情在线观看| 日韩AC在线免费观看| 777色色色| 播五月开心婷婷欧美综合| 天天干天天操天天干天天操天天干天天操 | 日本a片网址| 中文字幕网站在线观看| 日本性视频| 欧美性做爰大片免费看办公室 | 久久精品这里只有精品免费首页| 开心婷婷中文字幕| 狠狠xx| 亚洲婷婷婷| 狠狠色婷婷7| 99日本精品视频热| 色五月91| 中文字幕综合| 丁香婷婷六月天| 久久久久久久久久久月丁| 亚洲婷婷性爱| 日本综合99| 久久性爱99国产| 婷婷五月色| 欧美婷婷综合| 亚洲亚洲人成综合网络| 变态 另类 在线| 熟妇人妻中文字幕无码老熟妇 | 碰超亚洲| AV六月丁香| 丁香婷婷老司机久操| 九久九精品| 五月丁香综合色婷婷| 久草热8精品视频在线观看| 婷婷五月天基地| 五月丁香六月婷婷网| 91成人性爱视频| se99视频| 日日夜夜干| 日本综合色图| 七月丁香五月婷婷在线| www.婷婷久久五月天| 午夜丁香久久久久久| 丁香婷婷浪潮AV久久综合| 欧美色必爱| 久久九九99.www| 亚洲无码www| 九九精品热播| 久久最新色色色| 天天摸,天天爽| 九九一综合精品| 亚洲婷婷乱乱丁香| www.五月丁香| 国产亚洲色婷婷久久99精品91| 99久久综合| 婷婷久久五月天| 色色婷婷综合| 亚洲视频国产一区| 成人五月天婷婷| 99色视频在线观看| 婷婷午夜综合| 国产小精品| 大香蕉视频婷| 97精品综合| 伊人国产婷婷五月天| 丁香六月色婷婷| 庭庭久久内射| 嫩BBB搡BBBB榛BBBB| 99精品丰满| 色人久夂| 99视频精品8 | 婷婷五月天色色| 天天日夜夜草进麻麻的子宫| 色婷婷丁香五月| 日韩999| 色色色丁香| 色综合久久天天综合网| 日撸夜撸日操| site:pnnrt.com| 婷婷五月天av小说| 九九熱最新視頻| 六月丁香好婷婷| 超碰免费大香蕉| 国产伦亲子伦亲子视频观看| 色婷婷久久综合久色综| 狠狠狠狠狠操| 五月丁香婷婷综合| 精品爆操| 天天日天天操天天干| 久久东京热婷婷五月| 被强行糟蹋的女人A片| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 亚洲狠狠婷婷| 综合深爱五月| 日本色婷婷| 久久五月婷婷视频| 热久久视频99| 97福利视频| 182TV大香蕉| 五月天婷婷永久免费视频| 在线观看的av| 欧美三级视频下载| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 色婷婷五月天偷拍| 亚洲AV综合在线观看| 五月婷婷说| 另类少妇人与禽zOZZ0性伦| 色吊丝永久访问网址 | WWW,五月| 色射7856五月天激情四射| 色婷婷内射| 9 1超碰九色| 人妻在线网站| 色色哒五月婷婷六月丁香| 性爱久久| 亚洲人人96@| 乱码操操| 97人妻碰碰碰久| 91大屁股精品| 亚洲色综久久五月| 五月激情婷婷播播开心| 婷婷丁香综合色AV| 夜丁香五月婷婷| 亚洲色就是色色色| 亚洲五月天综合| 丁香九月激情| A一级操| 五月婷婷开心网| 色欲丁香| 久久538| 色一情一乱一乱一区91| 中文字幕黄色片| 久久99激情| 超碰99资源站| 国产熟女一区二区三区五月婷| 夜夜干天天操| 8区视频在线| 丁香五月欧美色综合| 伊人久久大香线蕉AV最新午夜| 狠狠撸激情综合丁香五月天俺来啦| 国产精品国产成人国产三级| 日日干综合| 欧美三级A做爰在线观看| 天天噜天天插| 中文字幕免费高清电视剧| 伊人超碰| 91超级碰人人操| 婷婷激情视频欧美视频自拍视频欧美剧| 婷婷五月丁香激情图片| 天天做天天爱天天玩| 狠狠色五月| 综合AV在线| 91中文在线| 九九久久精品| 激情五月天色婷婷| 99热天堂| 成人精品在线观看| 九九爱激情| 亚洲第二AV| 亚洲综合在线播放| 琪琪秋霞| 婷婷伊人五月丁香天堂网| 色日本综合| 啪啪啪综合网| 亚韩精品视频1区| 另类激情中文| 永久思思热在线| 中日韩美欧成人一区二区精品在线| 五月婷婷在线观看| 伊人色综合影院视频| 国产激情综合| 小视频久久久aaa| 色婷婷9| 精品亚洲国产成人A片在线鸭王| 色五月天视频| 国产9色在线/日韩| 欧美午夜乱妇午夜福利| 99热| 亚洲XX日本| 大香蕉五月| 啪啪啪大香蕉| 久久丁香五月天| 蜜臀丁香黄色婷婷五月天| 国产婷婷婷| 91成人电影| 五月婷婷 六月丁香| 99热第一页| 依人大香蕉| 六月丁丁香| 久久五月人人摸| 激情婷| 亚洲婷婷五月天| 五月婷婷激情综合网 | 色五月婷婷av| 毛片毛片毛片毛片| 狠狠色丁香综合| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 亚洲综合丁香婷婷六月天| 色婷成人狠干| 大香蕉220| 九九色影视| 亚洲va欧洲va国产va不卡| 亚洲国产精品成人免费一区久久久在线观看AAAA | 婷婷久久亚洲| 五月婷婷官网色| 狠狠人人| 色色吧综合| WWW.久久久久久久久久久久久| 色婷婷久久| 五月色丁香| 婷婷色五月丁香六月欧美啪| 亚洲丁香五月美女| 五月丁香综合啪啪啪啪啪| 色色日本欧美| 特黄三级又爽又粗又大| 成人超碰网| 色色色热| 99热网站| 天天干 夜夜爽| 丁香五月婷婷五月天| 五月天电影网| 森林影视大全,最好看的2019年视频 | 99er这里只有精品视频| Av九九| 1024成人在线观看| 色综合av超碰| 五月天大香蕉AV| 免费在线观看av网站| 亚洲精品白浆高清久久久久久| 狠狠草狠狠草| 日韩aaaaa| 色一情一乱一乱一区91Av| www.9797国产| 婷婷人人操| 在线观看亚洲视频影院| 久久久五月五丁香| 婷婷涩涩五月天| 天天日天天舔| 丁香五月色五月| 视频一二区| 中文字幕AV网址| 中文字幕精品在线观看| 色五月天激情| 97自拍视频在线| 99热在线播放| 色色五月天婷婷| 久热超碰| 伊人热在线大香蕉| 丁香五月婷婷激情蜜桃| 绿色小导航AV| 婷婷久久五月丁香| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 五月婷婷在线免费| 99色| 99这里只有精品视频| 操一区| 亚洲愉拍99热成人精品| 亚洲天堂色| 黄色91在线观看| 色色五月天网站| 久久久人妻不卡| 色色色在线播放| 欧洲亚洲激情五月天在线| 五月丁香婷爱在线| 婷婷五月综合社区| 色婷婷成人做爰A片免费看网站| 男女啪啪做爰高潮无遮挡| 九九综合九色欧美狠狠| 亚洲天堂啪啪| 丁香五月婷婷六月婷| 色欲天天综合| 色欲天天综合| 无码激情AAAAA片-区区| 91九色在线观看免费| www.91操| 99热这里只有精品50| 这里只有精品视频免费在线观看| 五月婷婷激情综合网| 日本三级成人秘书精品片| 丁香六月综合激| jiujiu热在线视频| 五月天堂在线| 丁香六月婷婷综合| 五月丁小婷婷激情四射| 久9热视频在线观看| 亚洲色婷婷激情| 丁香婷婷五月天在线视频| 久久丁香| 色五月激情问网站| 性日本激情| 99热这里只有精品在线播放| 日本三级黄色大片| 久久九九99.www| 五月激情丁香五月| 狠狠干无码| 婷婷午夜| 日本三级中文字幕| 99这里只有精品99| 天天天天干| 激情亚洲婷婷| 久久这里有精品视频| 婷婷另类小说| 久久电影4399| 久久人妻视步| 香蕉久久国产AV一区二区 | 激情六月丁香综合| 九九热精品99| 五月婷婷 自拍| 久久激情综合| 九九99在线免费在线观看视频| 日本三级日本黄色| 天堂婷婷五月色| 亚洲免费看片| 亚洲午夜电影| 丁香五月婷久久| 日韩成人无码| www.av视频xx999.com| 五月色综合| 红桃91人妻爽人妻爽| 婷婷五月开心中文字幕色| 97精品综合久久| 久久婷婷东京热| 色五月婷婷激情| 9久热精品在线视频| 人人色人人摸人人看| 日韩另类在线观看| 狠狠草网| 婷婷五月天播播| 婷婷色狠狠| 激情黄色小说五月天| 色婷婷成人做爰A片免费看网站| 爱操人妻| 99久久婷婷国产综合| 蜜桃婷婷狠狠久久| 亚洲va综合va国产va中文| 色婷婷久久9.com| 淫水导航| 激情 久久 婷婷| 精品人妻久久久| 日韩一区二区A片免费观看| 欧日韩AV| 国产亚洲精品久久久久苍井松| 99热思思在线观看| 99性爱视频| 一根材五月婷成人| 人妻丰满精品一区二区A片| 99这里只有精品8| 亚洲色色色| 五月丁香激情综合欧美| 艳妇野外情欲放荡HD| 色播五月丁香综合| 电影91久久久| 996日日爱| 日本九九九九九九| 99精品在线观看视频| 五月婷婷狠狠干| 亚洲色视频| 九九热九九| 影音先锋美国A| 3www激情| 日日操夜夜操无码免费| 五月丁香六月香香蕉| 欧美A级网站| 欧美大肥婆大肥BBBBB| 6080av| 精品国产a| 永久免费一区二区三区| 色色丁香五月天| 国产成人+综合亚洲+天堂| 五月色丁香婷婷中文字幕| 五月丁香本色在线观看| 97热这里只有精品| 五月色婷婷中文字幕| 激情深爱五月天| 五月天婷婷导航| 婷婷伊人五月丁香天堂网| 综合激情在线视频| 超黄亚洲瑟瑟网站| 91女人18毛片水多国产| 久久总和99| 激情综合网五月天天| 久久5 9视频免费观看| 日日杆天天| 日本99久久| 国产日产亚系列精品版优势| 五月婷婷在线视频观看| 五月天社区| 大香蕉综合视频在线| 久久婷婷六月综合综合| 色五月之第四色| 31色区视频免费看| 久久一热| 婷婷五月中文在线视频| 色爱综合网| 97日本在线播放| 五月婷婷六月丁香综合| 激情www.98com| 日韩 中文 欧美| 欧洲MV日韩MV国产| 日韩在线视频网站| www.久久66| 色5月婷婷色| 一级片操逼视频| 五月婷婷色综图片| 五月丁香激情婷婷综合| 91超级碰碰碰| 天天网曰日曰夜夜综合永久免费| 日本三级韩三级99久久| 五月天亚洲综合网| 激情五月婷婷欧美极品 | 色色网站| 欧美成人色婷婷| 99超在线| 久久激情五月婷婷| 午夜微拍福利| 婷婷九月色| 激情av在线| 丁香六月亭亭久久综合| 久久这有这里精品| 亚洲视频五区| 欧美啪啪五月天| 东京热五月婷婷| A久久| 日本一毛片| 丁香五月天天高清在线| VA国产在线综合网站| 97精品自拍| 五月伊人婷婷999| 久久婷婷综合五月| 99热精品在线在线| 99这里只有| 在线中文亚洲| 人人干人人看| 华人在线免费| 五月天激情婷婷丁香| 夜夜人妻五月天| 五月婷婷激情综合| 久久久99免费视频| 婷婷欧美激情| 久久激情婷婷| 色综合9| 美女久久天堂| 亚洲av另类在线观看| 搡BBBB搡BBB搡五十| 五月丁香婷婷啪啪| 人人草人人爱| 天天色视频| 激情五月天色色| 五月婷久久久久综合| 激情亚洲婷婷| 婷婷丁香六月天| 色色五月丁香婷婷| 狼人婷婷久久| 久综合色| 一起草Av| 久久99久久久久久| 91成人性爱视频| 婷婷午夜天| 狠狠干五月天| 婷色五月| 99re6在线视频精品免费| 一起草av| 亚洲精品无人区| 丁香婷婷九月在线| 91a片爽| 怡春院天天干| 日本欧特黄色刺激一区影视久精品无码| 99久久久精品| 婷婷五月无码| 久99热在线观看| yellow视频在线观看91| 99热99色| 色七色九九| 99热日本| 丁香婷婷视频| 91婷婷色| 激情五月天小说网| 国产精产国品一二三在观看| 国产成人综合电影| 丁香五月ⅤA久久久| 好色婷婷| 玖玖在线视频福利| 色噜噜,噜噜色| 婷婷激情丁五月| 国产成人99久久亚洲综合精品| 五月天综合视频| 久久草中文日韩欧美| 色99在线视频| 97在线观看| 在线综合91| 91人妻人人做人碰人人爽九色| 丁香婷婷精品视频| 日韩乱玛久久| 丁香五月色五月| 欧美日韩99| 欧美婷婷色| 2016日日夜夜操| 熟女色专区| 九九精品在线网| 五月婷激情影院| 激情五月综合| 色综啪啪啪啪啪啪| 99热18| 国产精品蜜臀99| 六月撸婷婷| 国产高潮A片羞羞视频涩涩| 欧美激情-区二区三区| 日韩成人中文字幕| 五月丁香六月情婷婷久久| 可以直接看的av| 九九RE视频在线精品| 二区成人视频| 婷婷五月在线综合| 夜夜撸天天操| 大香蕉伊人久久| 91久草五月天婷婷| 思思热99er在线视频| 热久精品| 国产熟妇的荡欲午夜视频| 四川操逼站| 九九免费视频在线| 色综合九九| 丁香五月天大香蕉啪啪| 天天操B| 思思热99在线视频| 久久人妻视频| 九九综合网色全集 | 99热这里全都是精品| 国产综合A片| 日本激情ⅩXX免费视频| 六月丁香婷婷综合在线| 丁香六月天| 久久狠狠干| 婷婷五月天激情综合深爱激情| 九九热精品视频| 亚洲综合在线网站| 日本在线噜噜| 久久久精品人妻| 丁香六月| 色99热| 国产精品涩涩涩视频网站| av在线观看网站| 日本人人xxx| 国产精品第一国产精品| 丁香六月啪啪| 久久九九@| 91精品国产色猫| 开心综合激情综合| 久久草大香蕉| 99热这里都是精品| 亚洲九九视频| 色吊丝99| 六月天丁婷婷| 久久AAAA片一区二区| 久久久人妻不卡| 久久婷婷啪啪视频| 欧美网站视频4399| 五月叮香啪| 丁香八月综合激情| 六月色国内综合| 俺也去五月婷婷丁| 婷婷天天插天天爱| 色婷婷99| wwW天天干| 激情五月婷婷视频一区二区三区| 99re在线视频| 五月天丁香久久| 99熟女啪啪视频| 性爱视频久久| www.99精品视频| 人人视频人人干人人做| 久婷视频| www五月| 久久日韩婷婷五月| 五月天亚洲综合网| 日本97久久久精品| 婷婷五月色激情欧美激情| 婷婷五月无码| 操逼六区| 伊人久久大香网| 久久视频婷婷视频| 久久久激情| 能看的AV| 人妻videos人妻高清| 亚洲情综合五月天| 狠狠色噜噜狠狠狠888了| 玖玖婷婷免费| 综合久久五月天| 欧美成人日韩| 久久久.COM| 天天操天天爱天天日| 国产激情久久久| 日操五月婷| 99欧美精品99日本精品| 成年人看Va免费视频| 日韩伊人大香蕉| 色婷婷9| 综合天天综合| 免费观看全黄做爰的视频| 噜噜噜噜在线| 日本人妻操| 久久五月激情| 亚洲激情丁香五月天色| 免费无码毛片一区二区A片| 丁香5月婷婷| 91操在线观看| 色玖玖| 日韩六十路91性交电影| 欧美成综合在线观看| 婷婷五月丁香五月| 他改变了拜占庭| 激情小说色五月| 婷婷五月天国产| 亚州精品色情无码A片| 国产精品久久久久久久久久| 天天撸天天干天天插| 亚洲久久日| 99性爱视频| se99视频| 大香蕉520| 欧美成人AAA片一区国产精品| 丁香婷婷激情网站| 九九精品自拍| 爱超碰性| 色五月激情| 五月婷综合性中心| 五月丁香婷婷啪啪综合| 丁香色五月 97干| 深爱激清网| www.狠狠| 五月丁香 狠狠爱| 欧美操人| 亚洲日日操| WWW,激情五月天,COM| 色综合五月| 五月丁香啪啪| 婷婷射丁香| 丁香婷婷五月天亚洲| 99玖玖视频| 99热最新| 五月婷婷五月色| 99久久成人| 综合网色| 国产婷婷五月| 午夜天堂一区人妻| 丁香五月影视| 日日狠狠久久偷偷四色综合免费 | 亚洲亚洲人成综合网络| 丁香五月婷婷综合精品素人| 九月婷婷丁香| 欧美在线视频99| 美国不卡视频| 91se精品国产| 狠狠爱综合| 色呦呦美女| 亚洲热久久| 五月天自拍网| 亚洲天堂99| 97久操视频| 91聚色综合网| 激情五月激情综合网| 99九九在线| 色综合激情| 色五月色综合| 色播五月婷婷综合| 天天综合网91| 蜜桃婷婷狠狠久久综合| 熟女少妇内射日韩亚洲| 五月婷婷中文字幕| 伊人久久大香线蕉av一区| 色五婷婷| 久久草婷婷丁香网站| 97丁香花五月天激情小说| 91婷婷搞| 亚洲精品视频电影| 黄色五月婷| 大香蕉丁香婷婷| 亚洲中字AV电影在线网站| 大香蕉婷婷| 免费视频99| 亚洲激情av| 99热在线中文字幕| 婷婷色五天| 激情婷婷五月| 色婷婷丁香五月在线观看| 色爱终和网| 日韩久久这里只有精品| 五月丁激情| 性爱在线播放av| 久热这里只有精品性色AV| 成人av免费观看| 五月综合激情| 欧美婷婷丁香五月社区| 久久久99久久| 超碰99热| 色综合色综合网| 五月激情视频| 五月色综合网欧美网| 一级片sese片.COM| 噜噜狠狠| bbwcuckold精品熟妇| 妻久久久久| 亚洲爱爱无码婷婷色五月| 丁香婷婷六月天| 丁香五月综合在线播放| 天天日婷婷| 天天干天天爽天天操| 五月丁香龟婷婷| 99久久激情视频| www.色婷婷.com| 天堂久久婷婷| 婷婷99| 深爱五月婷婷| 免费无码毛片一区二区A片| 日韩一区二区A片免费观看| WWW色色色COM| 欧美草久久五月天91| 婷婷色av| 伊人色综合网| 嫩草视频在线观看| 99热都是精品| 久久er99热精品一区二区| 狠狠婷婷色综合| 久久久久五月丁香| 操日视频| 狠狠舔| 五月天激情小说电影| 色婷五月| 日本色综合| 久久久久9999| 嫩BBB槡BBBB搡BBBB| 99热 日韩| 五月天停停日日| 色色精品色| 色丁香婷婷美女视频网站| 97婷婷五月| 久久五月激情综合| 激情综合五月婷婷| 99草在线免费观看视频| 91综合色| 五月丁香激情综合网官网| 激情六月日韩| 国产 亚洲 在线| 双性美人被调教到喷水A片| 久久久久九九九九视屏小说88| 五月丁香综合成人社区| 久久视屏这里只有久久| 色综合日日| A片一曲| 精品久久久久成人码免费动漫 | 日日操夜夜爽天天天| 色色网五月激情| 丁香五月婷久久| 99色在线观看视频者| 日本视频99| 手机AVAV天堂看网| 在线观看亚洲视频影院| 欧美性做爰大片免费看办公室| 色综合久久无码| 五月丁香六月综合情在线观看 | 激情AV在线| 99热这里精| 另类A片| 万月丁香狠狠爱| 日韩久久色| 天天日天天日天天搞| 色色色999| 色综合网页| 人妻射精AV| 婷婷五月天基地| 香蕉AV777XXX色综合一区| 啪啪婷婷五月天激情| 天天做综合网色综合| 狠狠色婷婷777| 91操女| 色五月婷婷五月久久| 九月丁香亭亭| 人操91在线| jiujiu无码五区| 久久久久激情| 色婷婷色和| 亚洲99手机免费看视频| 九九这里都是精品| 性爱激情小说AV五月丁香花| 俺五月| 激情综合网五月婷婷| 九九av在线| 这里只有精品9| 中国丰满熟女A片免费观| 中文字幕不卡+婷婷五月| 国产三级秋霞| 天海翼中文字幕高| 五月丁香综合啪啪啪啪啪| 五月综合激情| 丁香婷婷五月人体| site:feetmall.com| 嫩草AV久久伊人妇女超级A| 亚洲网视屏| 久久性爱视频| 婷婷基地成人五月天| 精品少妇蜜臀91| 熟女人妻一区二区三区免费看| 五月婷婷深深爱| 激情丁香五月天| 9l久久久视频| 这里只有免费的精品| 超碰v| 日韩砖区| 天天日日夜夜| 久草五月| 色婷婷综合网站| 天天操加勒比| 婷婷五月电影| 另类视屏| 色婷婷五月天| 日韩国产在线免费观看| 激情五月小说婷婷| 亚洲免费电影2| 五月婷婷六月少妇激情| 五月丁香婷婷激情图片| 我要看激情五月天| av操B网站| 天天檫天天爽| 亚洲综合色成丁香五月色| 九玖欧洲亚洲| 黄色片avv| 久久五月激情| 亚洲99一级无嗎特制在线| 五月天六月婷| 欧美色色日韩| 天天肏高清在线| 狼人狠狠操| 激情五月婷婷网| 99热成人永久免费| 国产精品99久久久久久久女警| 婷婷五月天深爱|