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

淺析Vite插件機制,你學會了嗎?

開發(fā) 前端
對于Vite來說,它是基于esbuild與rollup?雙引擎設計的,在開發(fā)階段使用esbuild?進行依賴預構建,然后基于瀏覽器原生支持的ESM?完成開發(fā)預覽,而在生產(chǎn)環(huán)境打包時,直接使用的rollup?構建。那么在這種背景下,Vite的插件機制應該如何設計?

前言

對于Vite來說,它是基于esbuild與rollup雙引擎設計的,在開發(fā)階段使用esbuild進行依賴預構建,然后基于瀏覽器原生支持的ESM完成開發(fā)預覽,而在生產(chǎn)環(huán)境打包時,直接使用的rollup構建。那么在這種背景下,Vite的插件機制應該如何設計?

在源碼中,我們能夠經(jīng)常看到PluginContainer的身影,Vite正是通過它來模擬rollup的行為

圖片

pluginContainer

PluginContainer 的 實現(xiàn) 基于借鑒于 WMR 中的 rollup-plugin-container.js ,主要功能有兩個:

  • 管理插件的生命周期
  • 實現(xiàn)插件鉤子內部的 Context 上下文對象

插件生命周期

在開發(fā)階段,vite會模擬rollup的行為,所以插件的執(zhí)行機制也與rollup相同

圖片圖片

  1. 調用 options 鉤子進行配置的轉換,得到處理后的配置對象。
  2. 調用buildStart鉤子,正式開始構建流程。
  3. 調用 resolveId 鉤子中解析文件路徑。(從 input 配置指定的入口文件開始)。
  4. 調用load鉤子加載模塊內容。
  5. 緊接著 Rollup 執(zhí)行所有的 transform 鉤子來對模塊內容進行進行自定義的轉換(比如 babel 轉譯)
  6. Rollup 拿到最后的模塊內容,進行 AST 分析,得到所有的 import 內容,調用 moduleParsed 鉤子
  7. 直到所有的 import 都解析完畢,Rollup 執(zhí)行buildEnd鉤子,Build 階段結束。

?

這里需要注意的是:在 vite 中由于 AST 分析是通過 esbuild 進行的,所有沒有模擬 moduleParsed 鉤子

傳遞上下文對象

上下文對象通過 Context 實現(xiàn) PluginContext 接口定義,PluginContext 實際上是 Rollup 內部定義的類型,可以在源碼中看到 vite 實現(xiàn)了 Rollup 上下文對象

class Context implements PluginContext {
  //... 具體實現(xiàn)
}

type PluginContext = Omit<
  RollupPluginContext, // Rollup 定義插件上下文接口
  // not documented
  | 'cache'
  // deprecated
  | 'moduleIds'
>

Context 上下文對象一共有 14 個核心方法,其中有 3 個方法是比較核心的方法

  • parse:使用 Rollup 的內部基于 SWC 的解析器將代碼解析為 AST
  • resolve:將相對路徑解析為絕對路徑,從而正確地處理模塊之間的引用
  • load:加載并解析與給定 ID 對應的模塊,并在提供的情況下附加附加的元信息到模塊

更多內容可以查看rollup文檔

rollup插件

rollup構建流程主要分為兩大類:build和output,build 階段主要負責創(chuàng)建模塊依賴圖,初始化各個模塊的 AST 以及模塊之間的依賴關系。output階段才是真正的打包構建過程

插件hook類型(構建階段)

通過構建流程rollup的hook類型可以分為:build hook和output hook兩大類

  • Build Hook即在Build階段執(zhí)行的鉤子函數(shù),在這個階段主要進行模塊代碼的轉換、AST 解析以及模塊依賴的解析,那么這個階段的 Hook 對于代碼的操作粒度一般為模塊級別,也就是單文件級別。
  • Ouput Hook(官方稱為Output Generation Hook),則主要進行代碼的打包,對于代碼而言,操作粒度一般為 chunk級別(一個 chunk 通常指很多文件打包到一起的產(chǎn)物)。

插件hook類型(執(zhí)行方式)

除了上面這種分類,rollup插件還可以根據(jù)各自的執(zhí)行方式來進行分類:

  • Build Hook即在Build階段執(zhí)行的鉤子函數(shù),在這個階段主要進行模塊代碼的轉換、AST 解析以及模塊依賴的解析,那么這個階段的 Hook 對于代碼的操作粒度一般為模塊級別,也就是單文件級別。
  • Ouput Hook(官方稱為Output Generation Hook),則主要進行代碼的打包,對于代碼而言,操作粒度一般為 chunk級別(一個 chunk 通常指很多文件打包到一起的產(chǎn)物)。

除了根據(jù)構建階段可以將 Rollup 插件進行分類,根據(jù)不同的 Hook 執(zhí)行方式也會有不同的分類,主要包括Async、Sync、Parallel、Squential、First這五種。在后文中我們將接觸各種各樣的插件 Hook,但無論哪個 Hook 都離不開這五種執(zhí)行方式。

1. Async & Sync

首先是Async和Sync鉤子函數(shù),兩者其實是相對的,分別代表異步和同步的鉤子函數(shù),這個很好理解。

2. Parallel

這里指并行的鉤子函數(shù)。如果有多個插件實現(xiàn)了這個鉤子的邏輯,一旦有鉤子函數(shù)是異步邏輯,則并發(fā)執(zhí)行鉤子函數(shù),不會等待當前鉤子完成(底層使用 Promise.all)。

比如對于Build階段的buildStart鉤子,它的執(zhí)行時機其實是在構建剛開始的時候,各個插件可以在這個鉤子當中做一些狀態(tài)的初始化操作,但其實插件之間的操作并不是相互依賴的,也就是可以并發(fā)執(zhí)行,從而提升構建性能。反之,對于需要依賴其他插件處理結果的情況就不適合用 Parallel 鉤子了,比如 transform。

3. Sequential

Sequential 指串行的鉤子函數(shù)。這種 Hook 往往適用于插件間處理結果相互依賴的情況,前一個插件 Hook 的返回值作為后續(xù)插件的入?yún)ⅲ@種情況就需要等待前一個插件執(zhí)行完 Hook,獲得其執(zhí)行結果,然后才能進行下一個插件相應 Hook 的調用,如transform。

4. First

如果有多個插件實現(xiàn)了這個 Hook,那么 Hook 將依次運行,直到返回一個非 null 或非 undefined 的值為止。比較典型的 Hook 是 resolveId,一旦有插件的 resolveId 返回了一個路徑,將停止執(zhí)行后續(xù)插件的 resolveId 邏輯。

通用hook

以下鉤子在服務器啟動時被調用:

  • options
  • buildStart

以下鉤子會在每個傳入模塊請求時被調用:

  • resolveId
  • load
  • transform

它們還有一個擴展的 options 參數(shù),包含其他特定于 Vite 的屬性。

以下鉤子在服務器關閉時被調用:

  • buildEnd
  • closeBundle

請注意 moduleParsed 鉤子在開發(fā)中是 不會 被調用的,因為 Vite 為了性能會避免完整的 AST 解析。

output階段的hook(除了 closeBundle) 在開發(fā)中是 不會 被調用的。你可以認為 Vite 的開發(fā)服務器只調用了 rollup.rollup() 而沒有調用 bundle.generate()。

Vite 獨有hook

Vite 插件也可以提供鉤子來服務于特定的 Vite 目標。當然這些鉤子會被 Rollup 忽略。

config

在解析 Vite 配置前調用。鉤子接收原始用戶配置(命令行選項指定的會與配置文件合并)和一個描述配置環(huán)境的變量,包含正在使用的 mode 和 command。它可以返回一個將被深度合并到現(xiàn)有配置中的部分配置對象,或者直接改變配置(如果默認的合并不能達到預期的結果)。

// 返回部分配置(推薦)
const partialConfigPlugin = () => ({
  name: 'nanjiu-plugin',
  config(config, { command }) {
    console.log('config', config, command)
  }
})

圖片圖片

需要注意的是:用戶插件在運行這個鉤子之前會被解析,因此在 config 鉤子中注入其他插件不會有任何效果。

configResolved

在解析 Vite 配置后調用。使用這個鉤子讀取和存儲最終解析的配置。

const examplePlugin = () => {
  let config

  return {
    name: 'read-config',

    configResolved(resolvedConfig) {
      // 存儲最終解析的配置
      config = resolvedConfig
    },

    // 在其他鉤子中使用存儲的配置
    transform(code, id) {
      if (config.command === 'serve') {
        // dev: 由開發(fā)服務器調用的插件
      } else {
        // build: 由 Rollup 調用的插件
      }
    },
  }
}

configureServer

是用于配置開發(fā)服務器的鉤子。最常見的用例是在內部 connect 應用程序中添加自定義中間件

const myPlugin = () => ({
  name: 'configure-server',
  configureServer(server) {
    server.middlewares.use((req, res, next) => {
      // 自定義請求處理...
    })
  },
})

configurePreviewServer

與 configureServer 相同,但用于預覽服務器。configurePreviewServer 這個鉤子與 configureServer 類似,也是在其他中間件安裝前被調用。如果你想要在其他中間件 之后 安裝一個插件,你可以從 configurePreviewServer 返回一個函數(shù),它將會在內部中間件被安裝之后再調用

const myPlugin = () => ({
  name: 'configure-preview-server',
  configurePreviewServer(server) {
    // 返回一個鉤子,會在其他中間件安裝完成后調用
    return () => {
      server.middlewares.use((req, res, next) => {
        // 自定義處理請求 ...
      })
    }
  },
})

transformIndexHtml

轉換 index.html 的專用鉤子。鉤子接收當前的 HTML 字符串和轉換上下文。上下文在開發(fā)期間暴露ViteDevServer實例,在構建期間暴露 Rollup 輸出的包。

這個鉤子可以是異步的,并且可以返回以下其中之一:

  • 經(jīng)過轉換的 HTML 字符串
  • 注入到現(xiàn)有 HTML 中的標簽描述符對象數(shù)組({ tag, attrs, children })。每個標簽也可以指定它應該被注入到哪里(默認是在 <head> 之前)
  • 一個包含 { html, tags } 的對象

默認情況下 order 是 undefined,這個鉤子會在 HTML 被轉換后應用。為了注入一個應該通過 Vite 插件管道的腳本, order: 'pre' 指將在處理 HTML 之前應用。order: 'post' 是在所有未定義的 order 的鉤子函數(shù)被應用后才應用。

const htmlPlugin = () => {
  return {
    name: 'nanjiu-plugin',
    transformIndexHtml(html) {
      return html.replace(/<title>(.*?)<\/title>/,
                          `<title> nanjiu plugin </title>`)
    },
  }
}

handleHotUpdate

執(zhí)行自定義 HMR 更新處理。鉤子接收一個帶有以下簽名的上下文對象

interface HmrContext {
  file: string
  timestamp: number
  modules: Array<ModuleNode>
  read: () => string | Promise<string>
  server: ViteDevServer
}
  • modules 是受更改文件影響的模塊數(shù)組。它是一個數(shù)組,因為單個文件可能映射到多個服務模塊(例如 Vue 單文件組件)。
  • read 這是一個異步讀函數(shù),它返回文件的內容。之所以這樣做,是因為在某些系統(tǒng)上,文件更改的回調函數(shù)可能會在編輯器完成文件更新之前過快地觸發(fā),并 fs.readFile 直接會返回空內容。傳入的 read 函數(shù)規(guī)范了這種行為。
const hotPlugin = () => {
  return {
    name: 'nanjiu-plugin',
    handleHotUpdate({ server, modules, timestamp}) {
      console.log('handleHotUpdate', modules)
    },
  }
}

當我修改App.vue文件時,modules可以獲取到如下信息:

圖片圖片

插件順序

一個 Vite 插件可以額外指定一個 enforce 屬性(類似于 webpack 加載器)來調整它的應用順序。enforce 的值可以是pre 或 post。解析后的插件將按照以下順序排列:

  • Alias
  • 帶有 enforce: 'pre' 的用戶插件
  • Vite 核心插件
  • 沒有 enforce 值的用戶插件
  • Vite 構建用的插件
  • 帶有 enforce: 'post' 的用戶插件
  • Vite 后置構建插件

請注意,這與鉤子的排序是分開的,鉤子的順序仍然會受到它們的 order 屬性的影響,這一點 和 Rollup 鉤子的表現(xiàn)一樣

總結

vite 在 開發(fā)環(huán)境中,會使用 createPluginContainer 方法創(chuàng)建插件容器,插件容器有兩個核心功能:管理插件生命周期、傳遞插件上下文

圖片圖片

責任編輯:武曉燕 來源: 前端南玖
相關推薦

2024-04-28 08:24:27

分布式架構Istio

2023-06-26 00:01:11

2023-05-04 08:01:35

umi 插件開發(fā)插件

2024-05-11 09:03:26

數(shù)據(jù)表級鎖事務

2024-01-19 08:25:38

死鎖Java通信

2023-07-26 13:11:21

ChatGPT平臺工具

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-01-10 08:43:15

定義DDD架構

2021-06-22 06:52:46

Vite 插件機制Rollup

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發(fā)編程

2023-01-30 09:01:54

圖表指南圖形化

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2023-10-10 11:04:11

Rust難點內存

2024-07-31 08:39:45

Git命令暫存區(qū)

2023-12-12 08:02:10

2024-05-06 00:00:00

InnoDBView隔離

2023-08-26 21:34:28

Spring源碼自定義

2022-07-13 08:16:49

RocketMQRPC日志
點贊
收藏

51CTO技術棧公眾號

亚洲国产一区二区在线| 国产激情综合五月久久| 欧洲成人午夜精品无码区久久| 自由的xxxx在线视频| 成人精品视频一区二区三区 | 日韩伦理电影网站| 97久久超碰国产精品| 国产精品在线看| 日韩xxx高潮hd| 天天射综合网视频| 国产午夜精品一区理论片飘花| www.51色.com| 朝桐光一区二区| 亚洲国产aⅴ天堂久久| 日韩久久久久久久| 天堂中文在线观看视频| 久久精品99国产精品| 91国产中文字幕| 农村妇女精品一区二区| 欧美日韩在线观看视频小说| 欧美变态口味重另类| 亚洲综合色在线观看| 国产伦久视频在线观看| 伊人开心综合网| 亚洲国产精品123| 美国一级片在线免费观看视频| 国产精品一区二区久激情瑜伽| 国产精品免费一区二区三区都可以| 国产精品二区一区二区aⅴ| 97精品一区| 国产亚洲精品高潮| 91网站免费视频| 麻豆精品99| 精品久久久三级丝袜| www.午夜av| 欧美aaaaaa| 欧美三级电影一区| 黑人粗进入欧美aaaaa| 人在线成免费视频| 天天色图综合网| 欧美高清中文字幕| 五月花成人网| 亚洲黄色av一区| 黄色录像特级片| gogo在线高清视频| 亚洲欧美日韩在线| 一级全黄肉体裸体全过程| 91精彩视频在线观看| 久久久久久久一区| 欧美最大成人综合网| 黄色美女网站在线观看| 久久一区二区三区四区| 蜜桃精品久久久久久久免费影院 | 成人豆花视频| 91精品国产日韩91久久久久久| 奇米视频888| 白嫩亚洲一区二区三区| 在线综合+亚洲+欧美中文字幕| 色一情一区二区| 91麻豆精品| 欧美一级xxx| 91精品又粗又猛又爽| 国产96在线亚洲| 日韩电影网在线| 亚洲欧洲久久久| 久久国产亚洲| 九九热最新视频//这里只有精品 | 99r国产精品视频| 国产黄频在线观看| 成人av动漫在线| 久久综合狠狠综合久久综青草| 三级国产在线观看| 欧美极品xxx| 国产系列第一页| 免费污视频在线观看| 欧美日韩性生活视频| 亚洲成熟丰满熟妇高潮xxxxx| 精品国产第一福利网站| 欧美亚洲综合色| 91丨porny丨九色| 欧美日韩导航| 中文字幕久久久| 久久成人国产精品入口| 欧美一级视频| 91免费看片在线| 在线观看xxx| 国产精品久久免费看| 国产欧美123| 深夜在线视频| 91.com在线观看| 欲求不满的岳中文字幕| 日本高清免费电影一区| 色综合老司机第九色激情| 黄色一级片免费看| 美日韩一级片在线观看| 国产精品视频一区二区三区经| 九色视频在线观看免费播放| 亚洲视频网在线直播| 看av免费毛片手机播放| 国产精品视频一区二区三区| 日韩av一区在线| 亚洲综合网在线| 日韩在线一区二区| 国产福利久久| 美女免费久久| 一本大道久久a久久综合| 国产精品探花在线播放| 国产精品美女久久久久久不卡 | 日韩电影中文字幕av| 91精品少妇一区二区三区蜜桃臀| 亚洲激情在线| 亚洲a中文字幕| 国产午夜精品一区理论片| 樱花草国产18久久久久| 污污动漫在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美成年人视频网站欧美| 国产性生活视频| 成人毛片老司机大片| 中文字幕综合在线观看| 亚洲欧洲高清| 亚洲精品一区二区三区在线观看| 国产精品国产三级国产传播| 久久久久国产精品一区三寸| 国产视频不卡| 国产高清在线a视频大全| 欧美日韩在线播| 一区二区三区伦理片| 日韩图片一区| 国产女人水真多18毛片18精品| 国产激情在线| 在线成人免费视频| 三级av在线免费观看| 美女www一区二区| 任我爽在线视频精品一| 男人av在线播放| 日韩成人在线观看| 精品成人久久久| fc2成人免费人成在线观看播放| 天天想你在线观看完整版电影免费| 久久亚洲人体| 这里只有精品在线播放| 国产91av在线播放| 亚洲国产精品二十页| 九九视频精品在线观看| 国产精品一区2区3区| 国产成人精品999| 高清av在线| 精品视频在线看| 最新黄色av网址| 国产在线看一区| 亚洲激情免费视频| 综合伊人久久| 久久人91精品久久久久久不卡 | 欧美在线一级| 日韩网站在线观看| 国产成人三级在线播放| 亚洲精品国产第一综合99久久 | 国产哺乳奶水91在线播放| 亚洲欧美日韩中文字幕一区二区三区| 污免费在线观看| 欧美日韩亚洲国产精品| 国产欧美日韩在线播放| 免费看男女www网站入口在线 | 欧美日韩国产片| 天海翼在线视频| 国产suv精品一区二区三区| 国产真实老熟女无套内射| 国产无遮挡裸体免费久久| 91chinesevideo永久地址| 九色视频网站在线观看| 在线观看91精品国产麻豆| 久久久精品99| 久久久精品综合| 亚洲妇熟xx妇色黄蜜桃| 欧美特黄一区| 日本欧美色综合网站免费| 免费成人黄色网| 久久久久久久久久亚洲| 国产中文在线| 欧美一级午夜免费电影| 免费看日韩毛片| 中文字幕第一区第二区| 性折磨bdsm欧美激情另类| 亚洲美女少妇无套啪啪呻吟| 午夜精品区一区二区三| 8x国产一区二区三区精品推荐| 欧美亚洲成人xxx| 男人和女人做事情在线视频网站免费观看| 日韩女优视频免费观看| 精品国产xxx| 亚洲精品成人在线| 欧美图片第一页| 国产精品一区二区不卡| 日韩人妻精品无码一区二区三区| 999国产精品999久久久久久| 精品久久久久久中文字幕动漫| 国产精品美女午夜爽爽| 性欧美xxxx交| 超碰公开在线| 亚洲欧洲第一视频| 午夜精品无码一区二区三区| 91国产精品成人| 国产一级一片免费播放| 欧美国产日韩精品免费观看| 韩国三级视频在线观看| 麻豆传媒一区二区三区| 亚洲 高清 成人 动漫| 亚洲最大av| 视频一区二区三区在线观看| aaa国产精品| 91夜夜未满十八勿入爽爽影院| 欧美男女交配| 高清在线视频日韩欧美| 黄色av网站在线播放| 国产亚洲精品久久久久动| 午夜福利一区二区三区| 欧美一卡二卡在线| 一级久久久久久| 狠狠色狠色综合曰曰| 九九热国产在线| 亚洲精品欧美专区| 激情高潮到大叫狂喷水| 久久精品一区四区| 少妇大叫太粗太大爽一区二区| 成人午夜私人影院| 自拍视频第一页| 国产老肥熟一区二区三区| 午夜免费看毛片| 麻豆91精品视频| 色七七在线观看| 老司机午夜精品视频在线观看| 国产免费黄色小视频| 黄色亚洲精品| 美女扒开大腿让男人桶| 女人色偷偷aa久久天堂| 三年中文高清在线观看第6集| 精品一区二区三| 色一情一乱一伦一区二区三区丨| 日韩精品a在线观看91| 精品福利影视| 天美av一区二区三区久久| 狠狠色噜噜狠狠色综合久| 成人在线视频你懂的| 国产精品久久久久久免费观看| 成人自拍在线| 国产亚洲一区在线播放 | 精品亚洲国产成av人片传媒| 天天干天天爽天天操| 日韩电影网在线| 国产福利在线视频| 日韩在线精品一区| 黄色片网站在线观看| 久久久www成人免费精品| 免费在线你懂的| 欧美高跟鞋交xxxxhd| 极品美鲍一区| 国产99在线|中文| 99只有精品| 91系列在线播放| 综合久久成人| 欧美精品成人一区二区在线观看| 欧美**vk| 亚洲日本理论电影| 欧美成熟视频| 亚洲熟妇无码另类久久久| 亚洲一卡久久| 一道本在线免费视频| 国产毛片一区二区| 亚洲激情 欧美| 国产三级三级三级精品8ⅰ区| 战狼4完整免费观看在线播放版| 亚洲欧洲综合另类| 日韩av无码中文字幕| 色88888久久久久久影院野外| 亚洲一区 中文字幕| 日韩三级中文字幕| 欧美成人片在线| 久久av在线播放| 在线免费av资源| 91深夜福利视频| 蜜桃精品wwwmitaows| av不卡在线免费观看| av不卡在线看| 五月天激情播播| av一区二区三区在线| 阿v天堂2014| 亚洲国产va精品久久久不卡综合| 高潮无码精品色欲av午夜福利| 欧美一区二区三区在线| 人操人视频在线观看| 欧美成人免费一级人片100| 小草在线视频免费播放| 91久久国产精品| 妖精视频一区二区三区| 中文字幕中文字幕99| 亚洲经典在线看| 婷婷激情综合五月天| 久久久综合网站| 久久久久噜噜噜亚洲熟女综合| 在线免费观看日本欧美| 亚洲免费国产视频| 日韩中文理论片| 精品国产免费人成网站| 99超碰麻豆| 欧美gayvideo| 成人精品小视频| 成人a区在线观看| 中文字幕av免费在线观看| 欧美在线观看视频一区二区三区| 性一交一乱一乱一视频| 色偷偷偷亚洲综合网另类| 在线一区av| 精品999在线观看| 伊人成人在线| 特种兵之深入敌后| 日韩理论在线观看| 波多野结衣爱爱| 亚洲人成伊人成综合网久久久| 欧美另类tv| 亚洲自拍偷拍网址| 91综合网人人| 亚洲成人天堂网| 国产免费成人在线视频| 亚洲s码欧洲m码国产av| 亚洲国产小视频在线观看| √天堂8在线网| 91网在线免费观看| 99国产**精品****| 一区二区三区视频在线观看免费| 91麻豆国产自产在线观看| 久久精品国产亚洲AV无码麻豆| 欧美一级午夜免费电影| 91中文在线| 99re视频在线| 国产主播精品| 在线精品视频播放| 亚洲444eee在线观看| 熟妇高潮一区二区三区| 韩剧1988免费观看全集| 精品视频高潮| 久在线观看视频| 久久午夜电影网| 精品一区免费观看| 亚洲国产成人久久综合| 麻豆理论在线观看| 久久久久久久久久久久久久一区| 国产精品一页| 国产精品高清无码在线观看| 一本大道av一区二区在线播放| 日韩a在线观看| 国产精品av在线| 久久国产综合| 91视频免费入口| 亚洲图片欧美综合| 日韩中文字幕综合| 欧美最顶级的aⅴ艳星| 国产麻豆精品久久| 三上悠亚av一区二区三区| 《视频一区视频二区| 超碰福利在线观看| 7m第一福利500精品视频| 久久99久久人婷婷精品综合| 久久99爱视频| 一区二区三区毛片| 天堂av在线播放| 国产精品免费久久久久久| 亚洲女同中文字幕| 无码av免费精品一区二区三区| 高潮白浆女日韩av免费看| 成人影视在线播放| 97人人香蕉| 校园激情久久| 小早川怜子一区二区的演员表| 欧美v日韩v国产v| 成人欧美magnet| 最新精品视频| 99久久亚洲一区二区三区青草| 亚洲精品91天天久久人人| 久久国产精品网站| 亚洲va久久| 人妻体体内射精一区二区| 欧美午夜精品久久久久久人妖| 午夜免费福利在线观看| 国产视频不卡| 激情六月婷婷综合| 在线能看的av| 久久久极品av| 久草精品在线| 精品伦一区二区三区| 在线观看国产精品网站| 婷婷色在线播放| 日韩资源av在线| 成人免费高清在线| 怡春院在线视频| 国内精品一区二区三区| 98精品久久久久久久| 性色av蜜臀av色欲av| 91精品国产综合久久小美女| 欧美gay视频|