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

探索組件庫設計的無限可能性

數據庫 其他數據庫
目前,ZjDesign業務組件庫正在不斷豐富中。我們努力開發具有高擴展性和低上手成本的組件。并且組件庫已有多個新項目接入,整體開發效率明顯提升,減少了重復開發。

1. 前言

當前端開發團隊面臨業務的不斷增長和項目數量的持續增加時,兩個主要問題逐漸凸顯:1.業務組件復用的挑戰;2. 代碼一致性和質量維護問題。前端團隊為了解決這些問題,通常會選擇構建業務組件庫。其主要目標是:

  • 提高開發效率:開發人員可以在不同項目中復用組件,從而減少重復工作,提高開發效率。
  • 保持一致的代碼實現:可以確保在不同項目中使用相同的代碼實現,避免了風格不一致和質量差異。
  • 質量保障:組件庫中的組件經過嚴格驗證和測試,能夠提供高質量的代碼。
  • 易于維護和升級:作為獨立的模塊,業務組件庫更容易進行維護和升級,使開發人員能夠更專注于組件庫本身的質量。
  • 知識共享和技術積累:組件庫可以成為團隊共享技術知識和經驗的平臺,幫助提升整體的技術水平。

因此,構建業務組件庫有助于解決業務組件復用、代碼統一性和質量維護等問題,為不斷發展的業務環境提供了高效、統一和可維護的開發流程。

2. 實現分析

在構建業務組件庫時,需要深入調研和選擇適當的技術方案,驗證方案的可行性,最終將各個解決方案集成到一起,以實現高效的組件庫開發和維護。下面我們將通過整體架構、構建、質量監控、站點搭建、組件質量、組件SOP這六大模塊對我們的業務組件庫進行分析。

圖片圖片

3. 整體架構設計

對于業務組件庫的整體架構設計而言,核心問題是業務組件庫的代碼時如何來組織和管理。首先,我們把代碼倉庫建好。業界一般會把同一類組件庫用單個倉庫的形式維護,并且把組件開發成NPM包的形式,這里的重點是,你要考慮把所有的組件打包成一個大的NPM包,還是分割是一個個獨立的小NPM包。不要小看這個問題,這兩種選擇會使倉庫的目錄結構有不小的差異,進一步又會影響到后面組件的開發,構建,發布,實現的技術設計。

業界組件庫的架構常見單包和多包兩種。單包適合簡單場景,組件集中在一個庫中。多包則將組件分成獨立包,適應多項目需求,增強靈活性和復用性。

3.1單包是什么

把所有的組件看成一個整體,一起打包發布。單個倉庫,單個包,統一維護統一管理。

? 優點

  1. 可以通過相對路徑實現組件與組件之間的引用,公共代碼之間的引用
  2. 維護成本低,只維護一套package.json配置

? 缺點

  1. 組件完全耦合,必須把它作為一個整體統一發包,就算只改一個非常小的功能,都要對整個包發布更新
  2. 搭建場景重復打包

      比如說Antd,它就是作為一個整體的包來盡進行管理的。選擇使用單包架構的話,那么你就必須提供按需加載的能力,以降低使用者的成本,你可以考慮支持ESModules的Treeshaking的功能來實現按需加載的能力。當然你也可以選擇另外一種方案,叫做"多包架構"。

3.2多包是什么

每個組件彼此獨立,單獨打包發布,單個倉庫多個包,統一維護單獨管理。

? 優點

    組件發布靈活,并且大然支持按需使用

? 缺點

  1. 維護成本高,每個組件都需要一套package配置。
  2. 組件與組件之間物理隔離,對于相互依賴,公共代碼抽象等場景,就只能通過NPM包引用的方式來實現。
  3. 多依賴多版本問題
  4. 常用邏輯片段/各個組件都需要的依賴和邏輯

在這些場景下的開發統一發布,相對來說沒那么方便,多包架構在業界稱之為"Monorepo"。

圖片圖片

3.3結論

ZjDesign組件庫使用場景比較特殊,組件之間的依賴關系比較強,互相會組合形式新的組件,所以在這里選用的單包開發模式進行開發。單包開發模式可以減少我們開發維護成本,開發工作量的減少,提升組件之間的引用效率。

4. 組件庫構建

當你確定了整體架構之后,就可以開始具體的功能點實現了。業務組件庫要求整體框架提供基礎的技術能力。

圖片

4.1項目打包

提到構建工具,大家肯定一下會想到很多一堆工具:webapck、gulp、rollup等。網上有很多文章分析它們分別更適合哪些場景,webpack更適合打包組件庫、應用程序之類的應用,而rollup更適合打包純js的類庫。下面我們來對比一下webpack和rollup兩者的區別。

?rollup使用流程

  1. 無需考慮瀏覽器兼容問題,開發者寫esm代碼 -> rollup通過入口,遞歸識別esm模塊 ->  最終打包成一個或多個bundle.js -> 瀏覽器直接可以支持引入
  2. 需考慮瀏覽器兼容問題,可能會比較復雜,需要用額外的polyfill庫,或結合webpack使用

打包成npm包:

  1. 開發者寫esm代碼 -> rollup通過入口,遞歸識別esm模塊 -> (可以支持配置輸出多種格式的模塊,如esm、cjs、umd、amd)最終打包成一個或多個bundle.js
  2. (開發者要寫cjs也可以,需要插件@rollup/plugin-commonjs)初步看來
  3. 很明顯,rollup 比較適合打包js庫(react、vue等的源代碼庫都是rollup打包的)或 高版本無需往下兼容的瀏覽器應用程序(現在2022年了,時間越往后,遷移到rollup會越多,猜測)
  4. 這樣打包出來的庫,可以充分使用上esm的tree shaking,使源庫體積最小

?webpack和rollup打包比對

let foo = () => {

 let x = 1;

 if (false) {

 console.log("never reached");

 }

 let a = 3;

 return a;

};

let baz = () => {

 var x = 1;

 console.log(x);

 post();

 function unused() {

 return 5;

 }

 return x;

 let c = x + 3;

 return c;

};

baz();

測試對比兩個打包工具對Dead Code的打包結果

       打包對比結果:中間是源代碼,左邊是rollup打包結果,右邊是webpack打包結果對比。

圖片圖片

webpack打包效果(有很多注入代碼)

  1. 實際上,我們自己寫的代碼在最下面。上面注入的大段代碼 都是webpack自己的兼容代碼,目的是自己實現require,modules.exports,export,讓瀏覽器可以兼容cjs和esm語法
  2. 可以理解為,webpack自己實現polyfill支持模塊語法,rollup是利用高版本瀏覽器原生支持esm(所以rollup無需代碼注入)

       具體細節rollup和webapck的源碼實現差異在這里不做過多贅述,大家可以自己深入研究。

? 構建出 esm、cjs 格式

選擇Rollup來打包組件庫,需要有幾點注意:

  1. 配置包格式為 esm、cjs、umd
  2. external 掉vue,組件庫不建議將 Vue 打包進去

rollup 配置如下:

{
    input: file,
    output: {
      compact: true,
      file:  `lib/index.js`,
      format: 'es',
      name,
      sourcemap: false,
      globals: {
        echarts: 'echarts',
        vue: 'Vue'
      }
    },
    external: [
      'echarts', 'vue'
    ],
    plugins: [
      replace({
        'process.env.NODE_ENV': JSON.stringify('production')
      }),
      vue({
        css: false,
        template: {
          isProduction: true
        },
        modules: true,
        styles: {
          scoped: true,
          trim: true
        }
      }),
      postcss({
        extract: true,
        modules: false,
        scoped: true,
        sourceMap: false,
        autoModules: true,
        plugins: [
          simplevars(),
          nested(),
          cssnano(),
          base64({
            extensions: ['.png', '.jpeg', '.jpg', '.gif'],
            root: './assets/'
          }),
          autoprefixer({
            add: true
          })
        ],
        extensions: ['.css', '.less'],
        use: {
          less: {
            javascriptEnabled: true
          }
        }
      }),
      babel({
        runtimeHelpers: true,
        exclude: 'node_modules/**',
        plugins: [
          ['@babel/plugin-proposal-optional-chaining', { loose: false }]
        ],
        presets: [
          ['@babel/preset-env', { targets: '> 0.25%, not dead' }]
        ]
      }),
      url({
        limit: 10 * 1024,
        emitFiles: true
      }),
      progress(),
      buble({
        transforms: { forOf: false }
      }),
      uglify({
        ie8: true
      })
    ]
}

4.2 版本控制

組件庫發布版本號的管理是很重要的,如何來維護我們的版本號?只能動手在package.json中修改嗎?其實可以在打包執行命令的時候,通過命令及參數幫助我們實現自動升級版本號的目的。比如我們在打測試環境包的時候可以使用(cross-env用來指定變量NODE_ENV的值)。

"scripts": {
  "test": "npm version patch && cross-env NODE_ENV=testing node build/build.js"
}

下面我們來看看npm version命令具體的使用方式:npm采用了semver規范作為依賴版本管理方案。semver約定一個包的版本號必須包含3個數字。

MAJOR.MINOR.PATCH 意思是 主版本號.小版本號.修訂版本號

MAJOR 對應大的版本號迭代,做了不兼容舊版的修改時要更新MAJOR版本號

MINOR  對應小版本迭代,發生兼容舊版API的修改或功能更新時,更新MINOR版本號

PATCH 對應修訂版本號,一般針對修復BUG的版本號

當我們每次發布包的時候都需要升級版本號:

"scripts": {
    "rollup": "rollup -c rollup.config.js",
    "publish:major": "npm version major && npm publish",
    "publish:minor": "npm version minor && npm publish",
    "publish:patch": "npm version patch && npm publish",
    "publish:beta": "npm version prerelease --preid=beta && npm publish --tag=beta"
  },

4.3發布

npm包發布使用之家npm進行發布,發布流程如下:

1. 首先需要配置私有包,配置一次即可
$ npm config set @auto:ZjDesign http://xxxx.com/


2. 使用如下命令在私有倉庫中添加用戶(配置一次即可)
npm adduser --registry http://xxxx.com/


3. 執行打包命令
npm run rollup


4.私有包發布
npm publish --registry http://xxxx.com/

5. 組件搭建實例

       首先看一下我們單個組件UI設計圖。從圖中可以看出,每個組件實例demo可以看成抽象五大模塊。1.組件的title+subtitle、2.組件描述、3.多個組件形態展示、4.設計原則與頁面布局、5.單個組件形態的代碼示例。

圖片圖片

5.1組件demo整體目錄

圖片圖片

index.zh-CN.md: 作為靜態數據的快速輸出,包含組件名稱、描述、設計原則和API。從.md格式文件中可以使用插件md(vite插件)解析出組件需要的數據,這個在后面單獨講解實現細節。

圖片圖片

單個組件類型文件:包含組件排序,title,描述,html。這個通過docs進行數據的解析,具體解析后面進行詳細講解。

圖片圖片

5.2Docs插件

作用:將單例中的.vue文件中docs標簽數據進行格式處理,docs插件流程圖。

圖片圖片

實現代碼:

export default (options: Options = {}): Plugin => {
  const { root, markdown } = options
  const vueToMarkdown = createVueToMarkdownRenderFn(root)
  const markdownToVue = createMarkdownToVueRenderFn(root, markdown)
  return {
    name: 'vueToMdToVue',
    async transform(code, id) {
      if (id.endsWith('.vue') && id.indexOf('/demo/') > -1 && id.indexOf('index.vue') === -1) {
        const res = vueToMarkdown(code, id)
        return {
          code: res.ignore ? res.vueSrc : (await markdownToVue(res.vueSrc, id)).vueSrc,
          map: null
        }
      }
    }
  }
}

vueToMarkdown函數實現:這里面使用了lru-cache進行緩存處理,對于已經解析完成的文件進行跟蹤,這樣可以加快文檔展示。通過fetchCode方法對自定義標簽內容進行獲取。

5.3 MarkDown插件

作用:將markdown文檔格式數據轉化成我們想要的vue格式化數據。

這里主要通過對第三方markdown-it,依據UI設計的要求進行定制化的修改。可以支持輸入emoji,anchor,toc分別使用markdown-it-emoji、markdown-it-anchor、markdown-it-table-of-contents插件。

? md插件實現流程

1、定義插件導出,基于vite的Plugin進行封裝:

import { createMarkdownToVueRenderFn } from './markdownToVue';
import type { MarkdownOptions } from './markdown/markdown';
import type { Plugin } from 'vite';


interface Options {
  root?: string;
  markdown?: MarkdownOptions;
}


export default (options: Options = {}): Plugin => {
  const { root, markdown } = options;
  const markdownToVue = createMarkdownToVueRenderFn(root, markdown);
  return {
    name: 'mdToVue',
    async transform(code, id) {
      if (id.endsWith('.md')) {
        // transform .md files into vueSrc so plugin-vue can handle it
        return { code: (await markdownToVue(code, id)).vueSrc, map: null };
      }
    },
  };
};

2、markdownToVue核心思想實現:

通過lru-cache進行解析文檔的緩存處理,使用gray-matter對docs格式數據的解析,最后生成demo-box組件格式的vue文件。

export function createMarkdownToVueRenderFn(root: string = process.cwd(), options: MarkdownOptions = {}) {
  const md = createMarkdownRenderer(options)
  return async (src: string, file: string): Promise=> {
    const relativePath = slash(path.relative(root, file))
    const cached = cache.get(src)
    if (cached) {
      debug(`[cache hit] ${relativePath}`)
      return cached
    }
    const start = Date.now()
    const { content, data: frontmatter } = matter(src)
    // eslint-disable-next-line prefer-const
    let { html, data } = md.render(content)
    // avoid env variables being replaced by vite
    html = html.replace(/import\.meta/g, 'import.meta').replace(/process\.env/g, 'process.env')
    // TODO validate data.links?
    const pageData: PageData = {
      title: inferTitle(frontmatter, content),
      description: inferDescription(frontmatter),
      frontmatter,
      headers: data.headers,
      relativePath,
      content: escapeHtml(content),
      html,
      // TODO use git timestamp?
    lastUpdated: Math.round(fs.statSync(file).mtimeMs)
    }
    const newContent = data.vueCode
      ? await genComponentCode(md, data, pageData)
      : `${html}${fetchCode(content, 'style')}`
    debug(`[render] ${file} in ${Date.now() - start}ms.`)
    const result = {
      vueSrc: newContent?.trim(),
      pageData
    }
    cache.set(src, result)
    return result
  }
}

6. 組件沉淀-SOP

在開發組件并將其沉淀為組件庫時,建立合適的SOP機制可以提高開發效率、保持一致性,并促進團隊合作。以下是從組件設計到溝通、開發、沉淀為組件庫的SOP機制:

圖片圖片

? 組件設計:

設計同學進行界面設計,定義組件統一規范。根據多個業務方進行公共組件的提取,確定組件的用途、功能。

?評審:

設計同學和研發同學進行組件設計UI的評審,研發同學定義組件的輸入和輸出,以及可能的配置項。并且進行編寫組件的詳細需求文檔,包括示例代碼和用法示例。

? 開發階段:

根據組件設計和需求文檔,進行組件的開發。使用規范的編碼風格和最佳實踐。在開發過程中進行單元測試和集成測試,確保組件的穩定性和正確性。

? 文檔編寫:

編寫組件的文檔,包括組件的用途、API文檔、示例代碼等。提供詳細的使用說明,幫助其他開發人員使用組件。

? CODE-REVIEW:

使用版本管理工具(如Git)來管理組件的代碼。進行代碼審查,確保代碼質量和一致性。

? 測試與驗收:

在真實項目中測試組件,確認其在不同場景下的穩定性和可用性。進行驗收測試,確保組件滿足預期要求。設計同學進行UI驗收。

? 發布:

根據版本號規則,發布組件庫的新版本。定期更新組件庫,修復bug、添加新功能等。

7. 總結

目前,ZjDesign業務組件庫正在不斷豐富中。我們努力開發具有高擴展性和低上手成本的組件。并且組件庫已有多個新項目接入,整體開發效率明顯提升,減少了重復開發。組件庫的搭建為團隊提供了一個統一的技術平臺,促進了知識分享和合作。這一系列改進加速了產品交付,并推動了整體開發流程的提升。

作者簡介

何彪何彪


■ 主機廠事業部-技術部-數科技術團隊

■2023年2月加入汽車之家,目前任職于主機廠事業部-技術部-數科技術團隊,主要負責數科前端業務,組件庫搭建等工作。

責任編輯:武曉燕 來源: 之家技術
相關推薦

2023-09-27 22:53:04

圖像處理是開源Java

2016-09-21 09:16:55

Qlik

2023-01-13 21:13:31

AI人工智能醫療

2011-04-20 10:07:15

2022-12-30 07:40:12

DeepKitTypeScript靜態類型

2011-04-18 13:43:42

2012-06-04 13:28:51

AndroidChrome OS

2025-07-09 02:10:00

2021-09-29 18:59:42

戴爾

2021-02-20 12:04:51

比特幣區塊鏈美元

2018-03-02 11:38:11

2024-10-28 14:05:00

2019-04-15 10:30:38

程序員技能開發者

2019-04-22 08:57:46

硅谷996ICU

2020-08-11 09:38:40

微信蘋果美國

2018-11-26 09:48:57

服務器異常宕機

2011-04-18 13:47:59

ECC私鑰

2020-05-15 13:42:03

物聯網人工智能軍事物聯網

2013-03-19 11:13:14

Google廣告SXSW

2025-08-27 01:41:00

點贊
收藏

51CTO技術棧公眾號

黄色视屏网站在线免费观看| 国产精品久久久久久久妇| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 日韩在线播放一区二区| 日韩在线小视频| 亚洲av无一区二区三区久久| 欧美aaaaa性bbbbb小妇| 亚洲视频一区在线| 欧美二区三区在线| 国产伦精品一区二区三区视频痴汉 | 97久久久精品综合88久久| 国产精品美女久久| 国产一级视频在线| 日韩视频在线观看| 日韩av在线免播放器| 亚洲天堂网2018| 中文字幕一区久| 亚洲精品成人精品456| 三级三级久久三级久久18| wwwav网站| 奇米四色…亚洲| 97精品视频在线| 动漫性做爰视频| 人人狠狠综合久久亚洲婷| 亚洲成人网在线| 天天干天天曰天天操| 一呦二呦三呦精品国产| 香蕉久久一区二区不卡无毒影院 | 欧美特黄一区| 日韩一区二区三区在线播放| 超碰97人人干| 操欧美女人视频| 欧美一区二视频| 午夜精品免费看| 高清欧美日韩| 欧美亚洲日本国产| 久久精品网站视频| 电影一区二区三区| 黑人与娇小精品av专区| 久草视频国产在线| 欧美xxxx视频| 一区二区高清在线| 成人免费在线视频播放| 最新av在线播放| 亚洲视频在线观看三级| 国产免费色视频| 免费在线观看黄| 亚洲色图20p| 中文字幕日韩一区二区三区不卡 | 国产精品理论在线观看| 日产国产精品精品a∨ | 欧美黑人性视频| 中文字幕亚洲欧美日韩| 欧美fxxxxxx另类| 欧美国产日韩一区| 国产亚洲欧美精品久久久www| 欧美涩涩网站| 欧美激情一区二区三区高清视频| 免费三片在线播放| 亚洲一级黄色| 91a在线视频| 国产一级免费视频| 丝袜美腿亚洲综合| 国产乱肥老妇国产一区二| 亚洲自拍偷拍另类| 国模无码大尺度一区二区三区 | 欧美freesex8一10精品| 日韩福利在线播放| 一级黄色录像毛片| 99久久婷婷| 欧美激情一区二区三区高清视频| 中文字幕在线观看免费视频| 美女精品在线观看| 国产视频福利一区| 亚洲av无码乱码国产精品| 成人av电影在线播放| 日韩av电影免费播放| 国产在线观看a| 五月婷婷激情综合| 在线免费观看av的网站| 99精品国产九九国产精品| 精品久久久久久久久久久久久久久 | 国产视频网站在线| 中文字幕佐山爱一区二区免费| 日韩一级片一区二区| 日本免费一区二区六区| 欧美性xxxxx极品少妇| 永久免费黄色片| 美女网站色精品尤物极品姐弟| 亚洲人在线视频| 裸体武打性艳史| 久久aⅴ乱码一区二区三区| 91精品国产综合久久男男| www.香蕉视频| 欧美国产国产综合| 日本男女交配视频| 成人四虎影院| 日韩激情视频在线播放| 99久久婷婷国产综合| 米奇777在线欧美播放| 91久久国产精品| 婷婷国产在线| 亚洲精品视频在线观看免费| 日韩亚洲在线视频| 一区二区亚洲视频| 日韩中文字幕视频| 国产精品乱子伦| 国产在线精品一区二区三区不卡| 鲁片一区二区三区| 国产蜜臀av在线播放| 欧美色图12p| 国产伦精品一区二区三区妓女| 在线电影一区二区| 国产精品久久久亚洲| 午夜视频在线播放| 亚洲自拍偷拍麻豆| 一级黄色高清视频| 色中色综合网| 国产精品aaaa| 欧美色18zzzzxxxxx| 亚洲福利电影网| 特种兵之深入敌后| 偷偷www综合久久久久久久| 日本aⅴ大伊香蕉精品视频| 丰满肉肉bbwwbbww| 一区二区三区四区在线| 久久久久久综合网| 日韩美女一区二区三区在线观看| 欧美在线视频观看免费网站| 狠狠综合久久av一区二区| 尤物在线观看一区| 夜夜爽久久精品91| 五月精品视频| 91精品国产综合久久久久久蜜臀| 成人jjav| 欧美午夜影院一区| 亚洲成人网在线播放| 亚洲一区二区免费看| 国内成+人亚洲| 182在线视频观看| 亚洲国产欧美一区二区丝袜黑人 | 菠萝蜜视频国产在线播放| 欧美日韩精品一区视频| 人与动物性xxxx| 免费人成黄页网站在线一区二区| 欧美在线视频一区二区三区| 黑人巨大精品| 夜夜嗨av色综合久久久综合网| 国产一级片免费视频| 国产欧美日韩在线看| 超碰av在线免费观看| jizzjizz欧美69巨大| 国产精品一区=区| 无遮挡的视频在线观看| 91精品国产综合久久小美女| 外国一级黄色片| 高清国产午夜精品久久久久久| 青青青青在线视频| 色天下一区二区三区| 国产成人免费av| 欧美尤物美女在线| 日韩欧美在线一区二区三区| 欧美三根一起进三p| 不卡的av中国片| 日韩在线xxx| 日韩激情一区| 亚洲mm色国产网站| 国产盗摄一区二区| 亚洲欧美另类国产| 国产一区二区三区在线观看| 一级中文字幕一区二区| 中文字幕5566| 奇米888四色在线精品| 麻豆传媒网站在线观看| 欧美xxxx在线| 国产精品久久一| 天堂成人av| 亚洲欧美激情视频| 一区不卡在线观看| 亚洲国产色一区| 东方伊人免费在线观看| 国产一区欧美一区| 噜噜噜久久亚洲精品国产品麻豆 | 久久精品视频中文字幕| 肥臀熟女一区二区三区| 91福利国产精品| 激情五月婷婷小说| 国产欧美日产一区| 第一页在线视频| 日欧美一区二区| 国产一级大片免费看| 国产成人ay| 成人羞羞视频免费| 久久电影天堂| 97精品视频在线| 国产91在线视频蝌蚪| 亚洲男人的天堂网站| 精品人妻无码一区二区| 色婷婷综合久久久久中文| 久久久久久久久精| 国产精品麻豆网站| 好吊日免费视频| 国产成人在线免费观看| 一道本视频在线观看| 亚洲激情社区| 特级西西人体www高清大胆| 国产区精品区| 激情小说网站亚洲综合网| 99久久999| 国产精品欧美日韩一区二区| 精品极品在线| 欧美激情乱人伦| 色综合久久影院| 亚洲欧美日韩高清| 日韩一区二区三区不卡| 日韩一区二区高清| 国产一区二区三区在线观看| 欧日韩精品视频| 日本韩国欧美中文字幕| 亚洲一区二区成人在线观看| 国产在线观看免费视频软件| 久久久国产午夜精品| 加勒比精品视频| 国产99久久久国产精品潘金网站| 国产精品v日韩精品v在线观看| 久久综合九色| 熟女性饥渴一区二区三区| 日韩天天综合| 日韩在线观看a| 国产中文一区| 韩日视频在线观看| 亚洲国内精品| 久草热视频在线观看| 国产欧美高清| 日韩视频第二页| 久久精品亚洲一区二区| 欧美日韩第二页| 香蕉久久久久久久av网站| 国产男女无遮挡| 麻豆九一精品爱看视频在线观看免费| 欧美在线一区视频| 亚洲美女一区| www.com毛片| 久久精品女人天堂| 欧美成人黄色网址| 蜜桃视频在线观看一区二区| 午夜两性免费视频| 麻豆视频一区二区| 亚洲美女爱爱视频| 国产精品一二三在| 人妻体体内射精一区二区| 国产精品77777竹菊影视小说| 性色av浪潮av| 成人爱爱电影网址| 实拍女处破www免费看| 国产网红主播福利一区二区| 性猛交ⅹxxx富婆video| 亚洲欧美综合网| 久久影院一区二区| 日韩欧美在线字幕| 中文字幕一区二区久久人妻| 欧美精选一区二区| 亚洲AV无码精品自拍| 日韩精品久久久久| 99re在线视频| 色综合色综合网色综合| 欧美巨大丰满猛性社交| 国产精品对白刺激| www.久久爱.com| 国产一区二区视频在线免费观看| 亚州av日韩av| 一区二区在线中文字幕电影视频 | 俄罗斯av网站| 美女一区二区三区| 18禁一区二区三区| 久久亚洲欧美国产精品乐播 | 亚洲第一综合色| 中文字幕黄色片| 制服丝袜一区二区三区| 日韩在线一区二区三区四区| 国产一区二区日韩| av毛片在线免费| 国产91色在线|| 国产亚洲高清在线观看| 精品久久久久久乱码天堂| 久久国产成人午夜av影院宅| 欧美中文字幕在线观看视频 | 国产又爽又黄的激情精品视频 | 免费视频一二三区| 色嗨嗨av一区二区三区| 精品国产乱码一区二区三| 亚洲欧美中文在线视频| av电影高清在线观看| 国产不卡在线观看| 视频欧美一区| 四虎永久国产精品| 中日韩男男gay无套| 国内自拍第二页| 91亚洲精品久久久蜜桃| tube国产麻豆| 欧美视频三区在线播放| 天天操天天干天天| 久久综合色88| 97精品国产综合久久久动漫日韩| 国产私拍一区| 一本一道久久a久久精品蜜桃| 日日碰狠狠躁久久躁婷婷| 粉嫩欧美一区二区三区高清影视| 国产精品视频看看| 91久久精品一区二区二区| 污污的视频网站在线观看| 欧美成人免费网| 欧美综合影院| 日韩av电影免费播放| 亚洲免费综合| 99精品一区二区三区无码吞精| 亚洲欧美日韩国产综合在线| 日本视频www色| 亚洲精品天天看| 136福利第一导航国产在线| 91传媒视频在线观看| 欧美电影免费| 九九热免费精品视频| 2020国产精品自拍| 国产视频91在线| 精品国产凹凸成av人导航| 影音先锋男人资源在线| 亚洲一区二区三区久久| 我不卡手机影院| 日本美女视频一区| 亚洲人成网站色在线观看| 国产精品高清无码| 一区二区三区国产在线观看| 深夜成人影院| 日本精品一区二区三区高清 久久| 日韩视频中文| 泷泽萝拉在线播放| 日本高清不卡aⅴ免费网站| 美丽的姑娘在线观看免费动漫| 欧美亚洲视频在线看网址| 秋霞蜜臀av久久电影网免费| 亚洲人精品午夜射精日韩| 91啪亚洲精品| 国产微拍精品一区| 亚洲女同性videos| 欧美性理论片在线观看片免费| 日韩久久久久久久久久久久久| 三级成人在线视频| 国产精品无码无卡无需播放器| 欧美三级视频在线| 大地资源网3页在线观看| 97影院在线午夜| 亚洲日本黄色| 国产精品成人一区二区三区电影毛片| 色94色欧美sute亚洲线路一ni| 国产高清av在线| 国产美女精彩久久| 综合精品久久| 性色av蜜臀av浪潮av老女人| 精品国产福利视频| 国产二区在线播放| 成人精品在线观看| 在线观看不卡| 一级黄色片大全| 欧美久久久久久久久中文字幕| 影音先锋在线视频| 久久久久久久久一区二区| 日韩成人免费看| 草视频在线观看| 日韩av网址在线| 国产乱子精品一区二区在线观看| 国产经典久久久| 91香蕉视频黄| 国产伦精品一区二区三区免.费| 久久久久久国产免费 | 成人午夜在线视频| 国产又粗又爽视频| 久久久精品视频在线观看| 成人自拍在线| 一级黄色香蕉视频| 亚洲精品国产一区二区精华液| 四虎影视2018在线播放alocalhost| 国产成人一区二区三区| 欧美1区视频| 免费人成又黄又爽又色| 91精品国产乱码| 欧美xxxxxx| 麻豆映画在线观看| 久久久99久久精品欧美| 99久久国产热无码精品免费| 欧美性受xxxx白人性爽| 亚洲女同一区| 亚洲一区视频在线播放| 亚洲精品一区二区三区精华液 | 日韩色在线观看| 3d性欧美动漫精品xxxx软件| av一区二区三区免费观看| 国产欧美一区二区精品性色| 日本精品一二区| 成人av电影天堂|