精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何優化前端性能?

開發 前端
隨著前端的范疇逐漸擴大,深度逐漸下沉,富前端必然帶來的一個問題就是性能。特別是在大型復雜項目中,重前端業務可能因為一個小小的數據依賴,導致整個頁面卡頓甚至崩潰。

 隨著前端的范疇逐漸擴大,深度逐漸下沉,富前端必然帶來的一個問題就是性能。特別是在大型復雜項目中,重前端業務可能因為一個小小的數據依賴,導致整個頁面卡頓甚至崩潰。本文基于Quick BI(數據可視化分析平臺)歷年架構變遷中性能的排查、解決和總結出的“個性”問題,嘗試總結整個前端層面相對“共性”的問題,提供一些前端性能解決思路。

[[346642]]

一 引發性能問題原因?

引發性能問題的原因通常不是單方面緣由,特別是大型系統迭代多年后,長期積勞成疾造成,所以我們要必要分析找到癥結所在,并按瓶頸優先級逐個擊破,拿我們項目為例,大概分幾個方面:

1 資源包過大

通過Chrome DevTools的Network標簽,我們可以拿到頁面實際拉取的資源大小(如下圖):

 

 

 

 

 

經過前端高速發展,近幾年項目更新迭代,前端構建產物也在急劇增大,因為要業務先行,很多同學引入庫和編碼過程并沒有考慮性能問題,導致構建的包增至幾十MB,這樣帶來兩個顯著的問題:

  • 弱(普通)網絡下,首屏資源下載耗時長
  • 資源解壓解析執行慢

對于第一個問題,基本上會影響所有移動端用戶,并且會耗費大量不必要的用戶帶寬,對客戶是一個經濟上的隱式損失和體驗損失。

對于第二個問題,會影響所有用戶,用戶可能因為等待時間過長而放棄使用。

下圖展示了延遲與用戶反應:

 

 

 

 

 

2 代碼耗時長

在代碼執行層面,項目迭代中引發的性能問題普遍是因為開發人員編碼質量導致,大概以下幾個緣由:

不必要的數據流監聽

此場景在hooks+redux的場景下會更容易出現,如下代碼:

 

  1. const FooComponent = () => { 
  2.   const data = useSelector(state => state.fullData); 
  3.   return <Bar baz={data.bar.baz} />; 
  4. }; 

假設fullData是頻繁變更的大對象,雖然FooComponent僅依賴其.bar.baz屬性,fullData每次變更也會導致Foo重新渲染。

雙刃劍cloneDeep

相信很多同學在項目中都有cloneDeep的經歷,或多或少,特別是迭代多年的項目,其中難免有mutable型數據處理邏輯或業務層面依賴,需要用到cloneDeep,但此方法本身存在很大性能陷阱,如下:

 

  1. // a.tsx 
  2. export const a = { 
  3.     name'a'
  4. }; 
  5. // b.tsx 
  6. import { a } = b; 
  7. saveData(_.cloneDeep(a)); // 假設需要克隆后落庫到后端數據庫 

上方代碼正常迭代中是沒有問題的,但假設哪天 a 需要擴展一個屬性,保存一個ReactNode的引用,那么執行到b.tsx時,瀏覽器可能直接崩潰!

Hooks之Memo

hooks的發布,給react開發帶來了更高的自由度,同時也帶來了容易忽略的質量問題,由于不再有類中明碼標價的生命周期概念,組件狀態需要開發人員自由控制,所以開發過程中務必懂得react對hooks組件的渲染機制,如下代碼可優化的地方:

 

  1. const Foo = () => { // 1. Foo可用React.memo,避免無props變更時渲染 
  2.     const result = calc(); // 2. 組件內不可使用直接執行的邏輯,需要用useEffect等封裝 
  3.     return <Bar result={result} />; // 3.render處可用React.useMemo,僅對必要的數據依賴作渲染 
  4. }; 

Immutable Deep Set

在使用數據流的過程中,很大程度我們會依賴lodash/fp的函數來實現immutable變更,但fp.defaultsDeep系列函數有個弊端,其實現邏輯相當于對原對象作深度克隆后執行fp.set,可能帶來一些性能問題,并且導致原對象所有層級屬性都被變更,如下:

 

  1. const a = { b: { c: { d: 123 }, c2: { d2: 321 } } }; 
  2. const merged = fp.defaultsDeep({ b: { c3: 3 } }, a); 
  3. console.log(merged.b.c === a.b.c); // 打印 false 

3 排查路徑

對于這些問題來源,通過Chrome DevTools的Performance火焰圖,我們可以很清晰地了解整個頁面加載和渲染流程各個環節的耗時和卡頓點(如下圖):

 

 

 

 

當我們鎖定一個耗時較長的環節,就可以再通過矩陣樹圖往下深入(下圖),找到具體耗時較長的函數。

 

 

 

 

誠然,通常我們不會直接找到某個單點函數占用耗時非常長,而基本是每個N毫秒函數疊加執行成百上千次導致卡頓。所以這塊結合react調試插件的Profile可以很好地幫助定位渲染問題所在:

 

 

 

 

如圖react組件被渲染的次數以及其渲染時長一目了然。

二 如何解決性能問題?

1 資源包分析

作為一名有性能sense的開發者,有必要對自己構建的產物內容保持敏感,這里我們使用到webpack提供的stats來作產物分析。

首先執行 webpack --profile --json > ./build/stats.json 得到 webpack的包依賴分析數據,接著使用 webpack-bundle-analyzer ./build/stats.json 即可在瀏覽器看到一張構建大圖(不同項目產物不同,下圖僅作舉例):

 

 

 

 

當然,還有一種直觀的方式,可以采用Chrome的Coverage功能來輔助判定哪些代碼被使用(如下圖):

 

 

 

 

紅色表示未執行過的代碼

最佳構建方式

通常來講,我們組織構建包的基本思路是:

  • 按entry入口構建。
  • 一個或多個共享包供多entry使用。

而基于復雜業務場景的思路是:

  • entry入口輕量化。
  • 共享代碼以chunk方式自動生成,并建立依賴關系。
  • 大資源包動態導入(異步import)。

webpack 4中提供了新的插件 splitChunks 來解決代碼分離優化的問題,它的默認配置如下:

 

  1. module.exports = { 
  2.     //... 
  3.     optimization: { 
  4.         splitChunks: { 
  5.             chunks: 'async'
  6.             minSize: 20000, 
  7.             minRemainingSize: 0, 
  8.             maxSize: 0, 
  9.             minChunks: 1, 
  10.             maxAsyncRequests: 30, 
  11.             maxInitialRequests: 30, 
  12.             automaticNameDelimiter: '~'
  13.             enforceSizeThreshold: 50000, 
  14.             cacheGroups: { 
  15.                 defaultVendors: { 
  16.                     test: /[\\/]node_modules[\\/]/, 
  17.                     priority: -10 
  18.                 }, 
  19.                 default: { 
  20.                     minChunks: 2, 
  21.                     priority: -20, 
  22.                     reuseExistingChunk: true 
  23.                 } 
  24.             } 
  25.         } 
  26.     } 
  27. }; 

根據上述配置,其分離chunk的依據有以下幾點:

  • 模塊被共享或模塊來自于node_modules。
  • chunk必須大于20kb。
  • 同一時間并行加載的chunk或初始包不得超過30。

理論上webpack默認的代碼分離配置已經是最佳方式,但如果項目復雜或耦合程度較深,仍然需要我們根據實際構建產物大圖情況,調整我們的chunk split配置。

解決TreeShaking失效

“你項目中有60%以上的代碼并沒有被使用到!”

treeshaking的初衷便是解決上面一句話中的問題,將未使用的代碼移除。

webpack默認生產模式下會開啟treeshaking,通過上述的構建配置,理論上應該達到一種效果“沒有被使用到的代碼不應該被打入包中”,而現實是“你認為沒有被使用的代碼,全部被打入Initial包中”,這個問題通常會在復雜項目中出現,其緣由就是代碼副作用(code effects)。由于webpack無法判定某些代碼是否“需要產生副作用”,所以會將此類代碼打入包中(如下圖):

 

 

 

 

所以,你需要明確知道你的代碼是否有副作用,通過這句話判定:“關于‘副作用’的定義是,在導入時會執行特殊行為的代碼(修改全局對象、立即執行的代碼等),而不是僅僅暴露一個 export 或多個 export。舉例說明,例如 polyfill,它影響全局作用域,并且通常不提供 export。”

對此,解決方法就是告訴webpack我的代碼沒有副作用,沒有被引入的情況下可以直接移除,告知的方式即:

  • 在package.json中標記sideEffects為false。
  • 或 在webpack配置中 module.rules 添加sideEffects過濾。

模塊規范

由此,要使得構建產物達到最佳效果,我們在編碼過程中約定了以下幾點模塊規范:

  • [必須] 模塊務必es6 module化(即export 和 import)。
  • [必須] 三方包或數據文件(如地圖數據、demo數據)超過 400KB 必須動態按需加載(異步import)。
  • [禁止] 禁止使用export * as方式輸出(可能導致tree-shaking失效并且難以追溯)。
  • [推薦] 盡可能引入包中具體文件,避免直接引入整個包(如:import { Toolbar } from '@alife/foo/bar')。
  • [必須] 依賴的三方包必須在package.json中標記為sideEffects: false(或在webpack配置中標記)。

2 Mutable數據

基本上通過Performance和React插件提供的調試能力,我們基本可以定位問題所在。但對于mutable型的數據變更,我這里也結合實踐給出一些非標準調試方式:

凍結定位法

眾所周知,數據流思想的產生緣由之一就是避免mutable數據無法追溯的問題(因為你無法知道是哪段代碼改了數據),而很多項目中避免不了mutable數據更改,此方法就是為了解決一個棘手的mutable數據變更問題而想出的方法,這里我暫時命名為“凍結定位法”,因為原理就是使用凍結方式定位mutable變更問題,使用相當tricky:

 

  1. constob j= { 
  2.     prop: 42 
  3. }; 
  4.  
  5. Object.freeze(obj); 
  6.  
  7. obj.prop=33; // Throws an error in strict mode 

Mutable追溯

此方法也是為了解決mutable變更引發數據不確定性變更問題,用于實現排查的幾個目的:

  • 屬性在什么地方被讀取。
  • 屬性在什么地方被變更。
  • 屬性對應的訪問鏈路是什么。

如下示例,對于一個對象的深度變更或訪問,使用 watchObject 之后,不管在哪里設置其屬性的任何層級,都可以輸出變更相關的信息(stack內容、變更內容等):

 

  1. const a = { b: { c: { d: 123 } } }; 
  2. watchObject(a); 
  3. const c =a.b.c; 
  4. c.d =0; // Print: Modify: "a.b.c.d" 

watchObject 的原理即對一個對象進行深度 Proxy 封裝,從而攔截get/set權限,詳細可參考: https://gist.github.com/wilsoncook/68d0b540a0fea24495d83fc284da9f4b

避免Mutable

通常像react這種技術棧,都會配套使用相應的數據流方案,其與mutable是天然對立的,所以在編碼過程中應該盡可能避免mutable數據,或者將兩者從設計上分離(不同store),否則出現不可預料問題且難以調試

3 計算&渲染

最小化數據依賴

在項目組件爆炸式增長的情況下,數據流store內容層級也逐漸變深,很多組件依賴某個屬性觸發渲染,這個依賴項需要盡可能在設計時遵循最小化原則,避免像上方所述,依賴一個大的屬性導致頻繁渲染。

合理利用緩存

(1)計算結果

在一些必要的cpu密集型計算邏輯中,務必采用 WeakMap 等緩存機制,存儲當前計算終態結果或中間狀態。

(2)組件狀態

對于像hooks型組件,有必要遵循以下兩個原則:

  • 盡可能memo耗時邏輯。
  • 無多余memo依賴項。

避免cpu密集型函數

某些工具類函數,其復雜度跟隨入參的量級上升,而另外一些本身就會耗費大量cpu時間。針對這類型的工具,要盡量避免使用,若無法避免,也可通過 “控制入參內容(白名單)” 及 “異步線程(webworker等)”方式做到嚴控。

比如針對 _.cloneDeep ,若無法避免,則要控制其入參屬性中不得有引用之類的大型數據。

另外像最上面描述的immutable數據深度merge的問題,也應該盡可能控制入參,或者也可參考使用自研的immutable實現:https://gist.github.com/wilsoncook/fcc830e5fa87afbf876696bf7a7f6bb1

 

  1. const a = { b: { c: { d: 123 }, c2: { d2: 321 } } }; 
  2. const merged = immutableDefaultsDeep(a, { b: { c3: 3 } }); 
  3. console.log(merged === a); // 打印 false 
  4. console.log(merged.b.c === a.b.c); // 打印 true 

三 寫在最后

以上,總結了Quick BI性能優化過程中的部分心得和經驗,性能是每個開發者不可繞過的話題,我們的每段代碼,都對標著產品的健康度。

責任編輯:華軒 來源: 阿里技術
相關推薦

2020-10-16 10:40:39

前端性能可視化

2022-11-16 12:03:13

性能優化前端

2022-05-17 09:02:30

前端性能優化

2019-11-01 14:00:58

前端性能優化代碼

2021-05-31 08:30:50

監控網站性能

2022-03-02 11:13:50

Web前端開發

2021-07-05 14:55:28

前端優化圖片

2023-04-10 11:18:38

前端性能優化

2021-02-02 13:45:31

Vue代碼前端

2012-01-10 16:22:25

Web

2013-01-22 15:27:23

WebWeb前端

2020-03-09 16:43:06

腳本語言瀏覽器JavaScript

2022-01-09 16:45:36

前端性能優化編程

2023-10-18 10:38:53

API

2022-09-13 12:56:28

前端優化

2020-08-24 07:12:17

前端CRP性能優化

2023-12-14 17:21:28

前端性能優化

2020-03-31 14:16:25

前端性能優化HTTP

2019-07-29 10:39:39

前端性能優化緩存

2011-03-01 17:26:48

WLAN優化
點贊
收藏

51CTO技術棧公眾號

亚洲国产欧美日韩| 国产91精品久久久久久| 中文字幕第三区| 国产盗摄一区二区| 国产午夜久久久久| 91丨九色丨国产| 中文字幕在线欧美| 亚洲精品成人无限看| 亚洲精品福利视频| 亚洲第一天堂久久| 在线观看v片| 亚洲女与黑人做爰| 欧美日韩系列| www日本高清| 奇米色777欧美一区二区| 欧美国产亚洲视频| 手机毛片在线观看| 久久aimee| 在线综合+亚洲+欧美中文字幕| 波多野结衣综合网| 日本免费视频在线观看| 91捆绑美女网站| av激情久久| 亚洲天堂手机在线| 亚洲视频二区| 九九热精品在线| 午夜影院黄色片| 欧美亚视频在线中文字幕免费| 欧美男人的天堂一二区| 国产主播在线看| 麻豆av在线播放| 中文字幕亚洲一区二区av在线| 精品日本一区二区三区在线观看| 国产乱人乱偷精品视频| 日本亚洲欧美天堂免费| 国产91精品久久久| 日韩久久精品视频| 欧美先锋影音| 欧美第一黄网免费网站| 一级片一级片一级片| 成人三级视频| 欲色天天网综合久久| 三级黄色片网站| 国产91精品入| 亚洲第一精品夜夜躁人人躁 | 欧美黄色aaa| 久久在线视频| 中文字幕精品一区二区精品| 成人午夜剧场视频网站| 精品在线手机视频| 亚洲毛片在线观看| 国产精品无码午夜福利| 国产精品17p| 亚洲第一精品自拍| aaaa黄色片| 日韩av字幕| 日韩高清a**址| 中文字幕丰满乱子伦无码专区| 日韩av中文字幕一区| 日韩精品视频免费| 久久久久久九九九九九| 波多野结衣在线播放一区| 夜夜嗨av色一区二区不卡| 级毛片内射视频| 成人av国产| 精品国产一区av| 国产精品久久久精品四季影院| 伊人色**天天综合婷婷| 欧美精品在线网站| 日本免费一二三区| 一区二区三区成人精品| 国产精品福利观看| 在线观看中文字幕av| 国产综合色在线视频区| 99精品在线直播| 日韩午夜影院| 欧美韩国日本不卡| 欧美交换配乱吟粗大25p| 国产丝袜在线播放| 在线观看日韩电影| 日韩高清在线一区二区| 精品三级av在线导航| 国产婷婷色综合av蜜臀av | 亚洲免费毛片网站| 青青艹视频在线| abab456成人免费网址| 91精品国产手机| 97香蕉碰碰人妻国产欧美| 国产一区二区三区四区| 欧美人与物videos| 精品视频一二三区| 国产河南妇女毛片精品久久久| 91免费看蜜桃| 久青草国产在线| 亚洲欧美日韩在线| 国产一区亚洲二区三区| 蜜桃在线一区| 亚洲欧美日韩天堂一区二区| 欧美日韩色视频| 香蕉久久久久久久av网站| 92看片淫黄大片欧美看国产片 | 国产精品免费精品自在线观看| 精品国产欧美一区二区| 99在线视频免费| 亚洲国产免费看| 国产日韩欧美黄色| 日本福利午夜视频在线| 一区二区三区在线看| 可以在线看的黄色网址| 亚洲国产欧美国产第一区| 国产亚洲精品久久久久久777| 国产亚洲自拍av| 久久精品久久99精品久久| 精品1区2区| 中中文字幕av在线| 欧美三级资源在线| 国产福利短视频| 欧美在线首页| 国产一区视频在线| 经典三级在线| 精品国产91久久久| 中文字幕乱妇无码av在线| 成人免费电影网址| 国产91精品最新在线播放| 色噜噜一区二区三区| 一区二区三区四区激情| 中文字幕在线综合| 少妇一区二区视频| 97国产精品视频| 亚洲精品久久久久avwww潮水| 国产精品成人在线观看| 欧美大尺度做爰床戏| 日韩电影不卡一区| 韩剧1988在线观看免费完整版| 国产精品午夜福利| 中文字幕视频一区二区三区久| 熟女少妇精品一区二区| 亚洲欧洲免费| 欧美一级淫片播放口| 婷婷在线免费观看| 亚洲午夜免费福利视频| 一区二区三区人妻| 欧美视频不卡| 97av自拍| 超碰在线97国产| 精品国产乱码久久久久久蜜臀 | 性xx色xx综合久久久xx| 久久久亚洲综合网站| 久热在线观看视频| 日韩电影免费在线观看中文字幕 | 免费视频一区| 另类欧美小说| 人人鲁人人莫人人爱精品| 亚洲精品小视频在线观看| 国产成人免费看| 91免费视频大全| 黄色片久久久久| 精品国产一区二区三区四区| 国产国产精品人在线视| 97超碰国产一区二区三区| 欧美色手机在线观看| 国精产品视频一二二区| 国产在线播精品第三| 喜爱夜蒲2在线| h视频久久久| 欧美在线视频观看| 成人免费在线电影| 欧美日韩成人在线一区| 人妻久久一区二区| 成人国产精品免费网站| 欧美 日韩精品| 日韩一区电影| 91精品久久香蕉国产线看观看 | 国产精品日韩一区| 国产视频在线播放| 亚洲国产毛片完整版| 日韩久久中文字幕| 国产精品美女久久久久久久| 亚洲丝袜在线观看| 性感少妇一区| 一区二区三区观看| 丁香婷婷成人| 国产精品成人v| 中文字幕在线观看网站| 国产丝袜精品视频| 99久久一区二区| 天天色图综合网| 国产3级在线观看| 成av人片一区二区| 国产美女18xxxx免费视频| 国产精品a级| 视频在线99| 老牛国内精品亚洲成av人片| 国产精自产拍久久久久久蜜| 超碰中文在线| 精品国产一区av| 免费福利在线观看| 欧美成人精品二区三区99精品| 亚洲婷婷综合网| 亚洲最大成人综合| 亚洲色图 激情小说| av不卡在线播放| 在线看免费毛片| 视频一区二区不卡| 久久综合久久网| 国产精品二区不卡| 免费一区二区三区| 国产精品18hdxxxⅹ在线| 国产欧美精品日韩精品| 成人欧美大片| 色综合久久久久久中文网| 在线观看av的网站| 日韩精品极品在线观看播放免费视频 | av国产在线观看| 亚洲免费小视频| 风流少妇一区二区三区91| 欧美军同video69gay| 一级做a爰片久久毛片| 亚洲在线一区二区三区| 成人黄色短视频| 国产日产欧美一区| 精品久久久久久中文字幕人妻最新| 国产一区二区伦理| 男女男精品视频站| 日精品一区二区| 欧美极品欧美精品欧美| 激情久久中文字幕| 黄色一级视频播放| 天堂美国久久| 亚洲aⅴ天堂av在线电影软件| 羞羞色国产精品网站| 国产一区福利视频| 国产精品毛片久久久| 91色视频在线导航| 国产精品1区| 亚洲aⅴ日韩av电影在线观看| 成人mm视频在线观看| 国产精品久久久999| 欧美人与性动交xxⅹxx| 日本欧美中文字幕| 波多野结衣亚洲| 青青草原成人在线视频| 成人福利av| 日本久久精品视频| 日韩电影大全网站| 国产精品成av人在线视午夜片| 日韩精品麻豆| 国产精品久久久久一区二区| xxxxx.日韩| 国产视频福利一区| vam成人资源在线观看| 91久久久久久久久久久久久| 高清不卡一区| 91在线在线观看| 牛牛影视一区二区三区免费看| 国产欧美日韩伦理| 国产成人调教视频在线观看| 日本在线播放不卡| 婷婷亚洲五月色综合| 美国av在线播放| 狠狠噜噜久久| av免费播放网址| 全国精品久久少妇| 思思久久精品视频| 国产成人免费视| 亚洲欧美在线不卡| 久久久91精品国产一区二区精品 | 日本五十肥熟交尾| 91一区二区在线| 欧美18—19性高清hd4k| 国产精品麻豆99久久久久久| 91麻豆免费视频网站| 亚洲国产精品自拍| 日日夜夜狠狠操| 欧美日韩高清在线播放| 亚洲欧美另类日韩| 亚洲精品视频网上网址在线观看| av中文在线| 欧美大秀在线观看| 亚洲综合在线电影| 5g国产欧美日韩视频| 思热99re视热频这里只精品| 亚洲精品一区二区三区四区五区| 欧美xxx在线观看| 妺妺窝人体色www在线小说| 日本不卡视频一二三区| 日本wwwxx| 久久久高清一区二区三区| 久热这里有精品| 一本色道久久综合狠狠躁的推荐| 国产理论视频在线观看| 精品视频偷偷看在线观看| 暖暖日本在线观看| 欧美亚洲国产另类| 成人97精品毛片免费看| 久久本道综合色狠狠五月| 欧美国产一级| 男人天堂网视频| 国产精品亚洲一区二区三区在线| 蜜桃传媒一区二区亚洲av| 亚洲欧洲中文日韩久久av乱码| 毛片毛片女人毛片毛片| 日韩一区二区三区视频在线| 精品美女视频在线观看免费软件| 欧美日本高清视频| 成人交换视频| 久久精品日产第一区二区三区乱码 | 一区二区三区视频免费| 久草在线视频资源| 成人国产精品久久久久久亚洲| 色婷婷av一区二区三区丝袜美腿 | 亚洲欧美日韩国产综合精品二区 | 大陆极品少妇内射aaaaa| 国产在线日韩欧美| 中文字幕欧美激情极品| 黑丝美女久久久| 东京干手机福利视频| 在线成人中文字幕| 欧美黄色网页| 九九九九九精品| 在线成人亚洲| 国产精品二区视频| 亚洲男帅同性gay1069| 在线观看中文字幕av| 亚洲欧美资源在线| 色黄视频在线观看| 国产欧美韩日| 亚洲欧洲视频| 国产乱国产乱老熟300部视频| 中文字幕日本乱码精品影院| 伊人免费在线观看高清版| 亚洲深夜福利网站| 美女福利一区二区| 久久国产手机看片| 中文日韩在线| 色天使在线视频| 精品国产91久久久| 亚洲色图欧美视频| 69精品小视频| 青青一区二区| 免费在线激情视频| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲国产精品成人无久久精品| 亚洲大胆人体av| 手机在线观看av| 久久伊人一区| 日韩国产欧美在线视频| 亚洲一二三四视频| 7777精品伊人久久久大香线蕉超级流畅| 337p日本欧洲亚洲大胆鲁鲁| 国产免费亚洲高清| 亚洲第一偷拍| 男人添女人荫蒂国产| 亚洲国产成人高清精品| 五月婷婷狠狠干| 日本精品在线视频| 成人在线免费观看91| 日本免费色视频| 一卡二卡三卡日韩欧美| 欧美视频久久久| 欧美亚洲激情视频| 北条麻妃国产九九九精品小说 | 国色天香久久精品国产一区| 男同互操gay射视频在线看| 国产成a人亚洲| 天堂网av手机版| 伊人久久久久久久久久久久久 | 精品无人区一区二区三区竹菊| 国产精品久久国产愉拍| 蜜桃av乱码一区二区三区| 91精品欧美久久久久久动漫 | 亚洲国产成人精品女人| 黑森林av导航| 日本精品一级二级| 超碰在线caoporn| 久久久久久久久四区三区| 蜜桃视频在线一区| 国产十六处破外女视频| 精品视频—区二区三区免费| 免费成人高清在线视频| a级免费在线观看| 日本一二三不卡| 亚洲AV无码国产精品午夜字幕| 欧美中文字幕第一页| 天天色天天射综合网| 欧亚乱熟女一区二区在线| 欧美日韩一区二区三区在线看 | 99国产精品免费视频观看| 激情综合激情五月| 欧美性一区二区| 欧美aaaaaaa| 亚洲春色在线视频| 成人做爰69片免费看网站| 少妇一级淫片日本| 国内精品久久影院| 久久在线视频| 中文字幕高清视频| 欧美mv和日韩mv国产网站| jizzyou欧美16| 午夜精品久久久久久久无码|