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

效率前端微應(yīng)用推進(jìn)之微前端研發(fā)提效

開發(fā) 前端
微前端中,基座應(yīng)用(父應(yīng)用)、子應(yīng)用是常見概念,本文描述中,“基座應(yīng)用”又名“父應(yīng)用”,為簡化文案,“基座應(yīng)用與子應(yīng)用”也被稱為“父子應(yīng)用”。

一、背景

業(yè)務(wù)背景

得物效率前端所在的效率工程為提升企業(yè)協(xié)作效率而生,面臨大量的 PC 側(cè)的中后臺應(yīng)用場景。

在之前的微信公眾號《得物效率前端微應(yīng)用推進(jìn)過程與思考》中詳細(xì)介紹了效率前端推進(jìn)微應(yīng)用落地的思路和部分效果。

這篇文章將著重介紹得物效率前端微應(yīng)用推進(jìn)中,微前端的研發(fā)效率遇到的挑戰(zhàn)和解決方案。

名詞解釋

微應(yīng)用

「微應(yīng)用」是得物效率前端內(nèi)部稱謂,是一個基于“monorepo & 微前端 & 基座與業(yè)務(wù)分離”的、包括“文檔 & 工具”的一套體系化降低研發(fā)成本和提升用戶體驗的技術(shù)產(chǎn)品。

微前端

「微前端」是得物效率前端微應(yīng)用推進(jìn)的重要一環(huán),尤其是父子應(yīng)用技術(shù)棧不同時,利用 iframe / qiankun / wujie / micro-app 等工具進(jìn)行微前端化改造,能顯著增強(qiáng)業(yè)務(wù)擴(kuò)展性。

圖片圖片

基座應(yīng)用/父應(yīng)用

微前端中,基座應(yīng)用(父應(yīng)用)、子應(yīng)用是常見概念,本文描述中,“基座應(yīng)用”又名“父應(yīng)用”,為簡化文案,“基座應(yīng)用與子應(yīng)用”也被稱為“父子應(yīng)用”。

瀏覽器插件/擴(kuò)展

chrome://extensions/ 頁面中對第三方工具稱為“擴(kuò)展”,在本文語境下,又稱為“插件”。

二、研發(fā)費(fèi)力度痛點

就研發(fā)效率而言,微前端在團(tuán)隊多個業(yè)務(wù)落地后,面臨研發(fā)過程費(fèi)力度高的問題。

費(fèi)力點1

本地開發(fā)時,從啟動 1 個本地服務(wù),變?yōu)樾鑶?2 個本地服務(wù):

大大多數(shù)情況下,項目需要啟動  2 個本地服務(wù)(基座應(yīng)用和子應(yīng)用)才能進(jìn)行日常開發(fā),因為子應(yīng)用通常依賴基座應(yīng)用透傳一些依賴數(shù)據(jù)。

而非微前端場景下,啟動 1 個應(yīng)用就可以了,這反而引入了降低了研發(fā)效率。雖然微前端方案更注重業(yè)務(wù)效率,但研發(fā)效率也是必須要考慮的。

如果電腦性能一般的話,卡頓問題就隨之而來了。

費(fèi)力點2

基座應(yīng)用本地代碼需要做適配性改造:

如父應(yīng)用需要區(qū)分本地環(huán)境和生產(chǎn)環(huán)境類似這樣的代碼,雖然代碼量不大,但還是需要關(guān)注的:

// 基座代碼
if (isLocal) {
    return <microapppage src="localhost://8000/a/b/c" />
} else if (isProd) {
    return <microapppage src="https://www.abc.com/a/b/c">
}

費(fèi)力點3

頻繁無規(guī)律刷新:

在 Qiankun 微前端框架且本地開發(fā)環(huán)境下,基座應(yīng)用與子應(yīng)用頁面均需要 WebSocket 與其自身本地服務(wù)進(jìn)行通信。

在同時啟動基座與子應(yīng)用的本地服務(wù)后,修改子應(yīng)用代碼以及偶發(fā)的,頁面會觸發(fā) Reload,而不是局部更新,開發(fā)體驗很差。針對這個問題我們做了一些分析。

HMR 的熱更新邏輯

本地開發(fā)過程會啟動 Webpack-Dev-Server 服務(wù),其會監(jiān)聽業(yè)務(wù)文件變化,瀏覽器通過 WebSocket 與 Webpack-Dev-Server 進(jìn)行通信。

當(dāng)發(fā)現(xiàn)文件內(nèi)容改變時 Webpack-Dev-Server 會根據(jù)更新的文件內(nèi)容生成 Hash 信息傳遞給瀏覽器,如圖:

圖片圖片

當(dāng)瀏覽器收到信息時,會根據(jù)收到的信息和配置進(jìn)行判斷是刷新操作還是熱更新操作。熱更新時,Webpack-Dev-Serer 通過 Jsonp 拉取最新的 JS 模塊代碼,并進(jìn)行模塊替換,如圖:

圖片圖片

若此過程異常,則會降級為頁面刷新。

無規(guī)律刷新原因分析

基座應(yīng)用(端口 8010)熱更新時返回的文件 Json 和 JS 文件(分別是 **:8010/update.json 和 **:8010/update.js)內(nèi)容如下:

圖片圖片

圖片圖片

但在嵌套在基座應(yīng)用中的本地子應(yīng)用(端口 8020)熱更新時,兩個同類文件并沒有返回內(nèi)容(**:8020/update.json 和 **:8020/update.js)

圖片圖片

圖片圖片

若瀏覽器單獨(dú)打開兩個文件的地址(**:8020/update.json 和 **:8020/update.js),有內(nèi)容返回。

圖片圖片

但是在基座與子應(yīng)用嵌套的情況下,子應(yīng)用的任何請求(包括 update.json / update.js )都會被基座應(yīng)用代理,開發(fā)環(huán)境下很容易出現(xiàn)子應(yīng)用的更新探針請求被基座代理后,出現(xiàn)內(nèi)容丟失的情況。

子應(yīng)用 HMR 邏輯檢測到更新探針請求內(nèi)容異常,局部更新失效,降級為頁面刷新。

即使該問題解決,微前端應(yīng)用開發(fā)者依然面臨同時啟動 2 個應(yīng)用才能啟動開發(fā)的問題,所以我們不過度投入精力關(guān)注這個問題。

三、技術(shù)調(diào)研

解決「默認(rèn)情況下,父子應(yīng)用需要分別獨(dú)立啟動,并指定關(guān)聯(lián)關(guān)系」的問題,最好的方式是回歸到非微前端場景下的常規(guī)開發(fā)方式,即只啟動 1 個應(yīng)用進(jìn)行本地開發(fā)。

通常情況下,我們開發(fā)的是子應(yīng)用(也就是業(yè)務(wù)頁面),那先實現(xiàn)子應(yīng)用單獨(dú)啟動即可開啟項目開發(fā)吧,以下是面向該需求的技術(shù)調(diào)研。

Shared 通信

Shared 通信方案的原理是,主應(yīng)用維護(hù)一個狀態(tài)池,通過 Shared 實例暴露一些方法給子應(yīng)用使用。

同時,子應(yīng)用需要單獨(dú)維護(hù)一份 Shared 實例,在獨(dú)立運(yùn)行時使用自身的 Shared 實例,在嵌入主應(yīng)用時使用主應(yīng)用的 Shared 實例,這樣就可以保證在使用和表現(xiàn)上的一致性。

Shared 通信方案要求父子應(yīng)用都各自維護(hù)一份屬于自己的 Shared 實例,同樣會增加項目的復(fù)雜度。同時,在子應(yīng)用獨(dú)立運(yùn)行時,Shared 只能獲取本地緩存數(shù)據(jù),無法真正做到完全獨(dú)立于子應(yīng)用運(yùn)行。

圖片圖片

Mock 父應(yīng)用環(huán)境

也就是在子應(yīng)用中模擬父應(yīng)用嵌套環(huán)境,提供一個獨(dú)立的模擬父應(yīng)用的組件,封裝了 Layout 布局、權(quán)限、用戶信息等,并且具備必要的父子通信能力,子應(yīng)用調(diào)用該 Mock 組件,獨(dú)立啟動以后進(jìn)行日常開發(fā)。

這個方案和 Shared 通信有類似之處。

用戶體驗

// 這是子應(yīng)用代碼


import { MicroLayout } from '@abc/components';


//  組件內(nèi)使用
<MicroLayout title="Layout 內(nèi)容">
    {children}
</MicroLayout>

圖片圖片

流程設(shè)計

圖片圖片

其他

對業(yè)務(wù)開發(fā)者而言,基座應(yīng)用 Layout 的改動均需要使用者進(jìn)行 Mock Component 的升級,比較麻煩。

對 Mock Component 開發(fā)者而言,需要額外開發(fā)父子通信方案 Microservice,用于 Mock Component 與子應(yīng)用的通信。

這套方案在應(yīng)對比較簡單的甚至沒有數(shù)據(jù)傳輸?shù)奈?yīng)用上是可以的,但是對于自定義化程度較高,復(fù)雜程度較高的微應(yīng)用項目來說就不是很方便了。

四、Chrome 代理插件

也就是通過 Chrome 插件,將線上子應(yīng)用 URL 代理到本地代碼。

利用瀏覽器提供的插件特性,劫持 HTTP 請求,將已經(jīng)部署在測試/預(yù)發(fā)/線上環(huán)境的項目的微應(yīng)用部分代理到開發(fā)者本地啟動的項目,這樣可以不用啟動基座應(yīng)用,直接打開目標(biāo)環(huán)境的主應(yīng)用,卻可以訪問本地子應(yīng)用項目進(jìn)行開發(fā)工作。

用戶體驗

圖片圖片

其他

子應(yīng)用需要的數(shù)據(jù)通過目標(biāo)環(huán)境的父應(yīng)用獲得,和第一套方案相比,他既可以滿足復(fù)雜場景下的子應(yīng)用獨(dú)立啟動,也不需要關(guān)注每個接入的子應(yīng)用他的數(shù)據(jù)依賴關(guān)系,研發(fā)成本也較低。

圖片圖片

四、Chrome 代理插件

產(chǎn)品設(shè)計

“Chrome 插件代理子應(yīng)用到本地代碼”以提升微前端研發(fā)效率,該瀏覽器插件需要具備以下核心能力:

圖片圖片

規(guī)則靈活配置。插件實現(xiàn)了 from 和 to 的地址映射規(guī)則配置表單。

如下圖,所有含 https://t1-xxxxxxxx.net/microapp/ 路徑的請求都將被代理到 localhost:8020/microapp/。

圖片圖片

  1. 緩存能力。用戶關(guān)閉瀏覽器/電腦后再次打開,仍然能夠使用之前保存的代理規(guī)則。
  2. 快捷操作。為常用產(chǎn)品配置內(nèi)置規(guī)則,一鍵即可啟動,非常方便。
  3. 實時顯示。需要實時顯示代理規(guī)則的生效情況,方便用戶確認(rèn)哪些規(guī)則正在生效。

技術(shù)設(shè)計

Proxy 和 Popup

Chrome 插件分為 2 個模塊:Proxy 代理劫持模塊和 Popup 用戶交互模塊。

圖片圖片

功能流轉(zhuǎn)

圖片圖片

無感更新(Seamless Update)

圖片圖片

popup.html 作為用戶界面入口,動態(tài)引入 popup.js 處理用戶交互,popup.js 動態(tài)引入 proxy.js 執(zhí)行 url 攔截規(guī)則。

這么做需要在 chrome 插件的 csp 安全策略配置中加入 cdn 域名白名單,允許插件訪問外部 cdn 資源。

manifest.json 配置如下:

值得注意的是,無感更新方案只在 Chrome V2 中實現(xiàn)了,V3 版本的 Chrome 插件執(zhí)行了更為保守的安全策略,限制第三方資源的加載。

{
...
"permissions": [
  "webRequest", // 允許瀏覽器開放http請求劫持的功能
  "storage", // 允許使用瀏覽器緩存
  "activeTab", 
  "background", 
  "webRequestBlocking",
  "<all_urls>"
],
// 允許特定域名可以訪問的安全策略
"content_security_policy":"script-src 'self' https://cdn.xxxxx.com 'sha256-G7YAg/PQDo8GYc/fSYvWtXP98kXS7iqT7K4QZgyhUIE='; object-src 'self'",
"content_scripts": [
  {
    "matches": ["*://*.xxxxxxx.net/*"],
    "js": ["contentScript.bundle.js"]
  }
]
}
// ==========attentinotallow===========
//v2配置,v2版本中可以配置script等通過外部引入,這個content_security_policy配置參數(shù)不加或者加上之后相應(yīng)的值填none
"content_security_policy": "script-src 'none'; object-src 'none'",


//v3配置,v3版本中安全政策配置script引入等信息,都必須填寫self,即只允許script標(biāo)簽引用當(dāng)前插件內(nèi)部文件,不允許引用外部鏈接,如果不填寫self的話,插件添加到擴(kuò)展程序時會報錯
"content_security_policy": {
//原文:此政策涵蓋您的擴(kuò)展程序中的頁面,包括 html 文件和服務(wù)人員;
"extension_pages": "script-src 'self'; object-src 'self'",


//原文:此政策涵蓋您的擴(kuò)展程序使用的任何[沙盒擴(kuò)展程序頁面](https://developer.chrome.com/docs/extensions/mv3/manifest/sandbox/)。;
"sandbox": "sandbox allow-scripts; script-src 'self'; object-src 'self'"
},

在 popup.html 中動態(tài)引入 popup.js 示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Popup</title>
    <script>
      var scriptEl = document.createElement('script');
      scriptEl.defer = "defer";
      scriptEl.src = "https://cdn.xxxxxxxxxxx/popup.js?timestamp=" + Date.now();
      document.getElementsByTagName('head')[0].appendChild(scriptEl);
</script>  
  </head>


  <body>
    <div id="app-container"></div>
  </body>
</html>

各模塊 JS 在構(gòu)建后上傳至 CDN,再在 popup.html / background.js / ... 中動態(tài)引入以實現(xiàn)無感更新。

圖片圖片

Proxy

  1. 攔截頁面請求。
  2. 提供緩存配置的功能,用戶在關(guān)閉瀏覽器后,配置的映射關(guān)系不會自動消失,以便用戶下次打開的時候正常提供服務(wù)。
  3. 通信功能,需要將用戶在 Popup 頁面交互時提交的數(shù)據(jù)地址數(shù)據(jù)提供給攔截方法,從而實現(xiàn)對應(yīng)的攔截效果。
  4. 提供配置信息狀態(tài)的緩存數(shù)據(jù),方便觀測攔截效果。

以下是攔截邏輯的相關(guān)代碼:

chrome.webRequest.onBeforeRequest.addListener(
  worker.getRequest.bind(worker),
  {urls: worker.getFilterUrls(worker.replaceRules)},
  ['blocking']
);
// Class background 
class Background {
    constructor() {
    this.replaceRules = []
    }
    getRequest(details) {
      if (!details) {
        // chrome未返回任何request
        return false
      }
      const {url} = details
      const returnObj = {}
      if (this.replaceRules.length) {
        // 存在替換規(guī)則
        this.replaceRules.map((item) => {
          if (url.includes(item.from)) {
            // 更新 icon 狀態(tài)
            this.setBadgeInfo(true)
            // 代理替換
            returnObj.redirectUrl = url.replace(item.from, item.to)
            // 緩存更新當(dāng)前代理域名
            chrome.storage.sync.get(null, function (data) {
              if (data.messageProxyingData) {
                // 存在被代理的數(shù)據(jù),合并數(shù)據(jù)
                const isExistMessageProxyingData = data.messageProxyingData
                chrome.storage.sync.set({messageProxyingData: Object.assign(isExistMessageProxyingData, {[item.key]: true})})
              } else {
                // 未存在緩存,使用新數(shù)據(jù)
                chrome.storage.sync.set({messageProxyingData: {[item.key]: true}})
              }
            })
          }
        })
      }
      return returnObj
    }
}

可以看到,chrome.webRequest.onBeforeRequest/ getRequest 配合攔截獲取請求地址,然后攔截替換目標(biāo)路徑,當(dāng)然這是比較簡單的邏輯,復(fù)雜的可以參考 glob 寫法代理鏈接。

Popup

Popup 用戶交互模塊,支持一鍵開啟和一鍵關(guān)閉、支持自定義配置映射地址。

圖片圖片

const sendMessage = (data: DataType[]) => {
  // 保留數(shù)據(jù)中已開啟的數(shù)據(jù),進(jìn)行數(shù)據(jù)傳輸
  const finalData = data.filter.((item) => item.is_open);
  chrome.runtime.sendMessage({ data: finalData, type: 'rule' });
};
const handleSaveData = (
  data: DataType[],
  isNeedSendMsg: boolean,
  key?: number[]
) => {
  setDataSource([...data]);
  // 緩存配置
  chrome.storage.sync.set({ popupData: data });
  if (isNeedSendMsg) {
    sendMessage(data);
    if (key?.length) {
      chrome.storage.sync.get(null, function (data) {
        const messageProxyingData = data.messageProxyingData || {};
        if (messageProxyingData) {
          key.forEach.((item) => {
            delete messageProxyingData[item];
          });
        }
        chrome.storage.sync.set({ messageProxyingData });
      });
    }
  }
};

ContentScript

原本無需在 ContentScript 中植入代理相關(guān)的任何邏輯,但在 Qiankun 微前端場景下有一個問題,子應(yīng)用的熱更新會失效(可能導(dǎo)致 HMR 無效進(jìn)而只能 Reload 頁面查看最新頁面效果),為此我們正好可以借助 Chrome 插件可注入 ContentScript 的能力,為用戶自動規(guī)避一些問題。

下面這段注入頁面的 ContentScript 可以輔助解決 Qiankun 子應(yīng)用代碼更新后 HMR 失效的問題(方案來自社區(qū))。

const scrpit = document.createElement('script')
scrpit.textContent = `
window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ =
        window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ || {
            iframeReady: function () {
                var overlay = document.querySelector(
                    'iframe[style*="z-index: 2147483647;"]',
                );
                if (overlay) {
                    overlay.style.display = 'none';
                }
            },
        };
`
document.body.appendChild(scrpit)

五、推進(jìn)情況

項目覆蓋率

目前該插件在效率前端的微應(yīng)用項目覆蓋率達(dá)到了 100%,在推進(jìn)過程中,只需要用戶「安裝 1 次插件」,即可使用,后續(xù)更新無需關(guān)心(減少「插件需要更新」的心理負(fù)擔(dān))。

研發(fā)效率

  1. 避免了父子應(yīng)用均啟動時,子應(yīng)用代碼更新后,父應(yīng)用被動觸發(fā) Reload 的問題。
  2. 子應(yīng)用 HMR 熱更新延時與非微前端項目沒有差距。

用戶反饋

從研發(fā)側(cè)的反饋來看,確實有效地提高了微應(yīng)用場景下的研發(fā)效率,告別啟動多個本地服務(wù)的煩惱。

同時,Chrome 插件方案實現(xiàn)簡單、使用方便,是此類場景下,在研發(fā)成本和用戶體驗上的表現(xiàn)比較均衡的解決方案。

六、思考

這個產(chǎn)品是效率前端業(yè)務(wù)小組發(fā)起,從 0 到 1 進(jìn)行產(chǎn)品設(shè)計、技術(shù)方案調(diào)研、開發(fā)、完成落地的,既讓參與的同學(xué)經(jīng)歷了完整的技術(shù)產(chǎn)品研發(fā)過程,也解決了實際業(yè)務(wù)中遇到的問題,并得到了正反饋。

對于此產(chǎn)品,還有可以持續(xù)完善的地方,比如:可以增加本地服務(wù)的保活探針,替代手動開啟代理規(guī)則,更智能化;或者利用其動態(tài)更新能力擴(kuò)充功能,從很具體的小事情入手,不斷解決更多問題。

對于團(tuán)隊,發(fā)現(xiàn)工作中的痛點,用工具化的方式沉淀解決方案,解決實際問題,也是前端同學(xué)提升自身價值的一個可行路徑。


責(zé)任編輯:武曉燕 來源: 得物技術(shù)
相關(guān)推薦

2023-08-02 18:56:29

效率前端微應(yīng)用

2021-04-21 19:20:53

前端 容器應(yīng)用

2022-10-17 15:21:18

2020-07-22 13:50:39

shell命令前端

2023-03-07 10:44:05

前端JS 調(diào)試

2023-12-27 18:15:42

組裝式生態(tài)提效開發(fā)中心

2022-05-23 08:34:08

微前端微服務(wù)開發(fā)

2020-05-06 09:25:10

微前端qiankun架構(gòu)

2022-04-02 17:20:00

微前端應(yīng)用技術(shù)

2020-07-27 15:50:28

微前端組件前端

2024-09-02 08:03:23

2022-07-08 11:18:33

前端實踐自動化

2020-04-22 15:20:39

前端框架代碼

2018-11-01 14:12:03

前端架構(gòu)Javascript

2023-11-20 08:12:15

2023-12-29 13:45:57

2022-08-19 14:06:56

前端架構(gòu)技術(shù)

2022-10-19 14:16:18

樣式隔離前綴css

2023-03-10 10:29:19

前端邏輯拆分

2022-09-07 21:31:19

微前端架構(gòu)iframe
點贊
收藏

51CTO技術(shù)棧公眾號

成人手机在线视频| 欧美大片专区| 欧美精选午夜久久久乱码6080| 一区二区三区国产福利| 精品人妻一区二区三区日产乱码| 亚洲激情综合| 中文字幕亚洲欧美| 日本精品一二三区| 国产成人午夜性a一级毛片| 亚洲美女淫视频| 欧美高清一区二区| 国产情侣自拍小视频| 亚洲深夜激情| 欧美成人激情在线| www.日本高清视频| 日韩精品社区| 4438x成人网最大色成网站| 国产视频九色蝌蚪| 国产欧美久久久久久久久| 成人18精品视频| 91精品国产综合久久香蕉| 91浏览器在线观看| 欧美婷婷在线| 色综合伊人色综合网| 久久无码人妻精品一区二区三区 | 91xxx在线观看| 99视频国产精品| 91色精品视频在线| 国产情侣小视频| 久久aⅴ乱码一区二区三区| 欧美日韩第一视频| 免费看特级毛片| 欧洲grand老妇人| 亚洲老头同性xxxxx| 又大又长粗又爽又黄少妇视频| 本网站久久精品| 欧美性生交xxxxx久久久| 国产精品视频网站在线观看| 国产日产一区二区| 国产精品国产三级国产| 日韩精品一线二线三线| 免费在线黄色影片| 26uuu亚洲| 久久国产精品高清| 色网站免费观看| 国产91在线|亚洲| 91在线看www| av中文字幕观看| 国产尤物一区二区在线| 91最新在线免费观看| 中文字幕在线日亚洲9| 日韩中文字幕不卡| 国产精品久久久久久久久久ktv| 欧美国产成人精品一区二区三区| 亚洲麻豆av| 88xx成人精品| 国产精品777777| 亚洲专区一区二区三区| 欧美一级电影久久| 免费黄色片视频| 日韩国产精品久久久久久亚洲| 日本道色综合久久影院| 久久国产乱子伦精品| 石原莉奈一区二区三区在线观看| 国产成人精品久久久| 日韩xxx视频| 久久精品国产亚洲高清剧情介绍| 国产美女扒开尿口久久久| 国产又大又粗又硬| 国产精品综合av一区二区国产馆| 99免费在线观看视频| 亚洲欧美另类视频| 91美女片黄在线| 亚洲欧美日韩精品在线| 国产黄大片在线观看画质优化| 亚洲码国产岛国毛片在线| 免费在线黄网站| 男人天堂视频在线观看| 欧美亚一区二区| 国产调教打屁股xxxx网站| 欧美黑人做爰爽爽爽| 中文字幕亚洲综合久久| 精品人妻伦九区久久aaa片| 雨宫琴音一区二区在线| 欧美在线视频网| 91尤物国产福利在线观看| 国产成+人+日韩+欧美+亚洲| 欧美在线激情| www免费视频观看在线| 天天综合日日夜夜精品| 男人的天堂日韩| 另类视频一区二区三区| 精品呦交小u女在线| 五月天免费网站| 激情综合自拍| 国产精品欧美日韩久久| 成人免费视频国产免费麻豆| 久久久精品免费观看| 国产精品12p| 日本成人三级电影| 日韩视频免费观看高清在线视频| 白丝女仆被免费网站| 国产精品久久久久久久久妇女| 韩国精品美女www爽爽爽视频| 高潮无码精品色欲av午夜福利| 国产一区二区视频在线播放| 欧美精品成人一区二区在线观看 | 在线观看国产一级片| 成人h动漫精品一区二区器材| 亚洲欧美日韩精品| 青青草在线观看视频| 蜜桃视频在线观看一区二区| 精品久久久久久一区| 日本不卡在线| 91久久免费观看| 国产人成视频在线观看| 亚洲综合婷婷| 国产欧美精品在线播放| 青青草观看免费视频在线| 一区二区三区四区在线免费观看| www.激情小说.com| 色先锋久久影院av| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲天堂网视频| 久久精品一区四区| 美女日批免费视频| 日韩精品一级| 久久久国产精品亚洲一区| 波多野结衣不卡| 99久久婷婷国产精品综合| a级片一区二区| 成人豆花视频| 久久久av电影| 一个人看的www日本高清视频| 久久久高清一区二区三区| 成人网站免费观看入口| 一区二区三区四区视频免费观看| 日韩中文综合网| 中文字幕在线观看精品| 中文一区一区三区高中清不卡| 日韩视频第二页| 夜夜春成人影院| 91高潮在线观看| 天堂在线观看免费视频| 香蕉成人伊视频在线观看| 成人欧美精品一区二区| 91精品国产调教在线观看| 成人xxxxx| 成人影院在线看| 日韩一区和二区| 99精品久久久久| 岛国精品在线播放| 大伊香蕉精品视频在线| 国产区精品视频在线观看豆花| 欧美精品videos| 人妻与黑人一区二区三区| 午夜视频久久久久久| 51调教丨国产调教视频| 日韩精品一卡二卡三卡四卡无卡| 日韩高清国产精品| 高清亚洲高清| 欧美成人sm免费视频| 老牛影视av牛牛影视av| 岛国av一区二区| xxxxx在线观看| 免费高清不卡av| 91制片厂免费观看| 成人性生交大片免费看中文视频 | av午夜一区麻豆| 免费国产黄色网址| 国产欧美日韩精品一区二区免费 | 亚洲激情在线播放| 高清中文字幕mv的电影| 亚洲永久免费| 色视频一区二区三区| 亚洲成a人片777777久久| 麻豆国产精品va在线观看不卡 | 国产精品久久久久久久久免费高清| 日韩在线欧美在线| 精品人妻一区二区三区三区四区 | 成人羞羞视频播放网站| 91免费视频网站| 成人影院在线视频| 中文字幕欧美日韩va免费视频| 国产精品伦一区二区三区| 亚洲综合激情小说| 免费看污片的网站| 国产经典欧美精品| 欧美视频第一区| 99精品电影| 国产日产精品一区二区三区四区| 韩国三级一区| 欧美高清电影在线看| 男女网站在线观看| 欧美xingq一区二区| 伊人久久中文字幕| 一区二区三区四区国产精品| 欧美另类z0zx974| 国产99精品国产| 欧美午夜aaaaaa免费视频| 国产一区激情| 午夜欧美性电影| 红杏视频成人| 国产日韩av在线播放| 人成在线免费网站| 欧美大成色www永久网站婷| 九色在线免费| 精品99一区二区三区| 影音先锋黄色网址| 精品久久久久久久久久国产| www色aa色aawww| 久久精品亚洲麻豆av一区二区 | 久久综合色视频| 欧美韩国一区| 一区二区三区在线视频看| 亚洲精华一区二区三区| av在线亚洲男人的天堂| 国产毛片精品久久| 国产成人综合久久| 大桥未久在线视频| 欧美激情欧美激情| 黄网站在线免费看| 色偷偷综合社区| 国产三级在线| 亚洲精品一区二区久| 日本免费不卡视频| 日韩视频免费观看高清完整版在线观看 | 日本欧美加勒比视频| 欧美老熟妇喷水| 亚洲高清在线| 久艹在线免费观看| 影音先锋亚洲精品| 日韩精品一区二区免费| 欧美日本一区二区视频在线观看 | 丁香花高清在线观看完整版| 久久久国产一区二区| 在线看的av网站| 国产午夜精品一区理论片飘花| 无码国产精品一区二区免费16| 精品久久久久久久久久久久久久久久久 | 九九视频免费在线观看| 亚洲欧美一区二区三区孕妇| 黑人操日本美女| ㊣最新国产の精品bt伙计久久| 成人无码精品1区2区3区免费看| 国产欧美综合在线观看第十页| 日韩精品电影一区二区| 国产午夜精品一区二区三区四区| 老鸭窝一区二区| 久久久综合网站| 欧美 日韩 成人| 欧美国产日本视频| 三级黄色片在线观看| 亚洲视频在线一区观看| 欧美成人手机视频| 精品久久久久久久久久国产 | japanese色国产在线看视频| 欧美精品xxx| 丝袜诱惑一区二区| 国产精品精品国产| 中文成人在线| 春色成人在线视频| 亚洲精品无吗| 亚洲成人午夜在线| 91精品电影| 你真棒插曲来救救我在线观看| 在线视频亚洲| 亚洲成人av免费看| 国产精品一区在线观看你懂的| 99久久综合网| 91香蕉视频污在线| 日日操免费视频| 亚洲精品国产精华液| 国产成人愉拍精品久久 | 不卡的在线视频| 国产成a人亚洲| 三上悠亚影音先锋| 18欧美乱大交hd1984| 精品无码人妻一区二区三区品| 欧美日韩精品二区| 一级黄色大毛片| 精品毛片乱码1区2区3区| 日韩大片b站免费观看直播| 中文字幕精品在线| gogo高清在线播放免费| 国产精品96久久久久久又黄又硬| 伊人国产精品| 久久福利电影| 中文乱码免费一区二区三区下载| 国产中文字幕二区| 久久av资源网| 日本少妇xxxx| 亚洲欧洲一区二区三区| 日本熟伦人妇xxxx| 欧美乱妇23p| 人成在线免费视频| 久久99热精品这里久久精品| 久久人体大尺度| 成人免费在线一区二区三区| 经典一区二区| 妺妺窝人体色777777| 九九精品视频在线看| 久久精品国产亚洲av麻豆| 亚洲美女区一区| 波多野结衣电车痴汉| 亚洲大胆人体av| 成人看片免费| 国产精品久久久久久久电影| 欧美日韩破处| 日韩最新中文字幕| 蜜桃精品视频在线| 老司机福利av| 亚洲成人午夜影院| 国产视频一二三四区| 在线成人激情黄色| 成人欧美magnet| 好看的日韩精品视频在线| 国产精品久久久久久久| 在线免费视频a| 久久看人人爽人人| 亚洲精品午夜国产va久久成人| 日韩一区二区三区观看| 免费在线午夜视频| 国产精品视频精品视频| 最新国产精品视频| 免费无遮挡无码永久视频| 成人视屏免费看| 免费一级a毛片夜夜看| 欧美精品三级在线观看| 成人精品一区二区三区校园激情| 7777精品久久久久久| 全国精品免费看| 一本久道高清无码视频| 国产**成人网毛片九色| 欧美三级在线免费观看| 6080yy午夜一二三区久久| 五月天婷婷在线视频| 国产精品青草久久久久福利99| 国产a久久精品一区二区三区 | 国产私拍福利精品视频二区| 久久一区二区三区av| 国产欧美精品久久| 中国av免费看| 一本一道波多野结衣一区二区| 无码精品在线观看| 91超碰中文字幕久久精品| 欧美调教在线| 凹凸国产熟女精品视频| 2021国产精品久久精品| 亚洲成熟少妇视频在线观看| 亚洲人在线视频| 国产亚洲精品精品国产亚洲综合| 亚洲v欧美v另类v综合v日韩v| 免费观看在线综合色| 伊人在线视频观看| 精品日韩av一区二区| 欧美freesex黑人又粗又大| 牛人盗摄一区二区三区视频| 久久午夜视频| 五月天婷婷丁香网| 欧美一区午夜精品| av在线不卡免费| 欧美日韩亚洲一区二区三区四区| 日韩国产一区二| 手机在线免费看片| 精品久久久久一区| 日本高清不卡一区二区三区视频| 亚洲精品久久区二区三区蜜桃臀| 麻豆中文一区二区| 欧美成人综合色| 亚洲精品日韩久久久| 男女啪啪999亚洲精品| 佐佐木明希av| 久久综合久久鬼色中文字| 在线免费观看高清视频| 欧美激情视频在线| 深爱激情综合网| 中文字幕在线播放一区二区| 欧美日韩国产一区中文午夜| 在线免费黄色| 精品视频第一区| 久99久精品视频免费观看| 五月天婷婷丁香| 色一区av在线| 美女主播精品视频一二三四| 一道本视频在线观看| 亚洲综合免费观看高清在线观看| 男人天堂亚洲二区| 亚洲自拍偷拍视频| 日韩中文字幕麻豆| 成人免费看片98| 中文字幕欧美在线| 久久香蕉网站| 亚洲色图欧美自拍| 日韩人在线观看| 在线中文字幕第一页| 色涩成人影视在线播放| a美女胸又www黄视频久久| 在线观看黄色国产| 91sao在线观看国产|