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

React Server Component 從理念到原理

開發 前端
SSG是后端「編譯時方案」。使用SSG的業務,后端代碼在編譯時會生成HTML(通常會被上傳CDN)。當前端發起請求后,后端(或CDN)始終會返回編譯生成的HTML。

大家好,我卡頌。

React Server Component(后文簡稱RSC)是React近幾年最重要的特性。雖然他對React未來發展至關重要,但由于:

  • 仍屬實驗特性。
  • 配置比較繁瑣,且局限較多。

所以雖然體驗Demo[1]已經發布3年了,但仍屬于「知道的人多,用過的人少」。

本文會從以下幾個角度介紹RSC:

  1. RSC是用來做啥的?
  2. RSC和其他服務端渲染方案(SSR、SSG)的區別
  3. RSC的工作原理

希望讀者讀完本文后對RSC的應用場景有清晰的認識。

本文參考了how-react-server-components-work[2]

什么是RSC

對于一個React組件,可能包含兩種類型的狀態:

  • 前端交互用的狀態,比如加載按鈕的顯/隱狀態
  • 后端請求回的數據,比如下面代碼中的data狀態用于保存后端數據:
function App() {
  const [data, update] = useState(null);
  
  useEffect(() => {
    fetch(url).then(res => update(res.json()))
  }, [])
  
  return <Ctn data={data}/>;
}

「前端交互用的狀態」放在前端很合適,但「后端請求回的數據」邏輯鏈路如果放在前端則比較繁瑣,整個鏈路類似如下:

  1. 前端請求并加載React業務邏輯代碼。
  2. 應用執行渲染流程。
  3. App組件mount,執行useEffect,請求后端數據。
  4. 后端數據返回,App組件的子組件消費數據。

如果我們根據「狀態類型」將組件分類,比如:

  • 「只包含交互相關狀態」的組件,叫客戶端組件(React Client Component,簡寫RCC)。
  • 「只從數據源獲取數據」的組件,叫服務端組件(React Server Component,簡寫RSC)。

按照這種邏輯劃分,上述代碼中:

  • App組件只包含數據,顯然屬于SSR。
  • App組件的子組件Ctn消費data,如果他內部包含交互邏輯,應該屬于RCC。

將上述代碼改寫為:

function App() {
  // 從數據庫獲取數據
  const data = getDataFromDB();
  return <Ctn data={data}/>;
}

其中:

  • App組件在后端運行,可以直接從數據源(這里是數據庫)獲取數據
  • Ctn組件在前端運行,消費數據

改造后「前端交互用的狀態」邏輯鏈路不變,而「后端請求回的數據」邏輯鏈路卻變短很多:

  1. 后端從數據源獲取數據,將RSC數據返回給前端。
  2. 前端請求并加載業務邏輯代碼(來自步驟0)。
  3. 應用執行渲染流程(此時App組件已經包含數據)。
  4. App組件的子組件消費數據。

這就是RSC的理念,一句話概括就是 —— 根據狀態類型,劃分組件類型,RCC在前端運行,RSC在后端運行。

與SSR、SSG的區別

同樣涉及到前端框架的后端運行,RSC與SSR、SSG有什么區別呢?

首先,SSG是后端「編譯時方案」。使用SSG的業務,后端代碼在編譯時會生成HTML(通常會被上傳CDN)。當前端發起請求后,后端(或CDN)始終會返回編譯生成的HTML。

RSC與SSR則都是后端「運行時方案」。也就是說,他們都是前端發起請求后,后端對請求的實時響應。根據請求參數不同,可以作出不同響應。

同為后端運行時方案,RSC與SSR的區別主要體現在輸出產物:

  • 類似于SSG,SSR的輸出產物是HTML,瀏覽器可以直接解析。
  • RSC會流式輸出一種「類JSON」的數據結構,由前端的React相關插件解析。

既然輸出產物不同,那么他們的應用場景也是不同的。

比如,在需要考慮SEO(即需要后端直接輸出HTML)時,SSR與SSG可以勝任(都是輸出HTML),而RSC則不行(流式輸出)。

同時,由于實現不同,同一個應用中可以同時存在SSG、SSR以及RSC。

RSC的限制

「RSC規范」是如何區分RSC與RCC的呢?根據規范定義:

  • 帶有.server.js(x)后綴的文件導出的是RSC。
  • 帶有.client.js(x)后綴的文件導出的是RCC。
  • 沒有帶server或client后綴的文件導出的是通用組件。

所以,我們上述例子可以導出為2個文件:

// app.server.jsx
function App() {
  // 從數據庫獲取數據
  const data = getDataFromDB();
  return <Ctn data={data}/>;
}

// ctn.client.jsx
function Ctn({data}) {
  // ...省略邏輯
}

對于任意應用,按照「RSC規范」拆分組件后,能得到類似如下的組件樹,其中RSCRCC可能交替出現:

圖片

但是需要注意:RCC中是不允許import RSC的。也就是說,如下寫法是不支持的:

// ClientCpn.client.jsx

import ServerCpn from './ServerCpn.server'
export default function ClientCpn() {
  return (
    <div>
      <ServerCpn />
    </div>
  )
}

這是因為,如果一個組件是RCC,他運行的環境就是前端,那么他的子孫組件的運行環境也是前端,但RSC是需要在后端運行的。

那么上述RSC和RCC交替出現是如何實現的呢?

圖片

答案是:通過children。

改寫下ClientCpn.client.jsx:

// ClientCpn.client.jsx

export default function ClientCpn({children}) {
  return (
    <div>{children}</div>
  )
}

在OuterServerCpn.server.jsx中引入ClientCpn與ServerCpn:

// OuterServerCpn.server.jsx
import ClientCpn from './ClientCpn.client'
import ServerCpn from './ServerCpn.server'
export default function OuterServerCpn() {
  return (
    <ClientCpn>
      <ServerCpn />
    </ClientCpn>
  )
}

組件結構如下:

解釋下這段代碼,首先OuterServerCpn是RSC,則他運行的環境是后端。他引入的ServerCpn組件運行環境也是后端。

ClientCpn組件雖然運行環境在前端,但是等他運行時,他拿到的children props是后端已經執行完邏輯(已經獲得數據)的ServerCpn組件。

RSC協議詳解

我們可以將RSC看作一種rpc(Remote Procedure Call,遠程過程調用)協議的實現。數據傳輸的兩端分別是「React后端運行時」與「React前端運行時」。

圖片

一款rpc協議最基本的組成包括三部分:

  • 數據的序列化與反序列化
  • id映射
  • 傳輸協議

以上面的OuterServerCpn.server.jsx舉例:

// OuterServerCpn.server.jsx
import ClientCpn from './ClientCpn.client'
import ServerCpn from './ServerCpn.server'
export default function OuterServerCpn() {
  return (
    <ClientCpn>
      <ServerCpn />
    </ClientCpn>
  )
}

// ClientCpn.client.jsx
export default function({children}) {
  return <div>{children}</div>;
}

// ServerCpn.server.jsx
export default function() {
  return <div>服務端組件</div>;
}

這段組件代碼轉化為RSC數據后如下(不用在意數據細節,后文會解釋):

M1:{"id":"./src/ClientCpn.client.js","chunks":["client1"],"name":""}
J0:["$","div",null,{"className":"main","children":["$","@1",null,{"children":["$","div",null,{"children":"服務端組件"}]}]}]

接下來我們從上述三個角度分析這段數據結構的含義。

數據的序列化與反序列化

RSC是一種「按行分隔」的數據結構(方便按行流式傳輸),每行的格式為:

[標記][id]: JSON數據

其中:

  • 「標記」代表這行的數據類型,比如J代表「組件樹」,M代表「一個RCC的引用」,S代表Suspense
  • id代表這行數據對應的id。
  • JSON數據保存了這行具體的數據。

RSC的序列化與反序列化其實就是JSON的序列化與反序列化。反序列化后的數據再根據「標記」不同做不同處理。

比如,對于上述代碼中第二行數據:

J0:["$","div",null,{"className":"main","children":["$","@1",null,{"children":["$","div",null,{"children":"服務端組件"}]}]}]

可以理解為,這行數據描述了一棵組件樹(標記J),id為0,組件樹對應數據為:

[
  "$","div",null,{
    "className":"main","children":[
      "$","@1",null,{
        "children":["$","div",null,{
          "children":"服務端組件"}]
        }
      ]
    }
]

當前端反序列化這行數據后,會根據上述JSON數據渲染組件樹。

id映射

所謂「id映射」,是指 對于同一個數據,如何在rpc協議傳輸的兩端對應上?

在「RSC協議」的語境下,是指 對于同一個組件,經由RSC在React前后端運行時之間傳遞,是如何對應上的。

還是考慮上面的例子,回顧下第二行RSC對應的數據:

[
  "$","div",null,{
    "className":"main","children":[
      "$","@1",null,{
        "children":["$","div",null,{
          "children":"服務端組件"}]
        }
      ]
    }
]

這段數據結構有些類似JSX的返回值,把他與組件層級放到一張圖里對比下:

圖片

可以發現,這些信息已經足夠前端渲染<OuterServerCpn/>、<ServerCpn/>組件了,但是<ClientCpn/>對應的數據@1是什么意思呢?

這需要結合第一行RSC的數據來分析:

M1:{"id":"./src/ClientCpn.client.js","chunks":["client1"],"name":""}

M標記代表這行數據是「一個RCC的引用」,id為1,數據為:

{
  "id":"./src/ClientCpn.client.js",
  "chunks":["client1"],
  "name":""
}

第二行中的@1就是指「引用id為1的RCC」,根據第一行RSC提供的信息,React前端運行時知道id為1的RCC包含一個名為client1的chunk,路徑為"./src/ClientCpn.client.js"。

于是React前端運行時會向這個路徑發起JSONP請求,請求回<ClientCpn/>組件對應代碼:

如果應用包裹了<Suspense/>,那么請求過程中會顯示fallback效果。

可以看到,通過協議中的:

  • M[id],定義id對應的「RCC數據」。
  • @[id],引用id對應的「RCC數據」。

就能將同一個RCC在React前后端運行時對應上。

那么,為什么RCC不像RSC一樣直接返回數據,而是返回引用id呢?

主要是因為RCC中可能包含前端交互邏輯,而有些邏輯是不能通過「RSC協議」序列化的(底層是JSON序列化)。

比如下面的onClick props是一個函數,函數是不能通過JSON序列化的:

<button onClick={() => console.log('hello')}>你好</button>

這里我們再梳理下「RSC協議」中「id映射」的完整過程:

  1. 業務開發時通過.server | client后綴區分組件類型。
  2. 后端代碼編譯時,所有RCC(即.client后綴文件)會編譯出獨立文件(這一步是react-server-dom-webpack[3]插件做的,對于Vite,也有人提了Vite插件的實現 PR[4])。
  3. React后端返回給前端的RSC數據中包含了組件樹(J標記)等按行表示的數據。
  4. React前端根據J標記對應數據渲染組件樹,遇到「引用RCC」(形如M[id])時,根據id發起JSONP請求。
  5. 請求返回該RCC對應組件代碼,請求過程的pending狀態由<Suspense/>展示。

傳輸協議

RSC數據是以什么格式在前后端間傳遞呢?

不同于一些rpc協議會基于TCP或UDP實現,「RSC協議」直接基于「HTTP協議」實現,其Content-Type為text/x-component。

圖片

總結

本文從理念、原理角度講解了RSC,過程中回答了幾個問題。

Q:RSC和其他服務端渲染方案有什么區別?

A:RSC是服務端運行時的方案,采用流式傳輸。

Q:為什么需要區分RSC與RCC(通過文件后綴)?

A:因為RSC需要在后端獲取數據后流式傳輸給前端,而RCC在后端編譯時編譯成獨立文件,前端渲染時再以JSONP的形式請求該文件

Q:為什么RCC中不能import RSC?

A:因為他們的運行環境不同(前者在前端,后者在后端)

由于配置繁瑣,并不推薦在現有React項目中使用RSC。想體驗RSC的同學,可以使用Next.js并開啟App Router:

圖片

在這種情況下,組件默認為RSC。

參考資料

[1]體驗Demo:https://github.com/reactjs/server-components-demo

[2]how-react-server-components-work:https://www.plasmic.app/blog/how-react-server-components-work

[3]react-server-dom-webpack:https://www.npmjs.com/package/react-server-dom-webpack

[4]Vite插件的實現 PR:https://github.com/facebook/react/pull/26926

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2014-04-24 11:49:42

DevOps自動化

2021-10-12 08:34:23

React組件前端

2009-04-08 16:42:08

動態架構DI智慧IT

2022-09-19 19:51:30

ReactuseEffect

2021-05-11 07:51:30

React ref 前端

2021-07-21 15:16:53

云原生阿里云云安全

2023-11-16 07:43:26

Next.jsReact

2016-01-14 09:30:46

Hive概念安裝使用

2024-05-29 12:50:49

2022-05-25 16:32:36

云原生Cloud

2025-04-02 07:29:14

2023-05-26 08:13:49

RSCNext.js開源

2012-04-25 10:02:39

H3CNGIP

2025-05-12 08:16:49

2010-06-03 14:22:01

2009-07-09 18:20:53

云存儲云計算云服務

2013-08-19 11:55:48

華為HCC大會HCC2013華為

2017-07-25 16:04:31

概念應用強化學習

2010-08-25 17:05:41

DHCP服務器

2014-06-04 13:20:52

大數據
點贊
收藏

51CTO技術棧公眾號

日韩福利视频网| 高清精品xnxxcom| 亚洲少妇屁股交4| yy111111少妇影院日韩夜片| 国产在线精品观看| 国产精品一在线观看| 欧美日韩的一区二区| 17c丨国产丨精品视频| 秋霞av在线| 国产在线不卡一区| 欧美最顶级丰满的aⅴ艳星| 日本理论中文字幕| xvideos.蜜桃一区二区| 欧美视频在线观看一区二区| 国产 欧美 日本| 成人全视频高清免费观看| 国产成人福利片| 国产裸体写真av一区二区 | 欧美丰满老妇厨房牲生活| 法国伦理少妇愉情| 7m精品国产导航在线| 欧美性一区二区| 日韩av一二三四区| 丝袜国产在线| 中文字幕亚洲精品在线观看| 欧美高清性xxxxhdvideosex| 亚洲精品成av人片天堂无码| 蜜桃91丨九色丨蝌蚪91桃色| 91av在线播放| 黄色一级片中国| 欧美一区三区| 精品国产伦一区二区三区观看体验| 三年中国国语在线播放免费| 日韩深夜视频| 亚洲国产日韩a在线播放| 亚洲一区二区在线观| 精品影院一区| 91色在线porny| 国产综合18久久久久久| 亚洲成人777777| 国产一区二区看久久| 国产精品揄拍500视频| 99久久久久久久久| 宅男噜噜噜66一区二区 | 成人美女视频| 精品日本美女福利在线观看| 日韩一区二区高清视频| 羞羞视频在线观看不卡| 亚洲精品亚洲人成人网| ijzzijzzij亚洲大全| 日韩在线免费电影| 成人免费一区二区三区在线观看| 婷婷五月色综合| 成人高清网站| 日本一区二区三级电影在线观看| 日韩欧美一区二区三区久久婷婷| 国产资源在线观看| 国产无一区二区| 亚洲高清在线播放| 日本在线播放| 亚洲视频一区二区在线观看| 26uuu成人| 污污视频在线| 亚洲成人一区二区在线观看| 欧美成人一区二区在线观看| 久草在线中文最新视频| 欧美日韩亚洲一区二区| 老头吃奶性行交视频| 日本免费一区二区三区四区| 91久久线看在观草草青青| 嫩草av久久伊人妇女超级a| 成人a在线观看高清电影| 欧美猛男超大videosgay| 在线观看av网页| 日韩视频一二区| 精品国产乱码久久久久久1区2区| 手机在线成人av| 蜜乳av综合| 日韩在线播放av| 精品欧美一区二区久久久久| 亚洲国产午夜| 日本免费久久高清视频| 亚洲天堂视频在线| 国产精品1区2区3区| 精品无人乱码一区二区三区的优势| 日韩在线免费看| 国产精品久线观看视频| 黄色片免费在线观看视频| free性m.freesex欧美| 欧美色视频日本高清在线观看| 欧美日韩大尺度| 日韩精品视频一区二区三区| 亚洲激情视频在线| 国产综合精品久久久久成人av| 中文字幕一区二区三三 | 一卡二卡3卡四卡高清精品视频| 黄色网页在线播放| 精品国产精品三级精品av网址| 日本www.色| 77成人影视| 中文字幕国产精品| 久久精品久久久久电影| 少妇被狂c下部羞羞漫画| 国产成人三级| 精品自在线视频| 日本熟女毛茸茸| 国产精品一区二区久久精品爱涩| 久久精精品视频| 成人毛片av在线| 日本乱人伦aⅴ精品| 在线观看网站黄| 国产99精品一区| 欧美激情高清视频| 亚洲天堂999| 91麻豆精品在线观看| 三上悠亚免费在线观看| 亚洲日本网址| 亚洲а∨天堂久久精品9966| 国产黄色录像片| 国产精品社区| 99视频在线免费观看| 1区2区3区在线观看| 午夜精品一区在线观看| 国产免费中文字幕| 国产区精品区| 欧美影院在线播放| 亚洲经典一区二区三区| 国产精品久久免费看| 午夜精品久久久内射近拍高清| 香蕉大人久久国产成人av| 中日韩美女免费视频网站在线观看 | 24小时成人在线视频| 亚洲欧美日韩天堂| 国产精品7777777| 国产成人自拍网| 中文字幕免费在线不卡| 不卡亚洲精品| 在线播放国产一区二区三区| 91视频免费网址| 成人h精品动漫一区二区三区| 天堂av在线中文| 国产成人亚洲一区二区三区| 一本色道久久88综合日韩精品| 五月天综合激情网| www.亚洲国产| 国产精品成人久久电影| 亚洲一区二区三区日本久久九| 久久天天躁狠狠躁老女人| a片在线免费观看| 国产人成一区二区三区影院| 成人久久久久久久久| 亚洲免费福利一区| 97精品视频在线| 天堂av中文字幕| 欧美日韩午夜剧场| 菠萝菠萝蜜网站| 亚洲精品女人| 欧美一区二区三区四区夜夜大片 | 国产福利片在线| 在线观看中文字幕不卡| 午夜影院黄色片| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品手机在线观看| 激情综合网址| 精品久久久久久一区| 欧美男男激情videos| 亚洲欧洲自拍偷拍| 日本丰满少妇做爰爽爽| 国产欧美一区视频| 红桃视频 国产| 欧美成人一区二免费视频软件| 国产91精品入口17c| 黑人精品视频| 亚洲欧美日韩天堂一区二区| 午夜一级黄色片| 欧美激情一区二区在线| 在线观看免费av网址| 欧美日韩亚洲三区| 久久久久高清| 国产综合色激情| 欧美精品制服第一页| 特黄视频在线观看| 欧美日韩精品综合在线| 欧美人妻精品一区二区三区| 99久久99久久免费精品蜜臀| 久久精品国产精品亚洲色婷婷| av伊人久久| av免费观看久久| 成人午夜视屏| 欧美大秀在线观看| 精品乱码一区二区三四区视频 | 日韩美女激情视频| 二区三区在线观看| 亚洲精品97久久| 在线观看中文字幕码| 亚洲成人免费av| ass极品国模人体欣赏| 成人一区二区三区在线观看| 天天操天天爱天天爽| 伊人狠狠色j香婷婷综合| 日韩欧美亚洲精品| 97久久综合区小说区图片区| 国产精品久久久久久久久久久不卡| 成人日批视频| 亚洲天堂男人天堂女人天堂| www.精品视频| 欧美日韩久久一区二区| 国产日产精品一区二区三区| 亚洲天堂a在线| 女~淫辱の触手3d动漫| 国产精品一级在线| 999精品视频在线| 亚洲福利免费| 国产一二三四五| 国产一区日韩| 国产一区二区三区色淫影院| 高清精品久久| 国产精品色视频| 天堂中文在线播放| 欧美激情一二三| 黄色网址在线免费| 一区二区在线视频| 四虎影视在线播放| 欧美成人性战久久| 国产有码在线观看| 欧美亚一区二区| 亚洲伊人成人网| 亚洲成人1区2区| 澳门黄色一级片| 综合亚洲深深色噜噜狠狠网站| 免费无码一区二区三区| 国产成人在线免费观看| 天堂av2020| 久久精品国产秦先生| 无码人妻丰满熟妇区毛片18| 一本色道88久久加勒比精品| 久久久久99精品成人片| 欧美精品日本| 青草全福视在线| 欧美国产91| 爱爱爱视频网站| 天天精品视频| 国产系列第一页| 久久久久久久久国产一区| 在线观看欧美激情| 欧美韩日高清| 国产一区一区三区| 久久久久久久久久久妇女| aaa免费在线观看| 91成人观看| 欧美日韩中文字幕在线播放| 欧美成人中文| 91黄色在线看| 亚洲精选国产| 成人久久久久久久久| 久久亚洲风情| 国产一区二区在线免费播放| 六月婷婷色综合| 日韩a一级欧美一级| 国产91精品露脸国语对白| 影音先锋资源av| 26uuu色噜噜精品一区| 国产精品揄拍100视频| 日本一区二区三区视频视频| 免费精品在线视频| 亚洲精品福利视频网站| 久久精品国产亚洲av香蕉| 精品久久在线播放| 国产性生活视频| 欧美日韩另类一区| 性猛交富婆╳xxx乱大交天津 | 欧洲av一区二区嗯嗯嗯啊| 无码人妻丰满熟妇奶水区码| 欧美日韩午夜在线| 亚洲xxx在线| 亚洲欧美一区二区激情| 在线观看av的网站| 欧美激情久久久久| 欧美日韩视频免费观看| 国产在线一区二区三区| 成人台湾亚洲精品一区二区 | 中文字幕人妻一区二区三区| 91麻豆产精品久久久久久| 少妇高潮惨叫久久久久| 亚洲一区影音先锋| 无码免费一区二区三区| 91麻豆精品国产| 亚洲欧美一区二区三| 最新日韩中文字幕| wwwww亚洲| 国产精品一区二区3区| xxxx日韩| 亚洲一区二区在线看| aa国产精品| 91视频这里只有精品| 成人aa视频在线观看| 亚洲女人毛茸茸高潮| 天天色天天操综合| 国产人妖一区二区三区| 亚洲美女av黄| 深夜国产在线播放| 国产精品久久久久久久久久东京| 白嫩白嫩国产精品| 中文字幕久精品免| 天堂成人国产精品一区| 欧美一级大片免费看| 中日韩av电影| 日本在线播放视频| 久久夜色电影| 97久久精品午夜一区二区| 深爱激情综合网| 婷婷五月综合缴情在线视频| 青青草视频一区| 人体私拍套图hdxxxx| 亚洲精品成人在线| 一级黄色片在线看| 亚洲视频在线观看网站| 国内高清免费在线视频| 成人精品在线视频| 成人一区二区| 成年网站在线免费观看| 成人久久18免费网站麻豆| 成年人二级毛片| 欧美色图一区二区三区| 日本在线视频1区| 91精品国产色综合久久不卡98| 日本99精品| 超级碰在线观看| 久久激五月天综合精品| 欧美老女人性生活视频| 91久久精品网| 欧美91精品久久久久国产性生爱| 午夜精品视频在线| 国产区精品视频在线观看豆花| 国产免费xxx| 国产剧情一区在线| 爱爱视频免费在线观看| 欧美精选在线播放| 免费日本一区二区三区视频| 成人国产精品一区| 天天做天天爱天天爽综合网| 一级片视频免费观看| 中文字幕久久午夜不卡| 中文字幕有码av| 五月综合激情| 欧美高清精品一区二区| 亚洲欧美日韩国产手机在线| 国产精品无码免费播放| 精品国模在线视频| 国产视频一区二| 少妇高潮大叫好爽喷水| 国产成人在线电影| 国产在线观看99| 亚洲成人精品久久久| 97超碰免费在线| 国产日韩在线一区二区三区| 中文精品视频| mm131丰满少妇人体欣赏图| 日本乱人伦aⅴ精品| 欧美日韩在线资源| 亚洲一区二区三区视频播放| 欧美精品观看| 97人妻精品一区二区三区免| 在线免费一区三区| 国内精品久久久久久野外| 亚洲精品免费一区二区三区| 欧美三级午夜理伦三级中文幕| 久久午夜夜伦鲁鲁片| 欧美性少妇18aaaa视频| 91xxx在线观看| 91色p视频在线| 亚洲黄色影院| 麻豆精品免费视频| 欧美日本一区二区三区| 成人短视频在线| 久久久久久国产精品mv| 日本亚洲三级在线| 9999热视频| 日韩精品中文字幕久久臀| 成人激情视屏| 女人被男人躁得好爽免费视频| 91亚洲国产成人精品一区二三| 欧美一区二区三区不卡视频| 欧美成人激情视频| 爽爽窝窝午夜精品一区二区| 成人亚洲精品777777大片| 亚洲一区二区三区四区在线观看 | 国产欧美日韩在线| 99国产精品久久久久99打野战| 91国自产精品中文字幕亚洲| 清纯唯美日韩| 蜜臀视频在线观看| 欧美三级在线视频| 丁香花高清在线观看完整版| 日韩三级电影| eeuss影院一区二区三区| 国产精品久久久久久久免费| 91精品国产自产91精品| 亚洲深深色噜噜狠狠爱网站| 成年人免费观看视频网站|