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

攜程商旅在 Atomic Css 下的探索

開發(fā) 前端
未來Css-In-Js 的 Atomic Css 解決方案無論是在業(yè)務代碼還是基礎 Components 中一定會是一個不錯的方案。

作者簡介

19組清風,攜程資深前端開發(fā)工程師,負責商旅前端公共基礎平臺建設,關注NodeJs、研究效能領域。

一、引言

三年前 Facebook 開始思考在目前設計系統(tǒng)下面臨的問題,那時它們在前端項目、系統(tǒng)組件等部分使用的是 cssmodule 的樣式方案。

直至今日,F(xiàn)acebook 已經(jīng)將所有的 Web 前端使用 React 進行重寫的同時,也使用了一種新的 Atomic Css-in-JS 對于它們的 Css 方案進行了重寫。

最近,F(xiàn)acebook 團隊開源了他們內(nèi)部的 Atomic Css 解決方案:stylex,正是這套解決方案讓 Facebook 首頁樣式文件體積減少了至少 80%。

這篇文章中我們就著 Atomic Css 來聊聊 Facebook 最近剛好開源的 stylex。

二、Atomic Css

2.1 概念

Atomic Css 是一種通過為每個樣式聲明創(chuàng)建一個規(guī)則來減少定義規(guī)則總量的方法。

舉一個不是那么恰當?shù)睦樱热缯f你可以將 Atomic 理解為 a、b、c... 一個一個原子化的字母,而每一個元素最終生效的樣式則是通過 a、b、c... 這樣一個一個原子化的字母拼接而來。

假設我們想要得到一個長寬為百分百、背景色為紅色的正方形,那么使用 Atomic Css 的方式來表示的話:

.w-full { width: 100%; };
.h-full { height: 100% };
.bg-red { backgroundColor: red }
<div class="w-full h-full bg-red">Square</div>

2.2 權衡

在Acss首次提出 Atomic Css 的實現(xiàn)方案后,之后有關于 Atomic Css 的相關討論以及實踐在前端社區(qū)內(nèi)就如雨后春筍般四處開花。

無論是 Acss、Unocss、Tailwind 等等之類 Css 庫,其實歸根結底都是來源于同一個實現(xiàn)思路:Atmoic Css,那么 Atomic Css 究竟有什么好處呢?

接下來,聊聊我們關于 Atomic Css 的看法。

2.2.1 多 Npm Package 下的樣式復雜性

我所在的團隊日常除了常規(guī)的前端頁面開發(fā)外,還負責了以下兩個方面:

  • 日常項目中和業(yè)務強相關的偏業(yè)務性組件。
  • 日常項目中和業(yè)務無關性質(zhì)的基礎性組件。

無論是在業(yè)務還是基礎組件的開發(fā)和維護上,如何縮減相關組件體積以至于可以和使用到該組件的不同業(yè)務團隊最小化的結合一直是我們在尋求的目標。

舉一個比較簡單的例子,假設我們在開發(fā)一個 Button 組件的同時定義了一個 corp-button 的樣式:

.corp-button {
    height: 100%;
    width:  100%;
}

此時當我們再次開發(fā)另一個 input 組件時,大多時候我們其實會經(jīng)常用到 height:100%; width:100% 的樣式,傳統(tǒng)的 Scoped Css 解決方案下難免我們會重新定義一份樣式聲明:

.corp-input {
    height: 100%;
    width: 100%;
    font-weight: 500;
}

顯而易見,往往在同一份組件庫代碼中不同的 class 定義存在無數(shù)重復的樣式聲明,無論是 CssModule 還是 Css-In-Js 都無法將這部分重復樣式聲明在構建/運行時刪除掉。

上邊的情況只是在單一存儲庫中很常見的問題,我們團隊日常負責的 NpmPackage 遠遠不止一個,所以 Atomic Css 的概念可以幫助解決這個問題。

只要可以保證 Atomic 原子性,那么無論是存在多少 Package ,也可以在項目中最大程度的保證這份樣式文件的復用。

舉一個簡單的例子,比如上述的 corp-button 使用 atomic css 的方案,可以拆分為更加原子化的 class 聲明:

.w-full {
    width: 100%;
};
.h-full {
    height: 100%;
}


.corp-button => Compiled => .w-full .h-full

而在 input 組件中同樣可以使用拆分后的 atomic:

.font-normal {
    font-weight: 500;
}


.corp-input => Compiled => .w-full .h-full .font-normal

這種情況下,Atomic Css 可以大大減少調(diào)用方在使用不同 Npm Package 下的樣式文件體積,從而對于頁面加載性能來說是一種極大的提升。

2.2.2 單一項目復雜度上升時的樣式文件體積

往往大多數(shù)前端團隊由于歷史、規(guī)模原因,無法左右依賴組件方的技術架構方案。

與其息息相關更多的是隨著頻繁、快速的業(yè)務迭代,帶來樣式文件復雜度直線上升的問題。

那么怎么解釋這里的樣式文件復雜度直接上升的問題呢,我們來看一個稍微抽象的例子。

比如 A 同學在負責 ProjectA 項目,跟隨著頻繁的業(yè)務迭代難免一直會有新的頁面、功能增加到現(xiàn)有的項目中。

那么,對于前端工程師來說,隨著需求的頻繁增加,難免需要增加很多個新的 class 來編寫這部分新增的樣式。

傳統(tǒng)的 CssModule 以及 Css-In-Js 方案,可以讓我們在 class 的聲明上無需考慮新命名和舊命名重復的問題,但它仍無法解決隨著新的需求到來,仍然會增加新的樣式聲明內(nèi)容,從而帶來更大的樣式文件體積影響頁面性能。

如果我們使用 Atomic 方案來處理 Css 文件的話,無論在多么頻繁的需求迭代背景下,樣式文件體積并不會跟隨項目復雜度而直線上升,原子化的 Css 文件體積到達一個極限的拐點之后會漸漸趨于平穩(wěn)。

上面的描述稍微有些抽象,但是并不難理解。就好比如果在項目中需要增加一個背景色為紅色,寬高均為百分五十的 div 時,在之前的方案中我們會直接聲明:

.new-demand-block {
    width: 50%;
    height: 50%;
    background: red;
}

最終構建之后的樣式文件中,會加入 .new-demand-block 這部分的樣式。

而如果使用 Aotmic Css 的方案,由于之前已經(jīng)定義過 width:50%、height:50%、background:red 的 Atomic Class ,所以新的樣式文件中并不會存在這些根據(jù)新需求而來的樣式。

不過有些同學會疑惑,這不是會將樣式文件體積轉化到了 HTML 中去了嗎?

實際的確是這樣,但是這也僅僅是首屏 HTML 會攜帶這部分 Atomic ClassName。同時對于 HTML 模版中的相同 Atomic Css,Gzip 會幫我們把這部分重復的 ClassName 壓縮到一個足夠小的體積。

2.2.3 日常業(yè)務交付標準下的樣式復用“錯亂”性

同樣,Atomic Css 方案還有一個和日常開發(fā)息息相關的影響點。

相信絕大多數(shù)開發(fā)同學都會碰到,伴隨著新需求上線或者修復某些 Bug 的同時,突然發(fā)現(xiàn)影響了之前已經(jīng)經(jīng)過驗證的頁面樣式。

這也是 Utility Css 會帶來的問題,為了節(jié)省樣式體積或是節(jié)約開發(fā)成本,我們往往會選擇在項目中復用相同類型的樣式。

但是隨著項目日積月累,我們會面臨修改這部分樣式時帶來的隱患:修改 A 模塊的 class 樣式內(nèi)容,或許會影響到 B、C 等模塊。

這無異對于開發(fā)還是測試來說都是一種災難,Atomic Css 的出現(xiàn)可以很好地幫助我們解決這個問題。

每一處的元素都是由一個一個 Atomic 組成的樣式,在編寫新的 Css 聲明時由于已經(jīng)是 Atomic 方案,所以大可不必擔心樣式體積的冗余而抽離一些 Utility Css。

自然,當我們修改某一處樣式文件內(nèi)容時,也完全無需擔心會影響到別的地方,因為每次我們修改的并不是 class 代表的意義,而是使用一個一個 Atomic Class 來拼裝獲得當前元素最終的樣式。

當前,如果你能保證你團隊的樣式系統(tǒng)是百分百的標準,以及 Utility 的聲明非常規(guī)范化,Atomic Css 在這個問題下的解決方案就稍微顯得有些牽強。不過在我看來,絕大多數(shù)業(yè)務項目由于客觀原因,是無法和組件庫之類的對齊做到百分百的樣式系統(tǒng)規(guī)范化。

2.3 成果 

樣式文件體積過大,?直是攜程商旅在性能上存在的痛點,我們也在積極探索通過 Atomic 的方式尋找更好的用戶體驗。目前我們在國際站 Trip.Biz 已經(jīng)從 CssModule 的方案全量切入 Atomic 方案,在樣式文件體積上取得了指數(shù)級變化的成果。 

比如同樣為 App 端首頁,在采用 Atomic 方案后的國際站首頁對比 CssModule 方案的國內(nèi)站首頁,相似的頁面樣式下,國際站首頁在首屏渲染時僅需要加載 13.2KB 樣式文件,而國內(nèi) App 端首頁則需要加載 694KB 樣式文件, 前后對比首屏需要加載的樣式文件體積足足相差 96% 。 

在國內(nèi)站的改版頁面中,同樣也取得了顯著的成果。比如在商旅 PC新版大首頁中,前后同樣一個查詢框業(yè)務組件,在使用了 Atomic 方案之后,新版首頁中查詢框組件所需要的樣式規(guī)則完全可以被項目覆蓋,最終單個查詢框組件跟隨頁面編譯后的樣式文件體積可以趨近于0。

三、Stylex

3.1 開始之前

Atmoic Css 在 stylex 出現(xiàn)之前也有許多優(yōu)秀的解決方案,比如 Tailwind、WindCss、UnoCss 等。

我們團隊目前在使用的也并非 stylex 而是 Tailwind ,這篇文章更多是和大家介紹 Stylex 的用法以及我個人對于 stylex 的一些見解。

我們完全不用片面的認為 Atomic Css 就一定是 Tailwind 或者 Stylex 之類的某種實現(xiàn)框架。

無論 tailwind 還是 stylex ,他們都是 Atomic Css 方案的不同實現(xiàn)方案而已,至于應該選擇哪一種框架來實現(xiàn) Atomic Css ,更多還是根據(jù)大家各自團隊中的實際情況來見仁見智。

究竟是 Utility 方式的 Tailwind 還是 Css-In-Js 方式的 Stylex ,哪一種更優(yōu)秀,這篇文章中并不會討論。討論這些,就好比我在告訴你應該使用 Vue 還是 React 來寫前端一樣。

3.2 簡介

stylex是 Facebook 最近開源的一套 Css-In-Js 的 Atomic Css 解決方案。

Stylex 的工作原理是通過 Babel 在編譯階段將編寫的 Css-In-JS 代碼生成一個一個 Atomic Css 樣式,為輸出的元素增加這些 classname 的同時最終輸出在樣式文件中。雖然寫法上和 Css-In-Js 類似,但是 stylex 幾乎沒有任何運行時的成本。

同時對于需要結合不同變量增加不同樣式的運行時場景,Stylex 會在必要時根據(jù)不同條件來快速的生成組件的類名字符串,添加到對應元素中。

3.3 stylex.create/stylex.props

我們可以通過 stylex.create 方法創(chuàng)建 Atomic 樣式內(nèi)容,從而使用 stylex.props 將 stylex.create 方法生成的 Atomic Css 應用到元素上。

比如:

import * as stylex from '@stylexjs/stylex';


// stylex.create 創(chuàng)建樣式內(nèi)容
const styles = stylex.create({
  root: {
    backgroundColor: 'red',
    padding: '1rem',
    paddingInlineStart: '2rem'
  },
  title: {
    backgroundColor: 'blue'
  },
  dynamic: (opacity) => ({
    opacity
  })
});


function HomePage() {
  return (
    // stylex.props 應用創(chuàng)建的樣式內(nèi)容到元素上
    <div {...stylex.props(styles.root)}>
      <h2 {...stylex.props(styles.title)}>Stylex</h2>
      <p {...stylex.props(styles.dynamic(0.2))}>
        Introduction to the basics of stylex.
      </p>
    </div>
  );
}


export default HomePage;

上邊的代碼經(jīng)過編譯后的 Css 樣式文件輸出如下:

.x1uz70x1:not(#\#){padding:1rem}
.x1t391ir:not(#\#):not(#\#){background-color:blue}
.xrkmrrc:not(#\#):not(#\#){background-color:red}
.x1u4uod0:not(#\#):not(#\#){opacity:var(--opacity,revert)}
.xld8u84:not(#\#):not(#\#){padding-inline-start:2rem}

我們可以看到對于 stylex.create 創(chuàng)建的樣式內(nèi)容,均被編譯成為了一個一個 Atomic Css 的 classname。

同時對于頁面上的元素,在經(jīng)過 stylex 的 babel 插件編譯后,元素的 classname 上會增加上一個又一個編譯后的 Atomic classname:

圖片

唯一需要注意的一點是:在 p 標簽中我們使用了 styles.dynamic,它表示一個動態(tài)生成的 Css 透明度樣式。

透過上述編譯后的內(nèi)容,我們可以清楚地看到在 stylex 內(nèi)部是將這部分需要運行時生成的 Css 樣式內(nèi)容的值,編譯為了 Css 變量的形式。

從而對于需要使用到動態(tài) Css 變量的元素,動態(tài)替換它的 Css 變量值從而實現(xiàn)更新元素樣式的效果,這個實現(xiàn)思路還是比較巧妙的。

3.4 stylex.defineVars/stylex.createTheme

3.4.1 stylex.defineVars

stylex 中還提供了 defineVars Api 來幫助我們快速定義樣式變量的值。

// src/components/ButtonTokens.stylex.ts
import * as stylex from '@stylexjs/stylex';


// 通過 stylex 定義一系列 Button 相關樣式變量
export const buttonTokens = stylex.defineVars({
  bgColor: 'green',
  textColor: 'red',
  cornerRadius: '4px',
  paddingBlock: '4px',
  paddingInline: '8px'
});


// src/components/Button.ts
import * as stylex from '@stylexjs/stylex';
import './ButtonTokens.stylex';
import { buttonTokens } from './ButtonTokens.stylex';


const styles = stylex.create({
  base: {
    borderWidth: 0,
    backgroundColor: buttonTokens.bgColor,
    color: buttonTokens.textColor,
    borderRadius: buttonTokens.cornerRadius,
    paddingBlock: buttonTokens.paddingBlock,
    paddingInline: buttonTokens.paddingInline
  }
});
function Button() {
  return <button {...stylex.props(styles.base)}>This is Single Button</button>;
}


export default Button;

需要額外注意的是,官網(wǎng)文檔中明確標注關于 defineVars 方法需要滿足在文件名為 .stylex.js/*.stylex.ts 的文件中被具名導出。

需要注意雖然文檔上沒提,但是 import './ButtonTokens.stylex'; 必不可少。如果缺少這句導入,實際樣式內(nèi)容并不會正常顯示。

此時頁面中的 Button :

圖片

圖片

3.4.2 stylex.createTheme

stylex.createTheme 接受兩個參數(shù),第一個參數(shù)為通過 defineVars 創(chuàng)建的變量集合,第二個參數(shù)為用于覆蓋第一個參數(shù)的值,它是一個對象。

我們可以通過 stylex.createTheme 創(chuàng)建一個 StyleXStyles 對象,從而提供給 stylesx.props 方法使用。

同時,我們也可以使用stylex.createTheme來通過覆蓋stylex.defineVars 聲明的變量,從而創(chuàng)建主題,比如:

我們對上述的按鈕稍作修改,讓按鈕可以支持一個自定義主題的傳入:

import * as stylex from '@stylexjs/stylex';
import './ButtonTokens.stylex';
import { buttonTokens } from './ButtonTokens.stylex';


const styles = stylex.create({
  base: {
    borderWidth: 0,
    backgroundColor: buttonTokens.bgColor,
    color: buttonTokens.textColor,
    borderRadius: buttonTokens.cornerRadius,
    paddingBlock: buttonTokens.paddingBlock,
    paddingInline: buttonTokens.paddingInline
  }
});


// Button 組件可以額外接受一個 theme 的主題
function Button(props: { theme?: stylex.Theme<typeof buttonTokens> }) {
  return (
    <button {...stylex.props(props.theme, styles.base)}>
      This is Single Button
    </button>
  );
}


export default Button;

然后再將使用 Button 的地方稍做修改:

import * as stylex from '@stylexjs/stylex';
import Button from './components/Button';
import { buttonTokens } from './components/ButtonTokens.stylex';


const otherTheme = stylex.createTheme(buttonTokens, {
  bgColor: '#000',
  textColor: 'yellow',
  cornerRadius: '4px',
  paddingBlock: '4px',
  paddingInline: '8px'
});


function HomePage() {
  return (
    <div>
      {/* 未傳入特定主題,使用默認主題 */}
      <Button />
      {/* 傳入特定主題,覆蓋原本主題 */}
      <Button theme={otherTheme} />
    </div>
  );
}


export default HomePage;

此時,頁面上會出現(xiàn)兩個不同主題的按鈕:

圖片

實際上 createTheme 對于默認的 defineVars 的覆蓋,也是通過 Css 變量優(yōu)先級來確定主題優(yōu)先級的:

圖片

圖片

紅色文字按鈕的樣式變量,來源于 defineVars 的全局 Css 變量,而黃色按鈕通過在元素上編譯為同樣的  Css 變量的方式,自然優(yōu)先級會比全局 Css 更高。

四、展望

以上和大家簡單聊 stylex 的 Api,以及它的基本使用姿勢。

目前我們對于 stylex 也并沒有太多的實踐經(jīng)驗,看起來相較于目前流行的 Tailwind 這種類似 Utility Css 的 atomic css 方案, Css-In-Js 的解決方案在代碼組織上,以及類型約束上,的確對于代碼的可讀性以及組織性會更加便攜一些。

不過 stylex 現(xiàn)階段無論是從構建生態(tài)、內(nèi)置實現(xiàn)(比如#197,#40 都是我在編寫 Demo 時碰到的一些問題)來說,可能對于在生產(chǎn)應用上使用還是有所欠缺。

總的來講,未來Css-In-Js 的 Atomic Css 解決方案無論是在業(yè)務代碼還是基礎 Components 中一定會是一個不錯的方案。

后續(xù)我們也會關注 stylex 的更新,并帶來更多關于 stylex 的實踐,希望本文的內(nèi)容可以幫助到大家。

責任編輯:張燕妮 來源: 攜程技術
相關推薦

2024-12-18 10:03:30

2024-12-26 09:27:51

2017-02-23 21:17:00

致遠

2023-06-06 11:49:24

2023-10-27 09:34:34

攜程應用

2024-11-05 09:56:30

2022-06-17 10:44:49

實體鏈接系統(tǒng)旅游AI知識圖譜攜程

2023-08-18 10:49:14

開發(fā)攜程

2022-08-06 08:23:47

云計算公有云廠商成本

2023-07-07 12:26:39

攜程開發(fā)

2014-12-25 17:51:07

2024-03-22 15:09:32

2024-04-18 09:41:53

2022-07-21 19:36:35

樂高攜程前端

2017-07-06 19:57:11

AndroidMVP攜程酒店

2023-06-06 16:01:00

Web優(yōu)化

2023-11-13 11:27:58

攜程可視化

2022-11-29 20:32:07

2022-04-07 17:30:31

Flutter攜程火車票渲染
點贊
收藏

51CTO技術棧公眾號

日本黄色a视频| 久久久久久久久爱| 久久人人爽av| 四虎av在线| www.日韩大片| 久久99国产综合精品女同| 成人免费播放视频| 成人av影院在线观看| www国产成人| 日本乱人伦a精品| 蜜桃传媒一区二区亚洲| 亚洲欧洲日韩精品在线| 亚洲一区免费观看| 欧美男人的天堂| 国产又粗又长又黄| 国内在线观看一区二区三区| 日韩电影中文字幕在线| 男女视频在线看| 性xxxfreexxxx性欧美| 99免费精品视频| 国产精品第10页| 日本aⅴ在线观看| 西瓜成人精品人成网站| 欧美女孩性生活视频| 免费在线看黄色片| 成人在线观看一区| 粉嫩蜜臀av国产精品网站| 日本人成精品视频在线| 国产a免费视频| 国产欧美一区二区三区精品观看| 这里是久久伊人| 久久美女福利视频| 黄网站在线免费看| 久久嫩草精品久久久精品一| 3d精品h动漫啪啪一区二区| 久久黄色精品视频| 欧美91福利在线观看| 亚洲欧洲黄色网| 在线一区二区不卡| 2020日本在线视频中文字幕| 亚洲欧洲性图库| 欧美日韩在线播放一区二区| 亚洲a视频在线观看| 日本伊人午夜精品| 9.1国产丝袜在线观看| 国产日韩欧美在线观看视频| 免费av一区| 精品国产免费一区二区三区四区| 91色国产在线| 深夜福利视频一区二区| 一区二区三区中文字幕| 日韩亚洲欧美精品| 久久国产精品高清一区二区三区| 国产成人综合在线| 成人免费视频网址| 亚洲婷婷久久综合| 久久精品伊人| 2020欧美日韩在线视频| 日韩免费一二三区| 欧美777四色影| 久久精品国产一区二区电影| 神马久久久久久久久久久| 亚州精品视频| 亚洲成人精品视频| 日本精品一二三| 国产精品igao视频网网址不卡日韩| 色婷婷精品久久二区二区蜜臀av| 国产精品后入内射日本在线观看| 免费在线看污片| 亚洲精品成a人| 国产又粗又长又爽视频| 国产午夜精品久久久久免费视| 国产精品视频线看| 久久国产精品高清| 青青青草网站免费视频在线观看| 91美女片黄在线观看91美女| 韩国久久久久| 亚洲成人精品在线| 日本一级大毛片a一| 一区三区自拍| 日韩免费成人网| 性折磨bdsm欧美激情另类| 国产日本亚洲| 日韩午夜激情电影| www日本在线观看| 国产精品高潮呻吟久久久久| 亚洲大胆人体av| 国产二级一片内射视频播放 | 国产做受高潮69| 欧美成欧美va| 亚洲黄色三级| 奇门遁甲1982国语版免费观看高清 | 久久亚洲精品爱爱| 欧美日韩一级片在线观看| 一区二区不卡在线观看| 国产最新在线| 亚洲高清久久久| 97成人在线观看视频| 高清av一区二区三区| 欧美日韩电影在线| 亚洲精品乱码久久久久久9色| 亚洲网址在线观看| 亚洲精品日韩欧美| 五月天婷婷丁香网| 欧美日一区二区在线观看| 久久免费国产精品1| 6080午夜伦理| 久久99精品久久久久婷婷| 亚洲综合在线播放| 神马午夜一区二区| 国产视频一区二区在线| 精品嫩模一区二区三区| а√天堂8资源中文在线| 91福利国产精品| 91香蕉国产线在线观看| 精品国产18久久久久久洗澡| 国产一区二区三区在线视频| 午夜免费激情视频| 久久久xxx| 亚洲自拍偷拍一区| 美女欧美视频在线观看免费| 亚洲美女免费在线| 一区二区传媒有限公司| 91精品国产一区二区在线观看 | 有坂深雪av一区二区精品| 人妻av中文系列| 亚洲精品tv| 日韩精品在线播放| 日韩一级片大全| 久久精品在线| 国产在线欧美日韩| 国产区在线观看| 色综合激情五月| 少妇搡bbbb搡bbb搡打电话| 成人短片线上看| 韩国精品久久久999| 亚洲熟女乱色一区二区三区久久久| 成人免费高清在线| av不卡在线免费观看| 电影网一区二区| 精品久久久久久久久久久久久久久| 亚洲精品成人av久久| 麻豆91精品| 久99久在线| 丁香花电影在线观看完整版| 欧美剧情片在线观看| 色哟哟精品观看| 91久久亚洲| 99精品国产一区二区| 黄网站免费在线播放| 欧美三级视频在线| 搡老熟女老女人一区二区| 欧美日本精品| 亚洲综合中文字幕在线观看| 在线观看免费黄色| 色综合久久久久| 噜噜噜在线视频| 伊人久久久大香线蕉综合直播 | 一级黄色片在线播放| 久久久久久久久久电影| 欧美亚洲另类色图| 国产精品香蕉| 国a精品视频大全| 亚洲av无码国产精品永久一区| 亚洲图片你懂的| 久久成年人网站| 66久久国产| 91美女片黄在线观看游戏| h视频在线观看免费| 在线视频中文字幕一区二区| 欧美大波大乳巨大乳| 美女视频一区免费观看| 久久国产主播精品| 国内激情视频在线观看| 亚洲精品动漫久久久久| 日本道在线观看| 99精品久久免费看蜜臀剧情介绍| 久久久久久久中文| 亚洲成人一品| 国产精品黄视频| www在线免费观看| 欧美日韩国产天堂| 国产精品99久久久久久成人| 国产在线视视频有精品| 精品一区二区三区毛片| 99久久香蕉| 欧美在线观看视频| 电影av在线| 欧美一区午夜视频在线观看 | 中文字幕一区二区av| 91中文在线视频| 51漫画成人app入口| 亚洲欧洲午夜一线一品| 青青艹在线观看| 亚洲视频中文字幕| 麻豆免费在线观看视频| 一区二区91| 亚洲国产一区二区精品视频| 不卡一区视频| 国内精品在线一区| 国产三级在线免费| 日韩欧美一级片| 国产专区第一页| 国产精品天干天干在线综合| 久久精品无码一区二区三区毛片| 136国产福利精品导航网址| 欧美精品成人一区二区在线观看 | 精品福利在线视频| 手机免费看av| 国产一区二区伦理片| 美女日批免费视频| 欧美激情电影| 91精品国产99久久久久久红楼| 男人av在线播放| 中文字幕久精品免费视频| av男人天堂av| 色综合天天综合网天天狠天天| 我要看一级黄色录像| 99久久伊人精品| 91在线第一页| 肉丝袜脚交视频一区二区| 麻豆映画在线观看| 国产99久久| 成人动漫视频在线观看免费| 最新欧美电影| 欧美极品美女视频网站在线观看免费| 搞黄视频在线观看| 日韩精品在线一区二区| 自拍偷拍校园春色| 亚洲三级电影全部在线观看高清| 麻豆av免费观看| 成人三级在线视频| 57pao国产成永久免费视频| 免费亚洲网站| 久久亚洲精品无码va白人极品| 欧美伦理影院| 国产一区二区三区四区hd| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | www.99久久热国产日韩欧美.com| 亚洲第一页视频| 欧美色手机在线观看| √资源天堂中文在线| 一区二区三区国产| 无码人妻精品中文字幕| 26uuu国产日韩综合| 亚洲成人精品在线播放| 国内成人精品2018免费看| 亚欧在线免费观看| 亚洲制服av| 成人免费毛片网| 伊人网伊人影院| 日韩中文字幕区一区有砖一区| 日韩在线观看a| 欧美1区2区视频| 国产高清免费在线| 色乱码一区二区三区网站| 欧美一区二区三区四区五区六区 | 熟妇高潮一区二区| 国产一区91精品张津瑜| 色啦啦av综合| 蜜桃精品在线观看| 99福利在线观看| 亚洲欧美日本日韩| 精品少妇人妻av免费久久洗澡| 黄色在线一区| 欧美精品久久久久久久久久久| 国产精品mv在线观看| 亚洲精品天堂成人片av在线播放| 希岛爱理av一区二区三区| 一本色道久久综合亚洲二区三区| 菠萝蜜一区二区| 伊甸园精品99久久久久久| 99精品全国免费观看视频软件| 正在播放一区二区三区| 99久久精品网| 日韩人妻精品一区二区三区| 最新国产精品久久久| 久久久久久久9| 中文日韩欧美| 四虎永久在线精品无码视频| 日本亚洲最大的色成网站www| 三年中国国语在线播放免费| 久久国产精品区| 亚洲精品一区二区18漫画| 成人高清视频在线观看| 可以直接看的无码av| 久久九九99视频| 日本黄区免费视频观看| 亚洲日本在线视频观看| 久久久久久蜜桃| 欧美日韩国产麻豆| 奴色虐av一区二区三区| 欧美精品高清视频| 亚洲乱码精品久久久久..| 国产视频亚洲视频| 在线播放毛片| 久久全球大尺度高清视频| 黑人巨大精品| 成人免费福利在线| 免费看久久久| 一本一道久久a久久精品综合 | 欧美123区| 国产精品视频地址| 日本综合精品一区| 高清国语自产拍免费一区二区三区 | 亚洲韩国一区二区三区| 91丝袜一区二区三区| 欧美蜜桃一区二区三区| 手机在线观看毛片| 中文字幕亚洲一区在线观看 | 欧美激情a在线| 丝袜美腿诱惑一区二区三区| 91在线短视频| 欧美精品一区二区久久| 中国老女人av| 噜噜噜在线观看免费视频日韩 | 91精品国产aⅴ一区二区| 国产视频在线一区| 亚洲精品v天堂中文字幕| 69av在线| 91国产中文字幕| 亚洲精品伦理| 久久99精品久久久久久青青日本| av一区二区高清| 人妻无码久久一区二区三区免费| 蜜桃av一区二区| 日韩成人av一区二区| 国产精品剧情在线亚洲| 国产九色在线播放九色| 欧美一级二级在线观看| 搞黄视频免费在线观看| 国内精品视频久久| 国产精品一区二区美女视频免费看| 欧美大陆一区二区| 国产综合自拍| 在线观看国产中文字幕| 成人教育av在线| 影音先锋男人资源在线观看| 色综合久久久久综合体| 成人午夜免费福利| 免费97视频在线精品国自产拍| 亚洲承认视频| 国产精品日韩欧美一区二区三区| 欧美gvvideo网站| 国模吧无码一区二区三区 | 国产成人精品电影| 久久精品凹凸全集| 4444亚洲人成无码网在线观看| 久久国产日韩欧美精品| 免费看黄色三级| 欧美午夜影院在线视频| 日本高清视频在线| 欧美激情综合色综合啪啪五月| 亚洲视频精选| 一区二区不卡在线视频 午夜欧美不卡'| 久久国产福利| 丰满少妇一区二区| 疯狂蹂躏欧美一区二区精品| 天天舔天天干天天操| 久久免费在线观看| 国产精东传媒成人av电影| 嫩草影院中文字幕| 国产91丝袜在线播放九色| 久久国产精品波多野结衣av| 欧美xxxx老人做受| 制服丝袜中文字幕在线| 亚洲综合一区二区不卡| 欧美 日韩 国产一区二区在线视频| 91国内在线播放| 自拍偷自拍亚洲精品播放| 国产视频手机在线观看| 欧美另类老女人| 亚洲精品观看| 国产96在线 | 亚洲| 久久一区二区三区国产精品| 亚洲婷婷综合网| 中文字幕亚洲欧美一区二区三区| 久久99国产精品二区高清软件| 一区二区三区四区不卡| 久久成人av少妇免费| 亚洲国产精品免费在线观看| 精品久久国产老人久久综合| 国产精品探花在线| 91蜜桃网站免费观看| 国内视频精品| 日本一区二区在线免费观看| 色综合久久久网| 婷婷激情在线| 国产精品一区二区3区| 性欧美欧美巨大69| 免费高清视频在线观看| 精品久久久一区二区| 日韩在线无毛| 国产成人一区二区三区电影| 92国产精品久久久久首页| 伊人久久大香线蕉无限次| 97超碰人人爽| 欧美日韩中文字幕在线视频| 淫片在线观看| 精品一区二区三区视频日产|