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

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)系起來。這也是為什么我認為這條警告不能只靠看到就改得建立一個意識任何讀 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 } }) }) }這里有個細節(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默認用的是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 幾個容易搞反的細節(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 這條警告的價值不在于它本身而在于它是一個信號——它告訴你你的代碼正在用一種命令式、逐步確認的方式跟瀏覽器打交道而瀏覽器更希望你一次說清楚。把讀和寫分開、把動位置交給transform、把高頻事件壓到每幀一次這三件事做到位控制臺里那串紅色的[Violation]基本就會消失頁面手感也會跟著變一個檔次。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
蜜臀AV一区二区三区激情综合| 岛国免费视频在线| 婷婷五月天av| 草莓精品视频| 91亚洲色人| 蜜臀久久99'精品久久久| 亚洲91极品| 欧美日韩精品一区二区三区高清| 天天躁日日躁狠狠躁| 日产123区精品免费观看| 九九久久综合| 深田咏美亚洲精品福利社| 国产精品操| 操淫穴亚洲五月丁香 | 99精品成人免费看| 一起草日韩| 26uuu最新| 欧美日韩不卡传媒| 久久久免费一级黄片| 东京热双插| 一二三卡欧美日韩人妻免费精品| 伊人久久大香线综合无码| 国产一级片| 免费的黄片wwwwww| 国产高清精品福利| 久久亚洲欧美中文字幕国语| 午夜无码精品免费看性色| 啊啊啊啊啊好舒服视频| 亚洲91网。| 婷婷综合视频| 97色色视频| 在线看免费无码AV天堂的| AV和黑人在线播放| 久久久久久电影| 日语五十路和六十路亚洲国产精品| 色综合1991| 国产天美传媒精品| 精品少妇一区二区| 久久久久久久久久9| 老熟女综合网| 男人的天堂2018| 91精品丝袜久久久久久| 色蜜AV| 乱伦一二三| 狠狠91| 91少妇人妻| 四虎影视精品| 日本爽爽爽爽爽爽免费视频| 国产精品无码成人精品| 最新国产亚洲精品精品国产亚洲综合 | 精品人妻一区春色| 99在线精品观看视频中文| 欧美日韩亚洲少妇寂寞影院正在播放 | 久久久久久性爱视频| 久久这里精品国产99丫e6| 熟女天天干| 欧美少妇性爱网站| 韩日性爱av| 成人a大片在线观看| 精品国产丝袜一区二区三区乱码| 在线a v| 国产尹人在线视频免费| 精品区9| 97一区二区蜜臀| 中出789在线视频| 97久久久久久久精| 无遮挡h肉动漫在线观看| 自拍偷拍 日韩无码| 欧亚免费视频| 激情文学欧美| 久久人妻熟女一区二区 | 久久无码电影| 久久99手机免费视频| 使劲用力艹少妇视频一区二区| 加勒比av中文| 密臀在线一区尤物| 色婷婷视频| 成人看片网站| 亚州五月| 国产精品久久99日日| 操碰97| 中文字幕精品丝袜| 人妻喷水| heyZO天然素人无码AⅤ专区| 六月婷婷色综合| 色欲人妻一区二区在线| 狠狠入| 日韩人妻制服丝袜av| 91久久久久久久久18| 欧美精品丝袜久久久中文字幕| 久久久久久裸体| 图片区小说区| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 视频二区美腿制服人妻欧美| 日韩欧美午夜视频在线| 操曰本熟女| 日本一区二区不卡| 久久9免费视频| 欧美亚洲韩国视频十五区| 人妻丝袜美腿中文字幕| 五月天激情小说| 国桃视频产巨乳精品一区二区在线| 久久久久久九九九九九| 青青草中文-久久青草精品一区二区三| 啊啊啊好疼| 久久精品国产亚洲5555| 久久九九99| 久久精品99| 国产精品第一区第一页| 久久日韩毛| 秘书高跟黑色丝袜国产91在线| 操逼逼中文字幕| 91嫩草欧美| 一二三区操逼国产91| 五月丁香| 男人的天堂视频精品乱在线| 美女自卫慰黄网站免费| 黄色av播放免不| 黑人操一区二区| 天天日天天操VV| 日韩特级毛片免费观看全集| 神马福利久草| 国产精品久久久| 屌色在线97视频| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 日本国产欧美一区三区二区| 欧美人妻精品一区二区| 国产人妻精品一区二区三区秋霞| 国产热RE99久久6国产精品首 | 日本一二区不卡| 精品久久久久久AV无码| AV99热18这里只有精品| 欧日a| 天天干人妻| 日本操逼二区| 日日躁狠狠躁天天躁精品| a v网站在线播放| 99热99re6国产在线播放| 蜜臀AV网站| 91美女高潮| 欧美黄色片AAAAA| 91夜色| 午夜福利久久久噜久噜久久综合| 老熟女乱伦一区| 玖玖资源中文字幕制服丝袜| 无遮挡猛进视频免费无限观看 | 久久这里只精品99re66图| 性高潮久久久| 日韩在线人妻网站| 人人插人人搞人人操| 91色插| Av色五月| 中文字幕第23区| 97在线免费视频| 麻豆婷婷成人一二三| 日本爽爽爽爽爽爽免费视频| 国产精品电影推荐| 亚洲性综合9| 91视频伊人| 91亚洲丝袜| 婷婷五月天伊人| 亚洲AV成人精品网站在AV| 1204金沙人妻懂旧版免费| 91动漫操逼视频| 国产精品一区二区三区免费视频| 中文字幕超碰CAO| 无码国产精品午夜不卡(| 91w欧美| 久久视频,这里只有精品| 天天看综合网| 婷婷色在线| 岛国激情视频在线观看| 97超碰9| 午夜啊啊啊| 色噜噜婷婷| 一区操逼| 国产精品福利视频播放| 18禁看网站一区| 91蜜臀人妻中文字幕在线| 91总综合网| 天天躁日日躁AAAXX| 88xx成人精品视频| 91伊人| 日本 情色 1区2区3区| juliaann精品熟女一区| 懂色AV一区二区三区| 日日操丁香五月天| 欧美日韩大黄片| 久9无限国产| 综合啪啪| 日韩少妇无码| 我要色综合网站| 免费亚洲国产精品久久一区| 色偷偷色偷偷欧美日韩| 91色噜噜狠狠| 美女大乳久久久久久久女人18| 日韩精品 资源| www.91色| 99综合免费视频| 久操大香蕉| 亚洲九月丁香| 国产精品自拍xxxx| 女人 A一级| 国产成人一级av88| 强歼乱伦资源网| 在线色导航| 操操逼视频| 欧美精品精品一区二区| 欧美一二在线| 欧美 亚洲 第一页 | 午夜福利一区二区影院| 九月伊人中文字幕| 性色亚洲| 国产成人精品必看| 大伊香蕉在线视频免费| 亚洲夜夜欢无码一区二区| 香蕉人人操tv| 婷婷五月丁香五月| 蜜桃久久综合视频| 岛国AV一区二区电影| 亚洲综合码| 欧美少妇性乱| 国产自偷| 亚洲AV麻豆Aⅴ无码电影一| 国产精品久久久久久亚洲色欲| 欧美福利视频啊啊啊啊| 亚洲天堂一区二区久久| 人人操人人摸人 | 久超碰在| 四季AV综合网址| 91nbbbbbb| 啊啊啊啊,啊啊好多水| 日韩99999| 久久久久亚洲| 日韩乱中文| 国产吞精a级片激情电影| 久久9视频| 大香蕉一人在线| 九九人妻| 日本性感人妻91| 久久夜黄色无码A级大片| 国产 热久久久久国产精品| 日韩人妻无码专区| 99在线观看无大码| 校园春色 欧美| 奇米四色网| 黄色欧美性爱视频| 麻豆福利视频导航| 亚洲色图欧美色18直播在线| 操逼操网| 色婷婷综合久久久久中文一区二区 | 欧美伦乱爱| 欧美成97爱| 久久久久亚洲三级电影| 色丁香五月婷婷| 日日A∨| 欧美亚洲特P| 三级色综合| 日韩精品一区二区三区四虎影视| 国产精品电影推荐| 91夜色| 日本日逼视频网| 亚州久久9| 久久久久久久97| 亚洲一区二区三区四区视频| 午夜福利久久久噜久噜久久综合 | 日本色色视频网站| www.97在线| 日韩射图| 国产精品成人无码av无码免费| 精品少妇后入一区二区三区四区人妻巨乳| 天天日骚逼熟女| 九九热久久99精品re| 五月天丁香| 久久久久深夜无码| 天堂中文日本在线观看| 夜夜 中文视频rt| 亚州熟女乱伦| 天操天操夜操夜月操月年年操| 欧美精品系列| 国产精品久久久鸭无码的功能| 中文字幕十五区| 夜夜草天天| 乱人伦 国语对白:视频直接看| 97日韩欧美亚洲| 国产欧美一级在线观看| 精品一区二区三区蜜桃臀www| 少妇熟女1区2区3区| 天天做天天爱天天高潮| 美女黄页网站| 91大学精品激情戏| 国产操逼网站亚洲一级黄色| 国产原创精品| 激情小说图片亚洲首页| 中文字幕88av在线| 日韩人妻中文视频| 亚洲素人综合| 大香樵伊人网| 国内毛片欧美香蕉精品| 最新中文字幕av| 岛国黄片网站| 欧美999999| 五月婷网站| 九九九热精品| 丁香色五月 97干| 亚洲 中文 欧美 日韩 在线| 激情五月综合网| 日韩猛交| 在线小视频| 国产精品亚洲免费| 97免费在线观看| 91美腿丝袜在线观看| 日本韩高清无砖码22o| 操九九九九九九| 无码操逼视频一下| 91无摭挡| 青青草原狼av| 国产精品69人妻无码久久久| 99热在线只有精品| 久久本道| 欧美性爱系列| av网站免费看| 91欧美综合在线| 精品超碰国产| ,成人免费啪啪视频| 国产AV人人夜夜澡人人爽麻豆| 欧美一级A片在线看视频性色| 狠狠爱夜夜| 夜夜騷av、一區二區| 亚洲导航深夜福利| 国产女大学生AV| 9长久久精品| 人妻嗯啊啊在线播放| 日本熟女不卡视频| 国产精品国产精品国产| 中字一区| 艾草av| 精品国产久热在线观看| www.91人妻.com| 天天舔日美女视频| 老熟妇一区二区三区啪啪| 国产成人精品日本亚洲语言| 国产精品久久久久久亚洲色欲| 欧美成人国产精品| 久久久久久久久久久久黄色| 人人操AV| 国产亚洲色婷婷久久99精品91葵花宝典 | 国产一区二区精品久久久不卡蜜臀| 偷拍欧美激情| 五月天婷婷色| 麻豆国产原创AV色哟哟| 五月激情小说| 国产一区二区视频在线播放| 国产不良强奸视频免费看| 欧美性色欧美| 四虎在线免费视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美日韩资源| 亚洲欧美激情小说| 欲女人妻性色av| 区一二区日韩亚洲乱码av电影| 操逼日韩无码| 91人妻素女| 眼镜人妻101.com| 婷婷久月| 久久少妇| 亚洲一区二区三区婷婷| 欧美色蜜桃97| 亚洲在线观看| 茄子社区国产精品| 国产女人9999| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 欧美一二在线| 一区麻豆 高清中文字幕| 久久99网站| 唐山老熟妇露脸啪啪叫| 国产熟女乱论| 91精品伊人久久久大香线蕉91| 亚洲欧美在线观看无码| 日韩中文字幕精品一区在线| 日B操| 99re免费视频精品全部| 人妻一区视频| 天堂中文资源在线bt| 你想操日本小逼吗| 免費黃色視頻觀看一| 国内自拍 日韩激情 99| 人人色97| 男人的天堂成人的社区| 色婷婷婷五月天激情四射| 91九九九小逼| 九一性生活免费视频| 欧美综合传媒| 精品国产乱码久久久久久免费| 偷拍亚洲情色| 人妻久久一区二区三区| 日韩熟女操逼| 东北丰满熟女国产一区| 手机看片1025| 四虎AV无码| 黄色不卡视频| 啊啊啊啊无码| 日韩av无码网站| 日韩性爱视频在线免费观看 | 91/欧美| 大香蕉在线SuP| 插插综合网天天影视网| 亚洲欧美小说| 久久av一级av少妇av高潮| 精品v日韩欧美国产| 91精品黄在线观看| 97超碰无码网| juliaann欧美丝袜办公室| 91香蕉国产尤物视频| 6080YYY午夜理论片在线观看| 天天做日日做天天欢。| 夜夜肏2021| 色 亚洲 91| 9美女超碰在线免费观看| 国产呦精品系列在线观看| 色欲av一区二区三区蜜芽| 亚欧日韩成人| 久久婷婷色综合一区二区三区| 日日干夜夜操视频h| 国产AB视频| 国产精品白丝| 国产成人久久久精品免费AV| 亚洲成人精品久久久| 快播电影网日韩新片| 精品日韩人妻视频| 啪啪一区| 国产免费一区| 操国产逼| 这里有精品| 狠操91,com| 26uuu最新| 综合激情五月丁香| 日韩欧美天天爽爽爽天天爽爽| 玖玖久久久| 十八禁成人网站在线观看| 97精品国产97久久久久久户外免费| 国产1727欧美| 综合av社区| 艹我哪美一区无码| 国产精品另类一区大香蕉| 国产传媒午夜理伦精品| 久久99国产综合精品女同| 偷拍亚洲情色| 芊芊操逼视频无码| 91撸色网 玖玖网 欧美| 人人操,人人液| 成人在线日韩| 国产精品另类一区大香蕉| www..com操老师| 欧美熟妇人体| 欧美一级AAAAAAA| 国产原创精品| 国产一级高清免费观看| 夜夜嗨AV一区天天| 亚洲天堂男人| 另类综合另类| 色欲天天综合久久久无码网中文| AV色天香在线| 国产区日韩区在线观看| 亚洲中文字幕有码视频一区二区三区| 欧综合网| 蜜桃传媒一区二区亚洲| 久久大黄片| 天天综合色电影| 超碰九区| 九九久久久久久爱| 无遮挡男女激烈动态图| 婷婷激情一区二区三区俺也去| AVE乱伦| 99热在线不卡| 日韩欧美tv一区二区在线观看| 欧美页片| 操逼逼无码| 欧美综合网站999| 亚洲成av人片色午夜乱码| 人妻喷水| 欧美不卡在线美女| 一级@啪啪视频| 超碰地址97| 欧美日韩国产高清在线一二三区| 97在线/亚洲| 色婷婷丁香五月| 欧美精品三区| 男人网站婷婷| 日本3级一区二区免费| 美欧色综合| 爱欲AV| 欧美成人AⅤ大片在线观看| 人妻大香蕉| 蜜桃臀av在线观看| 国产女同视频在线播放| 91日韩网站| 亚洲精品蜜桃久久久一区二区三区| 操操操五月天婷婷丁香影院| 另类专区加勒比| 丁香六月天| 日韩偷拍一区二区三区| KK色在线影院| 密臀在线免费观看| 俺去俺来也在线www| 91亚洲欧洲| 久久精品视频28| 综合久久婷婷| 国产日韩在线播放av| 日本2020一区二区| 午夜欧美J进J出白浆流出久久久 | 亚洲淫色网中文| 免费一级毛片在线视频观看| 很很操在线| 色香网| 超碰97男人| 美女自卫慰黄网站免费| 国产美女销魂在线观看不卡| 九九九精品美女| 欧美性生活内射| 翘臀vidoes| 免费人成?大片在线播放| 无码久久国产| 国产99热| 日韩三级av片| 亚洲色图第四色| 亚洲91网。| 丝袜六区| 九月丁香婷婷| 久久男女激情视频网站| 黄色av网站在线播放| 少妇久久久久| 97网色| 精品丰满熟妇人妻一区| 99日免费视频中文字幕| 天天舔九色婷婷| 校园春色 男人天堂 | 丰满人妻一区二区中文| 东北老女人的激情视频| 艾草av| 白丝1区2区3区| 日日日日日| www.99热| 99婷婷| 欧美99热| 日日夜夜狠狠| 69人妻精品一区二区绯色| 国产亚州精品美女久久久免费| 美女视频尤物网在线看| 一区二区三区亚洲| 午夜福利av电影在线| 大屁股人妻女教师撅着屁股| J?P?NESEHD熟女熟妇伦| 熟女探花啪啪| 久久久久久99AV无码免费网站| 国产精品人妻免费精品| 曰韩中文人妻视频| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 日韩99999| 亚洲成人ab| 久久久91| 精品一区二区三区国产| se吧提供国产乱老熟视频胖女人| 欧美性爱18观看| 午夜精品久久久久久久久久蜜桃| 人人操人人操人人操人人操人人操人人人11.CM | 91欧美| 精品久久一区二区三区四区五区| 伊人影院在线理论播放 | 啊啊啊草死我| 久久性生大片免费观看性| 成人免费性爱视视| 色在线亚洲视频www| 久久久久国产精品喷潮免费观看臀| 人妻乱仑一区二区三区| 六月丁香啪啪| 大香蕉 222| 亚州综合图片| 亚洲区 欧美区| 女人天堂av在线播放| 日韩欧美操逼xxx| 免费伦费视频在线观看| 99啪啪| 日本天堂网| 亚州色阁| 97欧美精品| 吖在线不卡一区二区国产剧情| 欧美成人一区二区三区在线播放| 熟女人妻av在线资源,黄色的资源| 秋霞男人网| 久久风骚城市| 婷婷色色五月天福利| 久久国内| 青青草吊丝| 欧美色图自拍| 人人人摸人人| 五月婷在线| 欧美 牲| 久久99九九九九6666免费观看软件| 家庭乱伦麻豆| 99久久久久| 97久久久精品| 精品999一区二区| 操逼片中文| 九九九九九九亚洲| 青青操日韩| 一区二区三区高清天码| 99这里都是精品| 操淫穴亚洲五月丁香| 亚洲精品久久久久毛片A片拉屎| 午夜福利免费福利视频| 青青草吊丝| 色图四区| 强免费黄色网址| 日本不卡二三区| 97综合国产| 国内精品伊人久久久久影院会| 99www.bibizy香蕉资源国产一区二区三区高清 | 国产精品黄色三级av| 国产精品老熟女一区二区| 美女网站黄页| 日本丝袜人妻内射| 69人妻精品丰满熟女区| 放黄片放3级黄片没穿衣服| 日韩无码专区| 亚洲图片视频小说| 一本一道vs波多野结衣| 97干天天| 日韩无码操逼片| 国产精品九9| 1区2区3区视频| 人妻激情偷乱视频一区二区三区 | 国产三级片在线观看| 91粉嫩萝控精品福利网站_精品影音先锋国 | 美女爽到高潮91| 日韩性爱再线视频| 亚洲国产精品久久久久婷婷老年| 日韩一级特黄av毛片| 亚洲精品蜜桃久久久久久久| 免费的黄片有限公司| av大香蕉网站| A级片日韩欧美国产欧美视频精选观看| 蜜桃久久综合视频| 亚洲欧美999| 日韩人妻操B| 亚洲一区二区在线观看91| 校园春色综合| 伊人性在线视频| 日本三级韩三级99久久| 97超碰伊人| 探花精品视频| 麻豆成人AV| 久操大香蕉手机视频在线看| 欧美精品庄| 日韩欧美视频青青| 成人精品无码| 久久亚洲天天做| 影音先锋少妇| 嫩草黄页| 韩国一级婬片A片AAAAA| 欧美色九九| 丝袜AV一二三区| 视频国产成人精品日本亚洲18| 情色av电影| av在线观看不卡网站| 啊啊啊久久久视频| 五月婷婷六月丁香| 老司机午夜精品视频| 超碰夫妻97| 3p国产色噜噜一区| 欧美 亚洲 第一页| 狠狠搞 亚洲91| 国产偷拍自拍在线视频| 欧美日韩妖精91com| 中文字幕一区 二区三四五 区日 日骚| 欧美精品69性爱| 亚洲熟女偷拍在线观看| 激情综合五月天| 乱伦熟女专区| 好色美女九七第一页| 欧美第一页性| 日韩国产成人自拍视频| 超碰九7| 五月天久久婷婷亚洲 | 亚洲AV永久无码一区仙野| 91熟女在线| 午夜后入| baisiav| 免费伦费视频在线观看| 日日摸天天爽夜夜欢| 裸体1区| 亚洲天堂综合AV| 乱伦1色页| 国产精品电影大全| 久久超碰天天| 欧美日韩一干二干| 水野优香在线观看| 美國A片| 偷拍偷窥与盗摄视频专区| 中文字幕无码不卡啪啪| 欧美综合色站| 日韩AV片| 韩国一级做A片免费的| 欧美一级黄色免费专区| 校园春色亚洲色图| 97就爱干| 大香蕉国产中文自拍| 长长久久免费视频| 天天天天天天天天天天干美女| 免费国产视频| 欧日韩一二三f区| 国产妇女精品视频青青草| 殴美牲| 久久98| 8050无码八戒| 亚洲成人免费中文字幕| 日韩激情无码影院| 97香蕉网| 欧美天天综合网版| 97操97干| 97久久久久久久久久| av东京热男人的天堂| 好看的91视频| 欧美狠狠弄| 91大神电影天堂| 夜夜嗨一区二区| 色婷婷丁香五月| 色色操| 丁香五月色| 成人av免费观看| 天天肏夜夜肏| 亚洲操逼网| 99操视频| 丁香婷婷色五月| 狠狠五月天| 久久综合五月天| 色色丁香| 99亚亚热| 免費人妻夜夜爽天天爽爽一区| 九九热免费国产视频婷婷伊人| 成人欧美一区二区三区黑人一| 操人无码| 日本在线一二 | 日本操逼视频免费| 粉嫩av在线| 精品久久久久久中文字幕视频免费| 久久99国产精品| 69一区二区| 蜜臀久久99精品久久久久久无删减| 骚女天天综合网| 97在线看| 久久精品国产亚洲AV高清演员表| 国产一区免费午夜视频| 亚洲va有码在线天堂| 老司机射| 丁香色婷婷| 日本高清电影欧美色图| 欧美性爱一内片一区二区三区| 欧色综合| 人妻少妇久久中文| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 欧美极品性爱天天射| 色噜噜精品一区二区三| 97婷婷色| 久久的网站啊啊啊啊啊| 国产熟女二区| 78精品在线| 9久在线视频只有精品| 97人人夜夜精品视频| 日韩在线观看字幕精品| 久久,精品一二三| 蜜臀亚洲中文| 黄色av播放免不| 欧美天天综合| 亚洲成人久久一区二区| 嗯嗯啊中文字幕| 97超级欧美| 日韩无码人妻中字久久三区四区| 91欧美大片| 老司机射| 人人色人人射人人妻| 久操av在线| 九九九久久久| www.av在线观看| 天堂日本亚洲欧美| 午夜福利 成人 91| 两女互慰AV高潮喷水在线观看| 欧美成人黄网色网站| 99热免费| 蜜桃午夜视频一区二区| yw尤物av无码点击进入麻豆| 国产精点久久久成人| 天天综合香 ld视频| 中文字幕一区二区三区四五区| 色屁屁影院www国产| 久久精品性| 夜夜嗨绯色| 麻豆天美传媒毛片| 日本 欧美 国产一区| 精产国品一区二三产品| 色色九区| 欧美成人一区二区三区在线播放 | 日本三级A片网站com| 91美女中出| 日本久久久精品电影| 亚洲欧洲中文日韩女优乱码| 99热综合| 亚洲图片视频小说| 黄色在线网站| 国产精品网站www| 欧美亚洲激情| 五月丁香成人网| 夜夜嗨TV| 国产精品自在自拍视频| 日韩天天本| 日本人妻中文字幕| 大香蕉伊人网WWWn0n| 亚洲欧美碰碰| 99热伊人| 少妇高潮一区二区三区在线| 最新中文字幕在线亚洲| 91美女视频在线免费观看| A片A5445444| 亚洲综合888| 立川理惠被中出无码| 97爱免费插| 蜜臀久久99精品久久久久| 99这里有精品| 日本大香蕉综合网| 一道本久久棕合爱| 欧美乱欲| 国产精品久久9| 亚洲一区二区在线观看91| av中文字幕在线熟女| 好爽视频在线观看视频| 久久久久久亚洲精品不卡人乳| 99热这里都是精品| 激情五月天网站| 97超碰香蕉| 青青爽| 人妻一区二区三区视频| 欧美精品偷拍| 精品欧美А∨无码黑人大荫蒂 | 男女猛烈无遮掩视频免费软件| AV高清一区| 91在线超高颜值国产| 99热8| 免费精品福利在线观看| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 成年女人黄网站| 精品视频久久区| 婷婷深爱五月| 亚洲人妻爽爽爽| 国产欧美美女免费观看视频| 人人爱人人乐人人操| AV天堂男人的天堂| 国产三级多多影院2022国产AA一级毛片无码 | 97在线欧洲| 激情网色| 欧美亚州综合网图片| 日本在线不卡123| 亚洲男人久久综合天堂| 伊人在线大香蕉二。| 九月色婷婷| 亚洲无码国产探花在线观看| 91丝袜美腿片| 欧美亚洲日韩人妻在线观看| 国产午夜福利专区综合| 中文熟女五十乱码在线| 中亚精品极乱| 99久久婷婷丁香| 婷婷激情四射| 国产十八禁视频| 国产精品青草综合久久| 91精品无码久久久久久久 | 欧美视频中文字幕区| 天天综合-91入口| 韩日精品福利视频一区不卡在线免 | 少妇同性| 激情AV| 超碰国产精品无码| 97国产|免费| 91黑丝美女| 欧美激情综合色综合啪啪五月| 人妻无一区二区三区| 凹凸 69堂 在线播放| 亚洲色性情三级| 丁香五月色情| 亚洲最大成人a毛毛片| 97视频免费播放| 日韩色女精品| 成年男人的天堂| 97久久视频| 日韩亚洲中文字幕在线| a级免费在线观看| 超碰色美女| 久久久久网站-538在线视频-欧美永久乱码 | 在线v中文字幕一区二区三区| 亚洲婷婷丁香在线| 99在线精品观看视频中文| 最新精品久久蜜桃| 欧美久久草熟女| 五月丁香婷婷啪啪| 国产小黄片在线免费观看| 97超碰人人模人人拍人人| 亚洲丝袜二区在线| 老熟妇一区二区三区啪啪| 伊人影院在线理论播放 | 国产精品久久久久婷婷二区次| 久久大精品乱码视频人妻熟女| 国产精品视频电影| 五月天成人综合| 亚洲欧美国产其他二区| 视频国产精品未满十八禁止在线观看| 人妻少妇久久中文字幕一区二区 麻豆 | 青娱乐手机日韩在线视频| 18一区二区三区| 午夜人妻精品综合在线| 午夜福利成人免费视频| 国产美女mm131爽爽爽爽| 成全在线观看免费观看| 91视频伊人| 国产在线观看一区二区三区| 免费试看60秒| 91天美| 97免费在线观看| 欧美 亚洲精品首页| 欧美瑟综合| 欧美日韩国产精品久久色婷婷| 久久久久国产| 96久久久精品| 91AV天美在线视频| 91精品免费| 九一国产精品| 97人人色| 哈哈操电影| 精品在线蜜臀| 9色国产精品一区粉嫩| 成人性爱免费播放| 免费观看性欧美一级| 亚洲精品毛片在线观看| 精品人妻一区| 黄色高清无码无码破解免费暗网| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美顶级黄片AAAAA在线免费看| 天天操天天舔| 99亚洲精品| 日韩伦理久 久久 清纯| 美女淫穴| 啊啊啊啊啊啊啊在线| 色综九九九一区| 91 丝袜在线播放| AVE乱伦| 九九干| 色婷婷导航| 操人妻丝袜高跟| 98精品国产乱码久久久久久| 国产精品在线一区二区| 欧美色97| 乱伦熟女论坛| 日韩一级成人毛片免费观看| 五月丁香激情综合| 亚洲欧美天堂在线| 青青草无码视频| 欧美美女视频| 国产一区免费午夜视频| 国产 丝袜 欧美中文 另类| 最新欧洲欧美日本激情网站| 青青草视频久久久久| 综合激情一一91| 久这精品中文在线观看视频| 日本高清免费一本视频在线观看| 日韩人妻 中文字幕| 五月丁香色婷婷| 91久久久视| 桑老女人九区| 日韩字幕一区| 999岛国大片| 天天综合欧美综合| 青青草色AV| 操逼日批| 男人天堂久久精品| 欧美少妇色综合| 精品九区| 日本www操操操| 美女啊啊啊啊啊啊啊| 国产久久久久影院老熟女| 69天堂| 国产亲戚伦亲在线| 久久e6只有精品| 精品国产乱码久久久久久久| 青娱乐老司机视频| 欧美亚洲日韩人妻在线观看| 久热久操| 国产一区二区三区高清视频| 国产97色在线| 另类 综合 日韩 欧美 亚洲| 亚洲欧美黄| aⅴ日韩成人电影av在线免费看av大全| 91女神在线视频| 99精品九九九九九九| 精品偷拍13p欧美dodk视频| 操人妻丝袜高跟| 九t超碰| 91精品无码人妻系列| 69视频福利导航| 偷拍综合网| 国产成人综合网| 欧美偷偷网| 欧美日韩激情无码专区| 青青草国产亚洲精品久久| 国产精品久久久久久久久久久久久久吹 | 男人的天堂 在线一区| 高清国产av无码| 日日日色色色色色| 嫩草在线视频| 成人日韩中文字幕| 曰韩人妻中文字幕在线| 五月激情综合网| 中韩中文字幕在线观看| 最近2019中文字幕国语免费版| 天天舔九色婷婷| 一个色导综合| 天天综合有色网| www久久国产精品| 人妻在线臀日韩| 亚洲综合九九| 亚洲综合网电影91| 欧美激情专区| 日韩pv中文| 蜜臀久久99精品久久久久久无删减 | 日韩三级视频一区二区三区| 天天影视91看看| 国产99 中文字幕日韩小视频| 日韩电影免费网站麻豆视频| 国产激情av女片自拍| 男人的天堂无码| 国产激情在线观看| 自拍啪啪视频| 亚洲综合五月天| 五十路三区在线| 成人AV素股で擦久久| 欧美18老人禁| 日韩精品9999| 欧美经典一区二区三区| 色在线69堂| 国产精品久久久久久久久AV大片| 蜜桃午夜视频一区二区| 久久久九九网站| 久久精品无码专区| 人妻碰碰碰碰碰碰| 一级性爱视频免费观看 | 国产无马视频| 欧美肥臀在线| 中文字幕五区| 日韩一级久久毛片| 都市激情人妻一区二区青青操视频 | 亚洲色图超碰在线| 久久精品国产亚洲AV清纯| 亚洲淫乱骚妇AV| 强奸乱伦资源| 另类欧美色| 91最新综合| 午夜理论片在线观看免费| 男人天堂毛片| 蜜臀av中字字幕网站| 久久无码成人| 5252色欧美在线男人的天堂| 草草影院在线视频| 天天干天天燥| 亚洲图片 欧美电影| 久久大香蕉手机高清| 操逼天美3区| 青青青在线高清视频在线一二三四区 | 中文一区在线日| 超碰在线91| 欧洲亚洲国产综合在线| 欧美洲精品一级| 91九久| 午夜寂寞欧美| 久久久精品| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 爱射综合| 午夜精品五区| 欧美AB在线| 99热日| 小草精彩毛片| 岛园激情| 亚洲欧洲中文日韩女优乱码| 97国产中文| 日日橹狠狠爱欧美超碰| 久热婷婷| 一级黄色性爱A级片| 97aiaiai| 婷婷探花久久精品一区| 中文字幕在线观看第二页| 国产乱人伦AVA麻豆软件.| 大学生美女口爆| 日本二区不卡| 亚洲欧美一区二区不卡视频播放| 欧美操逼一二三区| 十八禁成人网站在线观看| 尤物av网站免费在线播放| 亚洲熟女一区二区| 人人干人人搞人人摸| 老司机射| 免费家庭乱伦视频| 熟妇人妻精品一区二区| 91丨精品丨国产丨丝袜| 久久久啊啊| 色五月婷婷在线| 风流老熟女一区二区三区l| 精品国产av一区二区三区四区入口| 3级毛片一二| 97就爱干| av一区二区三区四区五区久草臀| 精品久久久久,69国产成人精| A片 AV一级在线播放观看免费 | 美国久久一二三四| 精品一区二区三区蜜桃臀赵总| 性爱乱伦网址| 中国大陆国产高清AⅤ毛片| 手机午夜电影神马久久| 嗯嗯啊啊好爽| 蜜桃久久一区二区| 亚州欧美在线| 久久中文字幕人妻熟av女蜜柚| 男人的天堂日本东京热| 97资源欧美| 美女久久久久久久| 夜夜嗨AV蜜臀av| 观看免费区二区三区二| 欧美嫩性色| 九九视品黄色| 九色 人妻 大香蕉| 国产农村妇女一区二区| 久久香蕉国产传媒一区剧情天美| 六月丁香啪啪| 日韩啪啪啪啪啪| 欧美午夜精品久久久久久3D| 午夜免费视频1000| 久久国产视频性吧| 嗯嗯啊操我| 五月天丁香欧洲日韩| 欧美综合骚| 97亚洲综合电影| 欧美内射少妇| 一级黄碟在线观看| 国产九区| 夜夜免费视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 狠狠狠一区二区三区| 在线观看十八禁| yirendaxiangjiashipin| 亚洲A色| 日本精品性生活久久久| 黄久在线| 午夜啊啊| 国产精品ww久久| 蜜乳AV.COM|