国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

性能優(yōu)化竟白屏,難道真是我的鍋?

共 16515字,需瀏覽 34分鐘

 ·

2021-08-10 12:37

項(xiàng)目日漸“強(qiáng)壯”,性能優(yōu)化方法之一是采用 React 框架提供的 Reat.lazy() 按需加載的方式,測(cè)試過(guò)程中,QA說(shuō)我的優(yōu)化代碼導(dǎo)致了白屏,且看我如何狡辯~

隨著項(xiàng)目日漸“強(qiáng)壯”,優(yōu)化首屏加載渲染速度迫在眉睫,其中就采用了 React 框架提供的 Reat.lazy() 按需加載的方式,測(cè)試過(guò)程中,在我們的埋點(diǎn)監(jiān)控平臺(tái)上,發(fā)現(xiàn)了很多網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤的日志,大部分來(lái)自分包資源下載失敗!難道我的優(yōu)化變成負(fù)優(yōu)化了???

通過(guò)我們的統(tǒng)計(jì)平臺(tái)量化數(shù)據(jù)可知,用戶(hù)網(wǎng)絡(luò)加載失敗的概率還是比較大,實(shí)驗(yàn)發(fā)現(xiàn),沒(méi)法兒使用 try{}catch{} 捕獲組件渲染錯(cuò)誤,查詢(xún)官方文檔,有一個(gè) Error Boundaries 的組件引入眼簾,提供了解決方法,那我們拿到了 demo 應(yīng)該怎么完善并應(yīng)用到我們的項(xiàng)目中,以及如何解決按需加載組件失敗的場(chǎng)景。

一、背景

某天我在開(kāi)發(fā)了某個(gè)功能組件時(shí),發(fā)現(xiàn)這個(gè)組件引用了一個(gè)非常大的三方庫(kù),大概100kb,這么大,當(dāng)然得使用按需加載啦,當(dāng)我理所當(dāng)然地覺(jué)得這一手“按需加載”的優(yōu)化很穩(wěn),就交給測(cè)試同學(xué)測(cè)試了。

沒(méi)過(guò)多久測(cè)試同學(xué)反饋,你這個(gè)功能咋老白屏?—— 怎么可能?我的代碼不可能有BUG!

來(lái)到“事故現(xiàn)場(chǎng)”,稍加思索,打開(kāi)瀏覽器控制臺(tái),發(fā)現(xiàn)按需加載的遠(yuǎn)程文件下載失敗了。

emmm~,繼續(xù)狡辯,這肯定是公司基建不行啊,網(wǎng)絡(luò)這么不穩(wěn),這鍋我不背!雖然極力狡辯,可是測(cè)試同學(xué)就不相信,就認(rèn)定了是我的問(wèn)題...

凡事講證據(jù),冷靜下來(lái)想一想,萬(wàn)一真的是我的問(wèn)題,豈不是很尷尬?

為了挽回局面,于是強(qiáng)裝鎮(zhèn)定說(shuō)到:“這個(gè)問(wèn)題是網(wǎng)絡(luò)波動(dòng)導(dǎo)致,雖然咱們的基建環(huán)境不太好,但是為了盡可能提升用戶(hù)體驗(yàn),我這嘗試下看看如何優(yōu)化,可通過(guò)增加錯(cuò)誤監(jiān)控重試機(jī)制,增強(qiáng)用戶(hù)體驗(yàn),追求極致!”,趕緊溜回去看看咋解決吧...

一、Error Boundaries

React官方對(duì)于“Error Boundaries”的介紹:https://reactjs.org/docs/error-boundaries.html

A JavaScript error in a part of the UI shouldn’t break the whole app. To solve this problem for React users, React 16 introduces a new concept of an “error boundary”.

簡(jiǎn)單翻譯,在 UI 渲染中發(fā)生的錯(cuò)誤不應(yīng)該阻塞整個(gè)應(yīng)用的運(yùn)行,為此,React 16 中提供了一種新的概念“錯(cuò)誤邊界”。

也就是說(shuō),我們可以用“錯(cuò)誤邊界”來(lái)優(yōu)雅地處理 React 中的 UI 渲染錯(cuò)誤問(wèn)題。

React 中的懶加載使用Suspense包裹,其下的子節(jié)點(diǎn)發(fā)生了渲染錯(cuò)誤,也就是下載組件文件失敗,并不會(huì)拋出異常,也沒(méi)法兒捕獲錯(cuò)誤,那么用 ErrorBoundary 就正好可以決定再子節(jié)點(diǎn)發(fā)生渲染錯(cuò)誤(常見(jiàn)于白屏)時(shí)候的處理方式。

注意:Error boundaries 不能捕獲如下類(lèi)型的錯(cuò)誤:

  • 事件處理(了解更多)
  • 異步代碼 (例如 setTimeout 或 requestAnimationFrame 回調(diào))
  • 服務(wù)端渲染
  • 來(lái)自ErrorBoundary組件本身的錯(cuò)誤 (而不是來(lái)自它包裹子節(jié)點(diǎn)發(fā)生的錯(cuò)誤)

二、借鑒

老夫作為“CV工程師”,自然是信手拈來(lái):

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasErrorfalse };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasErrortrue };
  }

  componentDidCatch(error, errorInfo) {
    // You can also log the error to an error reporting service
    logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children; 
  }
}

使用方法:

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>
  • static getDerivedStateFromError(error):在 render phase 階段,子節(jié)點(diǎn)發(fā)生UI渲染拋出錯(cuò)誤時(shí)候執(zhí)行,return 的 {hasError: true} 用于更新 state 中的值,不允許包含副作用的代碼,觸發(fā)重新渲染(渲染fallback UI)內(nèi)容。
  • componentDidCatch(error, errorInfo):在commit phase 階段,捕獲子節(jié)點(diǎn)中發(fā)生的錯(cuò)誤,因此在該方法中可以執(zhí)行有副作用的代碼,例如用于打印上報(bào)錯(cuò)誤日志。

官方案例在線演示地址:https://codepen.io/gaearon/pen/wqvxGa?editors=0010

與此同時(shí)官方的建議:

In the event of an error, you can render a fallback UI with componentDidCatch() by calling setState, but this will be deprecated in a future release. Use static getDerivedStateFromError() to handle fallback rendering instead.

推薦大家在 getDerivedStateFromError() 中處理 fallback UI,而不是在 componentDidCatch() 方法中,componentDidCatch() 在未來(lái)的 React 版本中可能會(huì)被廢棄,當(dāng)然只是推薦,僅供參考。

三、修飾

官方的 demo 組件如果要嵌入業(yè)務(wù)代碼中,還是有一些簡(jiǎn)陋,為了更好地適應(yīng)業(yè)務(wù)代碼以及更加通用,我們一步步來(lái)改造。

3.1 支持自定義fallback以及error callback

目標(biāo):滿(mǎn)足些場(chǎng)景下,開(kāi)發(fā)者需要自行設(shè)置 fallback 的UI,以及自定義錯(cuò)誤處理回調(diào)

實(shí)現(xiàn)也非常簡(jiǎn)單,基于 TypeScript,再加上一些類(lèi)型聲明,一個(gè)支持自定義fallback 和錯(cuò)誤回調(diào)的 ErrorBoundary 就OK了!

type IProps = {
  fallback?: ReactNode | null;
  onError?: () => void;
  children: ReactNode;
};

type IState = {
  isShowErrorComponent: boolean;
};

class LegoErrorBoundary extends React.Component<IProps, IState> {
  static getDerivedStateFromError(error: Error) {
    return { isShowErrorComponent: true };
  }

  constructor(props: IProps | Readonly<IProps>) {
    super(props);
    this.state = { isShowErrorComponent: false };
  }

  componentDidCatch(error: Error) {
    this.props.onError?.();
  }

  render() {
    const { fallback, children } = this.props;
    if (this.state.isShowErrorComponent) {
      if (fallback) {
        return fallback;
      }
      return <>加載失敗,請(qǐng)刷新重試!</>;
    }
    return children;
  }
}

export default LegoErrorBoundary;

3.2 支持錯(cuò)誤手動(dòng)重試

我們的按需加載組件就像局部組件更新一樣,當(dāng)組件按需加載的渲染失敗時(shí)候,理論上我們應(yīng)該給用戶(hù)提供手動(dòng)/自動(dòng)重試機(jī)制

手動(dòng)重試機(jī)制,簡(jiǎn)單的做法就是,在 fallback UI 中設(shè)置重試按鈕

  static getDerivedStateFromError(error: Error) {
    return { isShowErrorComponent: true };
  }

  constructor(props) {
    super(props);
    this.state = { isShowErrorComponent: false };
+   this.handleRetryClick = this.handleRetryClick.bind(this);
  }
    
+ handleRetryClick() {
+  this.setState({
+    isShowErrorComponent: false,
+  });
+ }

 render() {
  const { fallback, children } = this.props;
  if (this.state.isShowErrorComponent) {
    if (fallback) {
      return fallback;
    }
+    return (
+       <div>
+        {/* CSS重置下按鈕樣式 */}
+        <button className="error-retry-btn" onClick={this.handleRetryClick}>
+          渲染錯(cuò)誤,請(qǐng)點(diǎn)擊重試!
+        </button>
+      </div>
+    );
   }
   return children;
 }

寫(xiě)一個(gè)普通的Counter(計(jì)數(shù)器)組件:

import React, { useState } from 'react';

const Counter = (props) => {
    const [count, setCount] = useState(0);

    const handleCounterClick = () => {
        setCount(count+1);
    }

    const thr = () => {
        throw new Error('render error')
    }

    return (
        <div>
            {count === 3 ?  thr() : ''}
            計(jì)數(shù)器:{count}
            <br/>
            <button onClick={handleCounterClick}>點(diǎn)擊+1</button>
        </div>

    )
}

export default Counter;

我們使用這個(gè) LegoErrorBoundary 組件包裹 Counter 計(jì)數(shù)器組件,Counter 組件中在第三次點(diǎn)擊時(shí)候拋出一個(gè)異常,來(lái)看看 ErrorBoundary 的捕獲處理情況!

表現(xiàn)效果:

如果咱不處理這個(gè)錯(cuò)誤,就會(huì)導(dǎo)致“白屏”,也不利于研發(fā)同學(xué)排查問(wèn)題,特別是涉及到一些異步渲染的問(wèn)題。

3.3 支持發(fā)生錯(cuò)誤自動(dòng)重試渲染有限次數(shù)

手動(dòng)重試,會(huì)增加用戶(hù)的一個(gè)操作,這會(huì)增加用戶(hù)的操作成本,為了更加便捷用戶(hù)使用軟件,提升用戶(hù)體驗(yàn),來(lái)瞅瞅采用自動(dòng)重試有限次數(shù)的機(jī)制應(yīng)該如何實(shí)現(xiàn)。

實(shí)現(xiàn)思路:

重試次數(shù)統(tǒng)計(jì)變量:retryCount,記錄重試渲染次數(shù),超過(guò)次數(shù)則使用兜底渲染“錯(cuò)誤提示”UI。

改造如下:

type IState = {
  isShowErrorComponent: boolean;
+ retryCount: number;
};

class LegoErrorBoundary extends React.Component<IProps, IState> {
-  static getDerivedStateFromError(error: Error) {
-    return { isShowErrorComponent: true };
-  }
  
  constructor(props: IProps | Readonly<IProps>) {
    super(props);
+   this.state = { isShowErrorComponent: false, retryCount: 0 };
+  this.handleErrorRetryClick = this.handleErrorRetryClick.bind(this);
  }

  componentDidCatch(error: Error) {
+  if (this.state.retryCount > 2) {
+      this.setState({
+        isShowErrorComponent: true,
+      })
+    } else {
+      this.setState({
+        retryCount: this.state.retryCount + 1,
+      });
+    }
  }

  render() {
    const { fallback, children } = this.props;
    if (this.state.isShowErrorComponent) {
      if (fallback) {
        return fallback;
      }
+      return <>重試3次后,展示兜底錯(cuò)誤提示!</>;
    }
    return children;
  }
}

export default LegoErrorBoundary;

來(lái)看看效果:

自動(dòng)重試3次

改改Counter組件的代碼,看看能否處理好異步錯(cuò)誤的問(wèn)題:

import React, { useEffect, useState } from 'react';

const Counter = (props) => {
  const [count, setCount] = useState(0);

  const handleCounterClick = () => {
    setCount(count + 1);
  }

  const thr = () => {
    throw new Error('render error')
  }

  useEffect(() => {
    setTimeout(() => {
      setCount(3)
    }, 1000);
  }, []);

  return (
    <div>
      { count === 3 ? thr() : '' }
      計(jì)數(shù)器:{ count }
      <br />
      <button onClick={ handleCounterClick }>點(diǎn)擊+1</button>
    </div>
  )
}

export default Counter;

表現(xiàn):

處理異步發(fā)生的錯(cuò)誤

也是OK的!這說(shuō)明,屬于業(yè)務(wù)邏輯的代碼比如:網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求、異步執(zhí)行導(dǎo)致渲染出錯(cuò)的情況,“錯(cuò)誤邊界”組件都是可以攔截并處理。

當(dāng)前結(jié)論:使用 Errorboundary 組件包裹,能夠 handle 住子組件發(fā)生的渲染 error。

四、異步加載組件網(wǎng)絡(luò)錯(cuò)誤

4.1 嘗試處理

App.js 中的 Counter 組件引用改為按需加載,然后在瀏覽器中模擬分包的組件下載失敗情況,看看是否能夠攔??!

const LazyCounter = React.lazy(() => import('./components/counter/index'));

function App({
  return (
    <div className="App">
      <header className="App-header">
        <img src={ logo } className="App-logo" alt="logo" />
        <ErrorBoundary>
          <LazyCounter></LazyCounter>
        </ErrorBoundary>
      </header>
    </div>

  );
}

結(jié)果白屏了!也可以看到 ErrorBoundary 組件中打印了捕獲到的錯(cuò)誤信息:

ChunkLoadError: Loading chunk 3 failed.
(error: http://localhost:5000/static/js/3.18a27ea8.chunk.js)
at Function.a.e ((index):1)
at App.js:7
at T (react.production.min.js:18)
at Hu (react-dom.production.min.js:269)
at Pi (react-dom.production.min.js:250)
at xi (react-dom.production.min.js:250)
at _i (react-dom.production.min.js:250)
at vi (react-dom.production.min.js:243)
at fi (react-dom.production.min.js:237)
at Gi (react-dom.production.min.js:285)

攔截到了,但是沒(méi)有觸發(fā)3次重試,componentDidCatch 中的 console.log('發(fā)生錯(cuò)誤!', error); 只打印了一次錯(cuò)誤日志,就掛了,看到大家的推薦做法是,發(fā)生一次錯(cuò)誤就能夠處理到,所以嘗試把 retryCount0 的時(shí)候就設(shè)置 isShowErrorComponent 的值,

this.setState({
    isShowErrorComponenttrue,
})

這時(shí)能夠顯示錯(cuò)誤的fallback UI:

image

但沒(méi)法兒實(shí)現(xiàn)自動(dòng)重試有限次數(shù)異步組件的渲染,否則如果還按照之前的方案,就會(huì)繼續(xù)向上拋出錯(cuò)誤,如果沒(méi)有后續(xù) catch 處理錯(cuò)誤,頁(yè)面就會(huì)白屏!

然后嘗試主動(dòng)觸發(fā)重新渲染,發(fā)現(xiàn)并沒(méi)有發(fā)起二次請(qǐng)求,點(diǎn)擊重試只是捕獲到了錯(cuò)誤~

4.2 定位原因

不生效,于是想到聲明引入組件的代碼如下:

const LazyCounter = React.lazy(() => import('./components/counter/index'));

經(jīng)過(guò)測(cè)試驗(yàn)證,的確打印了錯(cuò)誤日志,而只發(fā)起了一次網(wǎng)絡(luò)請(qǐng)求的原因是,該 LazyCounter 組件并沒(méi)有在組件中聲明,重新渲染的時(shí)候,LazyCounter 組件作為組件外的全局變量,不受 rerender 影響。

4.3 解決方案

因此,想要解決網(wǎng)絡(luò)加載錯(cuò)誤問(wèn)題并重試,就得在聲明代碼 import 的時(shí)候處理,因?yàn)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(40, 202, 113);">import 返回的是一個(gè)Promise,自然就可以用 .catch 捕獲異常。

- const LazyCounter = React.lazy(() => import('./components/counter/index'));

+ const LazyCounter = React.lazy(() => import('./components/counter/index').catch(err => {
+   console.log('dyboy:', err);
+ }));

import() 代碼執(zhí)行的時(shí)候才會(huì)觸發(fā)網(wǎng)絡(luò)請(qǐng)求拉取分包資源文件,所以我們可以在異常捕獲中重試,并且可以重試一定次數(shù),所以需要實(shí)現(xiàn)一個(gè)工具函數(shù),統(tǒng)一處理 import() 動(dòng)態(tài)引入可能失敗的問(wèn)題。

該工具函數(shù)如下:

/**
 * 
 * @param {() => Promise} fn 需要重試執(zhí)行的函數(shù)
 * @param {number} retriesLeft 剩余重試次數(shù)
 * @param {number} interval 間隔重試請(qǐng)求時(shí)間,單位ms
 * @returns Promise<any>
 */

export const retryLoad = (fn, retriesLeft = 5, interval = 1000) => {
  return new Promise((resolve, reject) => {
    fn()
      .then(resolve)
      .catch(err => {
        setTimeout(() => {
          if (retriesLeft === 1) {
            // 遠(yuǎn)程上報(bào)錯(cuò)誤日志代碼
            reject(err);
            // coding...
            console.log(err)
            return;
          }
          retryLoad(fn, retriesLeft - 1, interval).then(resolve, reject);
        }, interval);
      });
  });
}

使用的時(shí)候只需要將 import() 包一下:

const LazyCounter = React.lazy(() => retryLoad(import('./components/counter/index')));

與此同時(shí),為了多次請(qǐng)求下,“錯(cuò)誤邊界”組件能夠捕獲到錯(cuò)誤,同時(shí)能夠觸發(fā)兜底渲染邏輯,把 ErrorBoundary 組件發(fā)生錯(cuò)誤時(shí)候直接處理展示兜底邏輯,不做重復(fù)渲染。則將 ErrorBoundary 中的重渲染計(jì)數(shù)邏輯代碼刪除即可。

componentDidCatch(error) {
  console.log('發(fā)生錯(cuò)誤!', error);
  this.setState({
    isShowErrorComponenttrue,
  });
}

另外,如果我們既想要渲染出錯(cuò)后的重試,還需要保證多次網(wǎng)絡(luò)出錯(cuò)后能有錯(cuò)誤上報(bào),那么只需要在 retryLoad 工具函數(shù)中增加錯(cuò)誤日志遠(yuǎn)程上報(bào)邏輯,然后不拋出 reject()。

4.4 表現(xiàn)效果

處理如下三種情況的效果:

  1. 正常按需加載組件成功
  2. 網(wǎng)絡(luò)原因一直下載失敗,展示兜底錯(cuò)誤
  3. 網(wǎng)絡(luò)原因,中途恢復(fù),展示正常功能

    錄制的GIf比較大,微信上無(wú)法展示,可點(diǎn)擊閱讀全文查看效果!

    當(dāng)我把網(wǎng)絡(luò)加載失敗后的處理結(jié)果給到QA同學(xué),QA同學(xué)贊許地說(shuō)道:“老哥,穩(wěn)!

五、總結(jié)

通過(guò)針對(duì)業(yè)務(wù)優(yōu)化場(chǎng)景中遇到的加載失敗問(wèn)題,嘗試借助 ErrorBoundary 以及 import() 網(wǎng)絡(luò)重試加載機(jī)制,保證了程序的健壯性,降低前端“白屏率”,換個(gè)角度說(shuō),一定層次上提升了用戶(hù)的體驗(yàn)和質(zhì)量,對(duì)于前端工程的收益是較為明顯!

在本次的問(wèn)題處理過(guò)程中,其實(shí)還有一些值得探究的地方:

  1. ErrorBoundary 捕獲錯(cuò)誤的原理是啥?為什么不能處理本身錯(cuò)誤?
  2. ErrorBoundary 除了接收 JSX,是否可以擴(kuò)展接收組件等,是否 fallback 可以和函數(shù)聯(lián)動(dòng)?
  3. ErrorBoundary 是否可以作為前端白屏監(jiān)控?或更多應(yīng)用場(chǎng)景?思考&擴(kuò)展一下?

Reference

  • static getDerivedStateFromError
  • componentDidCatch
  • Suspense for Data Fetching (Experimental)

瀏覽 22
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 九九精品热| 亚洲一级内射| 上海熟妇搡BBBB搡BBBB| 免费v在线观看| 欧美成人在线观看| 美女黄片| 亚洲精品中文字幕在线观看| 久久久成人精品| 超碰在线免费播放| 996热| 大香蕉性爱| 特级西西444www精品视频| 麻豆91蜜桃传媒在线观看| 亚洲天堂av在线免费观看| 久热在线视频| 无码AⅤ一区二区三区| 麻豆成人精品国产免费| 成年人黄色在线观看| 先锋久久资源| 91麻豆大奶巨乳一区白虎| 一级A片一毛片大全| xxxxx日韩| 操B在线视频| 日韩成人AV电影| 亚洲国产精品欧美久久| 亚洲天堂在线播放| 日本久久电影| 欧美成人版| 豆花AV在线| 日韩一区二区三区无码电影| 国精产品九九国精产品| 久久久久久无码视频| 日韩操逼片| 蜜桃久久久| 一区二区三区四区高清无码| 河南乱子伦视频国产| 97久久综合| 亚洲欧美成人| 日韩三级在线免费观看| 免费超碰| 日韩高清无码一区| 日本AV在线播放| 国产精品夜夜爽7777777| 亚洲AV无码精品久久一区二区| 日韩在线成人中文字幕亚洲| 中日韩精品A片中文字幕| 操逼视频一区| 免费看性蜜桃| 好吊视频一区二区三区四区| 成人无码区免费AV片| 色婷婷免费视频| 亚洲成人Av| 乱伦视频91| 懂色av蜜臀av粉嫩av分| 伊人成人网视频| 国产美女18毛片水真多| 成人电影亚洲天堂| 91青青草| 久久99精品国产| 五月天婷婷视频| 久久久777| 91人妻网| av黄页| 久久久久久免费毛片精品| 91人妻中文字幕| 免费观看黄色网| 日韩v欧美v日本v亚洲v国产v| 爆乳一区二区三区AV| 亚洲欧美中文字幕| 五月天中文字幕| 波多野结衣亚洲无码| 中文字幕777| 国产精品国产三级国产专区53 | 精品无码一区二区三| 国产在线拍揄自揄拍无码福利| 欧美精品成人免码在线| 中国免费一级无码成人片| 人人摸人人操人人干| av无码毛片| 91国内精品| 丰满人妻一区二区三区精品高清| 亚州操B| 97无码人妻一区二区三区| 五月天青青草超碰免费公开在线观看| 中文字幕在线观看网站| 欧美老妇另类| 福利视频网站| 日韩在线视频网站| 97在线观看免费| 亚洲色图成人网| 久久草大香蕉| 国产黄色免费视频| 国产在线精品观看| 毛片操逼视频| 亚洲AV无码国产综合专区| 成人在线毛片| 在线国产中文字幕| 亚洲日产专区| 久久理论| 韩日一区二区三区| 国产成人精品av在线观看| 影音先锋成人在线资源| 69视频在线播放| 91亚洲精品视频在线| 日韩人妻在线播放| 亚洲福利免费观看| 亚洲A∨无码无在线观看| 91吴梦梦无码一区二区| 吃奶做爱视频| 成人无码影院日韩,成人年… | 国产操P| 丰满人妻一区二区三区Av猛交| 日韩欧美在线中文| 久久成人三级| 国产叼嘿视频| 欧美精品18videosex性欧美 | 亚洲午夜激情| 加勒比国产在线| 台湾中文字幕网| 成人AV午夜福利| 手机看片欧美+日韩+国产| 99热官网| 中文字幕精品1| av手机在线| www黄色com| 精品黄色视频| 久久中文娱乐网| 美女福利视频| 久久另类TS人妖一区二区| 欧美人妻中文字幕| 天天日天天日天天干| 色碰碰| 久久无码高清| 欧美日韩在线视频观看| 日本黄色一级| 麻豆国产一区二区三区四区| 97成人在线| 人人爱人人射| 97人妻在线| av在线无码| 中文字幕婷婷| 91在线观看18| 国产亚洲视频在线观看视频| 亚洲人成免费网站| 国产成人午夜福利视频| 欧美日韩一级黄色片| 色婷婷香蕉| 先锋影音成人资源| 人妻少妇精品无码| 免费黄色视频在线| 91久久精品一区二区三| 一级黄色片在线观看| 欧美肏屄| www.啪啪| 蜜挑视频一区二区三区| 熟女一区二区三区| 蜜桃视频免费网站| 久久久久亚洲AV无码专区成人| 爱爱爱网址| 亚洲色图1| 免费成人一级片| 久久精品苍井空免费一区二| 色xxx| 欧美日比视频| 少妇福利| 中文字幕av在线播放| 亚洲国产熟妇综合色专区| 中文字幕乱码视频32| 小黄片在线免费观看| 一本久道视频一本久道| 中文无码一区二区三区四区| 欧美A色| 国产精品高潮无套内谢| 99精品免费| 精品成人电影| 大香蕉在线观看视频| 五月天婷婷操逼视频| 伊人精品大香蕉| 91在线电影| 香蕉午夜视频| 国产嫩苞又嫩又紧AV在线| 欧美XXX视频| 欧美污网站| 日韩一二三| 亚洲一级黄色片| 精品免费囯产| 干妞网免费视频| 日韩中字幕无码| 亚洲免费黄| 日韩婬乱片A片AAA真人视频| 日韩精品三级片| 韩日毛片| Av天堂图片在线| 青草香蕉视频| 亚洲无码乱码精品| 国产无码小视频| 欧美一区二区三区免费| 中文字幕无码Av在线看| 亚洲精品秘一区二区三区影| 欧美黄色性爱| 九色PORNY蝌蚪视频| 91小宝寻花一区二区三区三级| 日韩免费视频在线观看| 欧美日韩A片欧美日| 手机看片1024久久| av牛牛| 26uuu亚洲| 欧美夜夜爽| 国产精品h| 一本到在线观看午夜剧场| 99热在线中文字幕| 激情三区| 精品国产欧美| 午夜激情AV| 日韩一级黄色电影| 尤物综合网| TheAV精尽人亡av| 99热在线只有精品| 在线免费观看黄色小视频| 欧美精产国品一二三产品在哪买 | 亚洲无码在线资源| 亚洲伊人大香蕉| 97黄片| 特级毛片| 中韩AV在线免费观看| 无码欧美精品一区二区| 黑人巨大翔田千里AⅤ| 在线视频日本| 中文字幕日韩欧美| 屁屁影院国产第一页| 大香蕉大香蕉免费网| av一级| 亚洲综合视频在线| 91午夜福利| 一区二区成人免费视频| 水蜜桃成人网| 国内自拍av| 亚洲a视频| 操屄视频播放| 少婦揉BBBB揉BBBB揉| 日韩中文字幕网站| 性无码一区二区三区| 九九热毛片在线观看| 亚洲欧美成人片| 精品中文字幕在线| 亚洲人妻无码在线| 91精品人妻一区二区| 色色色免费视频| 台湾久久| 爆乳尤物一区二区三区| 91一区| 先锋成人影音| 欧美国产性爱| 福利网站在线观看| 翔田千里无码| 欧美精品久| 精品乱子伦一区二区三区在线播放| 黄片免费视频在线观看| 日本一级A片| 91AV天天在线观看| 国产亚洲欧洲| 人人射人人| 欧美日韩在线观看一区| 性无码区| 人妻无码高清| 免费看成人747474九号视频在线观看| 囯产一级黄片| 91在线一区二区三区| 不卡AV在线| 无码av观看| 亚洲免费天堂| 99在线精品视频免费观看20| 亚洲成人av| 中文字幕+乱码+中文字幕一区| 国产第8页| 日韩动态图| 欧美日韩精品一区二区三区| 成人精品免费无码毛片| 亚洲影院在线观看| 久久久久久久毛片| 五月天激情四射| 操逼观看| 亚洲Japanese办公室制服| 北条麻妃青青久久| 亚洲精品成人视频| 一线天嫩穴少妇| 精品无码9| 亚洲黄片免费在线观看| 大香蕉啪啪| 日韩无码黄色视频| 久草新视频| 亚洲日韩电影| 91逼| A片免费播放| 国产日逼视频| 国产又爽又黄免费观看| 亚洲日韩一级片| 成人国产精品秘在线看| 视色AV| 久久精品成人| 在线观看AV91| 日本黄色影院在线| 四虎一区二区| 色综合五月| 夫妻-ThePorn| 日本黄色三级片| 免费毛片观看| 久久一卡二卡| 国产黄片视频| 在线观看小视频| 97午夜| 在线观看高清无码中文字幕| 摸BBB搡BBB搡BBBB| 五月丁香中文字幕| 99国产精品久久久久久久| 黄色电影视频网站| 亚洲精品区| 免费观看黄片视频| 激情视频在线免费观看| 美女黄色视频永费在线观看网站| 成熟的国模冰莲[2]| 久久午夜视频| 国产成人精品毛片| 日本高清无码在线| 波多野结衣一区二区三区| 午夜亚洲无码| 波多野结衣成人在线| AV影音在线| 欧美亚洲成人网| 超碰人人在线| 91AV在线免费观看| 国产成人一区二区三区| 国产成人V在线精品一区| 99热这里精品| 六月婷婷深爱| 国产一a毛一a免费观看| 一级片免费观看| 中文字幕无码播放| 国产精品国产| 精品成人无码一区二区三区| 狠狠色狠狠干| 午夜精品18码视频国产17c| 中文字幕免费AV| 国产乱国产乱老熟300部视频 | 一级爱爱爱| 最新一区二区| 免费看毛片的网站| 99人妻人人爽人人添人人精品| 成人一区二区三区四区五区| 粉嫩小泬BBBBBB免费| 亚洲欧美国产另类| 日韩人妻AV| 国产顶级理伦| 亚洲婷婷网| 色婷婷视频在线观看| 欧美日韩国产成人电影| 成人毛片在线观看| 亚洲三级黄片| 人妻无码一区二区三区摄像头| 日韩精品黄片| 国精产品一二四区黑人| 在线看片国产| 三级网站免费观看| 亚洲一线播放| 国产夫妻在线视频| 大屌一区二区三区| 91AV免费观看| 一级大毛片| 亚洲爆乳无码一区二区三区| AⅤ中文字幕在线免费观看| 亚洲色热| 久久青青| 三级网站视频| 国产精品国产精品国产| 黑人AV在线观看| 久久成人免费视频| 色婷婷av在线| 高清无码免费在线观看| 国产丝袜自拍| 浙江妇搡BBBB搡BBBB| 亚洲精品18禁| 性爱无码| 99色99| 最新中文字幕| 日韩无码中文字幕视频| 日韩精品在线观看视频| 韩国三级HD中文字幕的背景音乐| 青青在线| 免费av片| 久操免费在线| 婷婷五月丁香激情| 毛片黄色片| 亚洲国产免费| 欧美熟女一区| 色婷婷AV一区二区三区软件| 欧美精品在线免费观看| 久久艹大香蕉| 啪啪动漫| 国产女人18毛片18精品| 国产精品1区2区3区| 欧美熟女18| 日韩在线观看中文字幕| 尤物视频在线播放| 亚洲电影在线| 成人性爱福利视频| 成年人视频在线免费观看| 日本女人高潮视频| 色婷婷在线免费视频| 欧美一级成人片| 国产区精品| 日日夜夜综合| 激情欧美| 久久er99| 国产A片录制现场妹子都很多 | 无码免费高清视频| 亚洲福利| 午夜爽爽爽| 日韩中文字幕一区二区三区| 97精品在线视频| 高清毛片AAAAAAAAA郊外| 国产成人精品AA毛片| 国产视频无码在线| 中文字幕婷婷| 国产欧美在线看| 精品中文字幕在线播放| 无码av中文字幕| 久久久久久久极品内射| 国产精品久久久久久久久久王安宇| 日韩在线网址| 成人一级片| 国产高潮在线| 欧美精产国品一| 久草热在线| 亚洲AV无码成人片在线| 操逼视频在线| 亚洲中文字幕观看| 伊人久久大香线蕉| 日本黄色大片| 操日本女人逼| 污污的网站18| 亚洲一区在线免费观看| 国产一区二区三区四区五区六区七区| 日韩中文字幕无码| 69视频在线播放| 狼人香蕉在线视频| 无码一道本一区二区无码| 梁祝艳谭A级毛片| 色婷婷精品| BBB搡BBB搡BBB搡BBB| 伊人久久大综合中文无码| 日本性爱无码| 免费黄视频在线观看| 久热大香蕉| 国产精品成人免费久久黄AV片| 成人尤物网站| 一区在线播放| 久久黄色精品视频| 亚洲AV无码日韩AV无码导航| 午夜高清无码视频| 丰满熟妇人妻无码视频| 亚洲吹箫| 日韩中文在线视频| 密桃视频网站| 麻豆三级片| 成人无码一区二区三区| 强行征服邻居人妻HD高清日本 | 国产l精品久久久久久久久久| 婷婷久草网| 91人妻人人澡人人爽人人| 另类无码| 成人女人18女人毛片| 99热7| 国产一级自拍| 亚洲精品一区二区三区蜜桃| 久久99久久99久久99人受| 国产人成| 黑人av| 亚洲无码精品久久| 亚洲在线一区二区| 美女大吊,网站视频| 免费在线观看a| 亚洲在线成人| 精品少妇3p| 亚洲视频二区| 99reav| 久草视频免费在线播放| 蜜桃视频无码| 污网站免费观看| 国产精品精品| 天堂一区二区| 免费色网站| 色男人的天堂网| 亚洲无码精品视频| 俺去啦在线视频| 国内精品久久久久久久久久| 手机AV网站| 久久久久国产视频| 三级网站网址| 中日韩中文字幕一区二区区别| 成人黄色电影在线观看| 日韩欧美在线不卡| 亚洲AV无码成人精品区h麻豆 | 久久久性爱视频| 波多野结衣久久中文字幕| 亚洲日韩精品成人无码专区AV| 日韩在线一区二区| 51精品国产| 中文字幕第23页| 婷婷五月大香蕉| 大香蕉伊人综合| 国产精品成人一区二区| 日韩无码一| 天干天干天夜夜操| 无码精品人妻一区二区三区漫画| 精品一区二区三区四区五区六区 | 最新97色黄色精品高清网站| 五月婷婷丁香综合| 三级网站网址| 99精品国产一区二区| 久草视频在线播放| 国产一区二区视频在线观看| 神马午夜精品91| 国产成人内射| 夜夜骚精品人妻av一区| 七十路の高齢熟妇无码| 亚洲肏屄网| 九九色播| 中文字幕成人| av日韩无码| 99久久婷婷| 黄色视频在线观看| 青娱乐偷窥成| aaa黄片| 无套内射学生妹去看片| 日本黄色影院在线| 国产一级a毛一级a做免费的视频| 丁香六月婷婷综合| 7777影视电视剧在线观看官网 | 中文字幕av在线| 国产逼| 亚洲日韩AV无码| 久久人体视频| 日区无码| 一区二区三区在线看| 国产香蕉在线| 一本色道久久综合无码| 不卡的AV| 黄色亚洲无码| 午夜天堂精品久久久久| 久久九九国产| 中文字幕在线中文| 在线观看免费视频a| 在线观看av中文字幕| 亚洲日韩成人| 国产精品视频福利| 黄色成人网址| 日韩成人AV毛片| 西西人体大胆ww4444图片 | 夜夜爽日日爽| 高清无码黄片| 日逼A片| 蜜臀99久久精品久久久懂爱 | 亚洲精品女人久久久| 香蕉视频啪啪啪| 影音先锋AV成人| 欧美一区二区三区婷婷五月| 黑人操白人| 亚洲成人无码一区| 国内精品久久久久久久久98| 午夜成人免费福利| 亚洲欧洲久久电影| 69av在线播放| 黄色成人网站在线| 色999日韩| 欧美精品乱码99久久蜜桃| 日韩中文字幕一区二区| 成人国产欧美日韩在线视频| 中文字幕三级片| 国产成人A| 东方a在线| 日韩欧美中文字幕公布| 国产最新AV| 99久久精品一区二区成人| 无码人妻一区二区三区四区老鸭窝| 国产www在线观看| 日逼中文字幕| 理论片无码| 黑人在线视频| 加勒比一区二区| 丁香五月少妇| 欧美天天| 日韩成人一区| 嫩BBB槡BBBB槡BBBB撒尿| 国产精品无码在线播放| 亚洲真人无码| 成人精品亚洲人成在线| 久久精品视频久久| 成人无码在线观看免费视频| 日本免费黄色片| 日本精品无码a62v在线| 又黄又爽的网站| 久久国产乱子伦精品免费午夜...| 久久久久中文字幕| 香蕉av在线播放| 免费超碰| 欧美精产国品一二三| 一区二区三区无码在线| 91精品国产91久久久久久久久久| 欧美一级AA| 国产aⅴ| 91无码人妻东京热精品一区| 大香蕉伊人免费| 在线中文字幕在线观看| 污网站在线观看| 国产黄色A片| 一二三四在线视频| 成人免费在线| 骚虎av| 免费观看AV| 高潮喷水视频| 99国产综合| 成人久久久久久| 国产成人午夜福利视频| 亚洲人在线观看| 蜜桔视频嫩草蜜桃| 一级无码毛片| 手机看片久久| 五月天激情影院| 蜜桃av色偷偷av老熟女| 色色777| 欧美a片在线观看| 超碰人人操人人摸| 成人在线中文| 国产污视频在线观看| 欧美爱爱网站| 中文字幕在线无码观看| 国产91探花| 99成人精品| 色综合视频| 天天操天天操免费视频| 日韩三区| 免费黄色成人网站| 天天综合色| 江苏妇搡BBBB搡BBBB| 欧美一级一级| 西西人体大胆ww4444| 国产精品成人无码a无码| 亚洲AV秘无码苍井空| 国产无套免费网站69| a片免费网站| 国产亚洲中文| 免费Av网站| 中国熟女HD| 99久在线视频| 国产乱伦毛片| 天天成人| 香蕉视频久久| AV在线导航| 黄色亚洲网站| 国产av天天| 国产一级婬乱A片| 久久久久久久艹| 亚洲天堂无码av| 黄色视频大全免费看| 日韩无码黄色视频| 欧美日韩在线视频免费播放| 五月天激情片| AV中文字幕电影| av一二三区| 熟妇精品| 九九成人免费视频| а√天堂中文官网8| 中文字幕亚洲人妻| 天天做天天爱夜夜爽| 69伊人| 手机看片1024久久| 黄片视频在线免费播放| 亚洲网站在线免费观看| 日日骚亚洲| 黄色性爱网址| 国产一级做a爱免费视频| 黃色毛片A片AAAA级20| 操美女91| 野花Av| 中文字幕AV在线免费观看| 日本一级片免费看| 免费黄视频在线观看| 最近中文字幕无码| 久久精品视频国产| 自拍偷拍视频网| 亚洲欧美成人视频| 中文字幕免费MV第一季歌词| 在线看亚洲| 黄色成人网址| 日逼欧美| 婷婷五月综合在线| 丰满老妇高潮一级A片| 中文字幕人成人乱码亚洲电影| 亚洲天堂色| eeuss一区| 亚洲卡一卡二| 天天干天天草| 亚洲AV成人片无码网站| 一区二区亚洲| 脓肿是什么原因引起的,该怎么治疗 | 白嫩外女BBWBBWBBW| 中文AV在线播放| 久艹视频| 国产黄色免费网站| 俺去俺来也在线www色官网| 色aV牛牛在线观看| 欧美性视频网站| 99cao| 波多野结衣中文字幕久久| 东北女人毛多又黑A片| 蝌蚪窝在线视频观看| www.久久精品视频| 丁香六月婷婷综合激情欧美| 五月婷婷精品| 丁香五月婷婷啪啪| 亚洲午夜精品视频| 操日本美女| 天堂中文资源在线| 99re久久| 亚洲成人黄色| 青草影视久久| 日韩色导航| 成人黄色在线观看视频| 精品国产999久久久免费| 69福利| 亚洲XXXXX| 你懂的国产| 一区二区三区电影| 在线免费A片| 天堂免费视频| 亚洲精品成人无码| 1024黄| 亚洲最新在线视频| 在线免费观看av网站| 亚洲热视频在线观看| 成人福利视频在线观看| 成人电影无码| 俺去俺来也www色官网cms| 中文字幕一区二区三区四虎在线| 影音先锋麻豆| 99热精品在线观看| 亚洲色色视频| 熟妇操逼视频| 中文字幕精品1| 一级性爽AV毛片| 新妺妺窝窝777777野外| 中文字幕人妻丰满熟妇| 天堂在线免费视频| 一级操逼视频| 91麻豆精品91久久久久同性| 粉嫩AV在线| 色在线视频| 亚洲精品女人久久久| 91丨PORNY丨丰满人妻网站| 欧美日视频| 中文字幕免费高清| 苍井空无码一区二区三区| jizz在线观看免费视频| 免费涩涩无遮挡18国产| 欧美精品性爱视频| 亚洲无码人妻| 在线天堂视频| 亚洲小电影| 国产乱码精品一区二区三区的特点| 国产男女无套免费| 波多野结衣在线观看一区二区| 操逼操123| 91人妻在线视频| 国产激情小视频| 日韩中文性受视频| 不卡无码av| 日本黄色影院在线| 午夜久久电影| 大香蕉操逼网| 国产拍拍拍| 精品久久免费| 久久A级片| 国产香蕉91| 久久黄视频| 久久草草热国产精品| 亚洲无码高清在线| 久久国产精品在线| 俺来也俺去也www色官| 一本色道久久综合无码人妻软件| 中文字幕免费在线播放| 东京热男人的天堂| 午夜福利高清在线观看| 澳门午夜黄色在线| 麻豆一级| 北条麻妃中文字幕在线观看| 亚洲精品午夜精品| 无码三级视频| 亚洲欧美婷婷五月色综合| 免费观看亚洲视频| 欧美性爱怡红院| 欧一美一婬一伦一区二区三区黑人 | 3D动漫操逼视频| 亚洲不卡中文字幕| 亚洲免费中文字幕| 久久一级片| 中文字幕网站在线观看| 成年人视频免费| 性生活黄色视频| 精品A片| 淫荡五月天视频导航| 91一区在线观看| 日韩AV中文字幕在线播放| 99久久99久久| 99久久久久| 先锋影音资源站av每日资源在线| 国产精品美女久久久久久久久 | 日本性爱一区| 最近日韩中文字幕中文翻译歌词| 日本欧美一级片| 日韩无码链接| 精品免费国产一区二区三区四区| 欧美激情五月| 亚洲国产成人精品综合99| 日韩在线成人中文字幕亚洲| 黄色国产AV| 国产AV一级片| 日韩黄色免费视频| 五月天综合在线| 久久涩| 国产午夜视频在线观看| av在线影院| 国产91探花精品一区二区| 亚洲秘无码一区二区三区蜜桃中文| 天堂成人| 日韩无码高清免费视频| 99国产综合| 午夜久久久久久久久久久久91| 加勒比久久综合| 精品伊人大香蕉| 91精品网| 蜜桃视频成人app| 国产精品自拍视频| 国产看色免费| 天天躁夜夜躁狠狠躁AV| 日韩免费网站| 91麻豆国产在线观看| 狠狠狠狠狠狠操| 中文字幕第一| 中文字幕视频在线| 懂色一区二区二区在线播放视频| 日韩中文字幕av在线| 在线观看视频黄| 伊人青草视频9| 欧美韩日一区二区| 国产2页| 亚洲性爱在线观看| 国产99999| 日本做爱视频| 成人视频一区二区| 亚洲夜夜爱| 亚洲天堂婷婷| 欧美婷婷五月天| 免费黄色小视频| 操逼激情视频| 中文字幕2025年最好看电视剧| 久操精品| 亚洲一区无码在线观看| 婷婷俺也去| 久久伊| 黄色成人视频网站| 免费日韩无码| 大荫蒂HD大荫蒂视频| 骚妇一区| 亚洲vs无码秘蜜桃| 在线无码视频播放| 国产精品怡红院有限公司| 天天激情站| 麻豆视频一区二区| 国精产品秘一区二区| 狠狠干天天操| 97在线观看免费| 欧美老女人操逼群| 中文字幕北条麻妃在线| 亚洲天堂视频在线| 五月丁香六月情| 国产午夜激情视频| 91成人免费| 免费观看高清无码视频| 无码中文在线| 无码婷婷| 天天干天天日蜜臀色欲av| 亚洲无码AV网站| 欧美午夜福利视频| 色婷婷五月激情| 99热精品国产| 人人干人人爱| 肏屄综合网| 欧美在线一级| 欧美性爱超碰| 精品成人AV|