国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

探索 Web Worker 實(shí)現(xiàn) JavaScript 沙箱隔離方案的踩坑與思考

共 9662字,需瀏覽 20分鐘

 ·

2021-06-05 16:58

點(diǎn)擊上方 前端Q,關(guān)注公眾號

回復(fù)加群,加入前端Q技術(shù)交流群

一些「炒冷飯」的背景介紹

本文并不會從頭開始介紹 Web Worker 的基礎(chǔ)知識和基本 API 的使用等(只是部分有涉及),若還未了解過 Web Worker,可參考查閱 W3C 標(biāo)準(zhǔn) Workers 文檔 中的相關(guān)介紹。

自從 2014 年 HTML5 正式推薦標(biāo)準(zhǔn)發(fā)布以來,HTML5 增加了越來越多強(qiáng)大的特性和功能,而在這其中,工作線程(Web Worker)概念的推出讓人眼前一亮,但未曾隨之激起多大的浪花,并被在其隨后工程側(cè)的 Angular、Vue、React 等框架的「革命」浪潮所淹沒。當(dāng)然,我們總會偶然看過一些文章介紹,或出于學(xué)習(xí)的目的做過一些應(yīng)用場景下的練習(xí),甚或在實(shí)際項(xiàng)目中的涉及大量數(shù)據(jù)計(jì)算場景中真的使用過。但相信也有很多人和我一樣茫然,找不到這種高大上的技術(shù)在實(shí)際項(xiàng)目場景中能有哪些能起到廣泛作用的應(yīng)用。

究其原因,Web Worker 獨(dú)立于 UI 主線程運(yùn)行的特性使其被大量考慮進(jìn)行性能優(yōu)化方面的嘗試(比如一些圖像分析、3D 計(jì)算繪制等場景),以保證在進(jìn)行大量計(jì)算的同時,頁面對用戶能有及時的響應(yīng)。而這些性能優(yōu)化的需求在前端側(cè)一方面涉及頻率低,另一方面也能通過微任務(wù)或服務(wù)端側(cè)處理來解決,它并不能像 Web Socket 這種技術(shù)為前端頁面下的輪詢場景的優(yōu)化能帶來質(zhì)的改變。

直至 2019 年爆火的微前端架構(gòu)的出現(xiàn),基于微應(yīng)用間 JavaScript 沙箱隔離的需求,Web Worker 才得以重新從邊緣化的位置躍入到我的中心視野。根據(jù)我已經(jīng)了解到的 Web Worker 的相關(guān)知識,我知道了 Web Worker 是工作在一個獨(dú)立子線程下(雖然這個子線程比起 Java 等編譯型語言的子線程實(shí)現(xiàn)得還有點(diǎn)弱,如無法加鎖等),線程之間自帶隔離的特性,那基于這種「物理」性的隔離,能不能實(shí)現(xiàn) JavaScript 運(yùn)行時的隔離呢?

本文接下來的內(nèi)容,將介紹我在探索基于 Web Worker 實(shí)現(xiàn) JavaScript 沙箱隔離方案過程中的一些資料收集、理解以及我的踩坑和思考的過程。雖然可能整篇文章內(nèi)容都在「炒冷飯」,但還是希望我的探索方案的過程能對正在看這篇文章的你有所幫助。

JavaScript 沙箱

在探索基于 Web Worker 的解決方案之前,我們先要對當(dāng)前要解決的問題——JavaScript 沙箱有所了解。

提到沙箱,我會先想到出于興趣玩過的沙盒游戲,但我們要探索的 JavaScript 沙箱不同于沙盒游戲,沙盒游戲注重對世界基本元素的抽象、組合以及物理力系統(tǒng)的實(shí)現(xiàn)等,而 JavaScript 沙箱則更注重在使用共享數(shù)據(jù)時對操作狀態(tài)的隔離。

在現(xiàn)實(shí)與 JavaScript 相關(guān)的場景中,我們知道平時使用的瀏覽器就是一個沙箱,運(yùn)行在瀏覽器中的 JavaScript 代碼無法直接訪問文件系統(tǒng)、顯示器或其他任何硬件。Chrome 瀏覽器中每個標(biāo)簽頁也是一個沙箱,各個標(biāo)簽頁內(nèi)的數(shù)據(jù)無法直接相互影響,接口都在獨(dú)立的上下文中運(yùn)行。而在同一個瀏覽器標(biāo)簽頁下運(yùn)行 HTML 頁面,有哪些更細(xì)節(jié)的、對沙箱現(xiàn)象有需求的場景呢?

當(dāng)我們作為前端開發(fā)人員較長一段時間后,我們很輕易地就能想到在同一個頁面下,使用沙箱需求的諸多應(yīng)用場景,譬如:

  1. 執(zhí)行從不受信的源獲取到的第三方 JavaScript 代碼時(比如引入插件、處理 jsonp 請求回來的數(shù)據(jù)等)。
  2. 在線代碼編輯器場景(比如著名的 codesandbox)。
  3. 使用服務(wù)端渲染方案。
  4. 模板字符串中的表達(dá)式的計(jì)算。
  5. ... ...

這里我們先回到開頭,先將前提假設(shè)在我正在面對的微前端架構(gòu)設(shè)計(jì)下。在微前端架構(gòu)(推薦文章 Thinking in Microfrontend 、擁抱云時代的前端開發(fā)架構(gòu)——微前端 等)中,其最關(guān)鍵的一個設(shè)計(jì)便是各個子應(yīng)用間的調(diào)度實(shí)現(xiàn)以及其運(yùn)行態(tài)的維護(hù),而運(yùn)行時各子應(yīng)用使用全局事件監(jiān)聽、使全局 CSS 樣式生效等常見的需求在多個子應(yīng)用切換時便會成為一種污染性的副作用,為了解決這些副作用,后來出現(xiàn)的很多微前端架構(gòu)(如 乾坤)有著各種各樣的實(shí)現(xiàn)。譬如 CSS 隔離中常見的命名空間前綴、Shadow DOM、 乾坤 sandbox css 的運(yùn)行時動態(tài)增刪等,都有著確實(shí)行之有效的具體實(shí)踐,而這里最麻煩棘手的,還是微應(yīng)用間的 JavaScript 的沙箱隔離。

在微前端架構(gòu)中,JavaScript 沙箱隔離需要解決如下幾個問題:

  1. 掛在 window 上的全局方法/變量(如 setTimeout、滾動等全局事件監(jiān)聽等)在子應(yīng)用切換時的清理和還原。
  2. Cookie、LocalStorage 等的讀寫安全策略限制。
  3. 各子應(yīng)用獨(dú)立路由的實(shí)現(xiàn)。
  4. 多個微應(yīng)用共存時相互獨(dú)立的實(shí)現(xiàn)。

在 乾坤 架構(gòu)設(shè)計(jì)中,關(guān)于沙箱有兩個入口文件需要關(guān)注,一個是 proxySandbox.ts,另一個是 snapshotSandbox.ts,他們分別基于 Proxy 實(shí)現(xiàn)代理了 window 上常用的常量和方法以及不支持 Proxy 時降級通過快照實(shí)現(xiàn)備份還原。結(jié)合其相關(guān)開源文章分享,簡單總結(jié)下其實(shí)現(xiàn)思路:起初版本使用了快照沙箱的概念,模擬 ES6 的 Proxy API,通過代理劫持 window ,當(dāng)子應(yīng)用修改或使用 window 上的屬性或方法時,把對應(yīng)的操作記錄下來,每次子應(yīng)用掛載/卸載時生成快照,當(dāng)再次從外部切換到當(dāng)前子應(yīng)用時,再從記錄的快照中恢復(fù),而后來為了兼容多個子應(yīng)用共存的情況,又基于 Proxy 實(shí)現(xiàn)了代理所有全局性的常量和方法接口,為每個子應(yīng)用構(gòu)造了獨(dú)立的運(yùn)行環(huán)境。

另外一種值得借鑒的思路是阿里云開發(fā)平臺的 Browser VM,其核心入口邏輯在 Context.js 文件中。它的具體實(shí)現(xiàn)思路是這樣的:

  1. 借鑒 with 的實(shí)現(xiàn)效果,在 webpack 編譯打包階段為每個子應(yīng)用代碼包裹一層代碼(見其插件包 breezr-plugin-os 下相關(guān)文件),創(chuàng)建一個閉包,傳入自己模擬的 window、document、location、history 等全局對象(見 根目錄下 相關(guān)文件)。
  2. 在模擬的 Context 中,new 一個 iframe 對象,提供一個和宿主應(yīng)用空的(about:blank) 同域 URL 來作為這個 iframe 初始加載的 URL(空的 URL 不會發(fā)生資源加載,但是會產(chǎn)生和這個 iframe 中關(guān)聯(lián)的 history 不能被操作的問題,這時路由的變換只支持 hash 模式),然后將其下的原生瀏覽器對象通過 contentWindow 取出來(因?yàn)?iframe 對象天然隔離,這里省去了自己 Mock 實(shí)現(xiàn)所有 API 的成本)。
  3. 取出對應(yīng)的 iframe 中原生的對象之后,繼續(xù)對特定需要隔離的對象生成對應(yīng)的 Proxy,然后對一些屬性獲取和屬性設(shè)置,做一些特定的實(shí)現(xiàn)(比如 window.document 需要返回特定的沙箱 document 而不是當(dāng)前瀏覽器的document 等)。
  4. 為了文檔內(nèi)容能夠被加載在同一個 DOM 樹上,對于 document,大部分的 DOM 操作的屬性和方法仍舊直接使用宿主瀏覽器中的 document 的屬性和方法處理等。

總的來說,在 Browser VM 的實(shí)現(xiàn)中, 可以看出其實(shí)現(xiàn)部分還是借鑒了 乾坤 或者說其他微前端架構(gòu)的思路,比如常見全局對象的代理和攔截。并且借助 Proxy 特性,針對 Cookie、LocalStorage 的讀寫同樣能做一些安全策略的實(shí)現(xiàn)等。但其最大的亮點(diǎn)還是借助 iframe 做了一些取巧的實(shí)現(xiàn),當(dāng)這個為每個子應(yīng)用創(chuàng)建的 iframe 被移除時,寫在其下 window 上的變量和 setTimeout、全局事件監(jiān)聽等也會一并被移除;另外基于 Proxy,DOM 事件在沙箱中做記錄,然后在宿主中生命周期中實(shí)現(xiàn)移除,能夠以較小的開發(fā)成本實(shí)現(xiàn)整個 JavaScript 沙箱隔離的機(jī)制。

除了以上社區(qū)中現(xiàn)在比較火的方案,最近我也在 大型 Web 應(yīng)用插件化架構(gòu)探索 一文中了解到了 UI 設(shè)計(jì)領(lǐng)域的 Figma 產(chǎn)品也基于其插件系統(tǒng)產(chǎn)出了一種隔離方案。起初 Figma 同樣是將插件代碼放入 iframe 中執(zhí)行并通過 postMessage 與主線程通信,但由于易用性以及 postMessage 序列化帶來的性能等問題,F(xiàn)igma 選擇還是將插件放入主線程去執(zhí)行。Figma 采用的方案是基于目前還在草案階段 Realm API,并將 JavaScript 解釋器的一種 C++ 實(shí)現(xiàn) Duktape 編譯到了 WebAssembly,然后將其嵌入到 Realm 上下文中,實(shí)現(xiàn)了其產(chǎn)品下的三方插件的獨(dú)立運(yùn)行。這種方案和探索的基于 Web Worker 的實(shí)現(xiàn)可能能夠結(jié)合得更好,持續(xù)關(guān)注中。

Web Worker 與 DOM 渲染

在了解了 JavaScript 沙箱的「前世今生」之后,我們將目光投回本文的主角——Web Worker 身上。

正如本文開頭所說,Web Worker 子線程的形式也是一種天然的沙箱隔離,理想的方式,是借鑒 Browser VM 的前段思路,在編譯階段通過 Webpack 插件為每個子應(yīng)用包裹一層創(chuàng)建 Worker 對象的代碼,讓子應(yīng)用運(yùn)行在其對應(yīng)的單個 Worker 實(shí)例中,比如:

__WRAP_WORKER__(`/* 打包代碼 */ }`);

function __WRAP_WORKER__(appCode{
    var blob = new Blob([appCode]);
    var appWorker = new Worker(window.URL.createObjectURL(blob));


但在了解過微前端下 JavaScript 沙箱的實(shí)現(xiàn)過程后,我們不難發(fā)現(xiàn)幾個在 Web Worker 下去實(shí)現(xiàn)微前端場景的 JavaScript 沙箱必然會遇到的幾個難題:

  1. 出于線程安全設(shè)計(jì)考慮,Web Worker 不支持 DOM 操作,必須通過 postMessage 通知 UI 主線程來實(shí)現(xiàn)。
  2. Web Worker 無法訪問 window、document 之類的瀏覽器全局對象。

其他諸如 Web Worker 無法訪問頁面全局變量和函數(shù)、無法調(diào)用 alert、confirm 等 BOM API 等問題,相對于無法訪問 window、document 全局對象已經(jīng)是小問題了。不過可喜的是,Web Worker 中可以正常使用 setTimeout、setInterval 等定時器函數(shù),也仍能發(fā)送 ajax 請求。

所以,當(dāng)先要解決問題,便是在單個 Web Worker 實(shí)例中執(zhí)行 DOM 操作的問題了。首先我們有一個大前提:Web Worker 中無法渲染 DOM,所以,我們需要基于實(shí)際的應(yīng)用場景,將 DOM 操作進(jìn)行拆分。

React Worker DOM

因?yàn)槲覀兾⑶岸思軜?gòu)中的子應(yīng)用局限在 React 技術(shù)棧下,我先將目光放在了基于 React 框架的解決方案上。

在 React 中,我們知道其將渲染階段分為對 DOM 樹的改變進(jìn)行 Diff 和實(shí)際渲染改變頁面 DOM 兩個階段這一基本事實(shí),那能不能將 Diff 過程置于 Web Worker 中,再將渲染階段通過 postMessage 與主線程進(jìn)行通信后放在主線程進(jìn)行呢?簡單一搜,頗為汗顏,已經(jīng)有大佬在 5、6 年前就有嘗試了。這里我們可以參考下 react-worker-dom 的開源代碼。

react-worker-dom 中的實(shí)現(xiàn)思路很清晰。其在 common/channel.js 中統(tǒng)一封裝了子線程和主線程互相通信的接口和序列化通信數(shù)據(jù)的接口,然后我們可以看到其在 Worker 下實(shí)現(xiàn) DOM 邏輯處理的總?cè)肟谖募?worker 目錄下,從該入口文件順藤摸瓜,可以看到其實(shí)現(xiàn)了計(jì)算 DOM 后通過 postMessage 通知主線程進(jìn)行渲染的入口文件 WorkerBridge.js 以及其他基于 React 庫實(shí)現(xiàn)的 DOM 構(gòu)造、Diff 操作、生命周期 Mock 接口等相關(guān)代碼,而接受渲染事件通信的入口文件在 page 目錄下,該入口文件接受 node 操作事件后再結(jié)合 WorkerDomNodeImpl.js 中的接口代碼實(shí)現(xiàn)了 DOM 在主線程的實(shí)際渲染更新。

簡單做下總結(jié)?;?React 技術(shù)棧,通過在 Web Worker 下實(shí)現(xiàn) Diff 與渲染階段的進(jìn)行分離,可以做到一定程度的 DOM 沙箱,但這不是我們想要的微前端架構(gòu)下的 JavaScript 沙箱。先不談拆分 Diff 階段與渲染階段的成本與收益比,首先,基于技術(shù)??蚣艿奶厥庑运龅倪@諸多努力,會隨著這個框架本身版本的升級存在著維護(hù)升級難以掌控的問題;其次,假如各個子應(yīng)用使用的技術(shù)??蚣懿煌獮檫@些不同的框架分別封裝適配的接口,擴(kuò)展性和普適性弱;最后,最為重要的一點(diǎn),這種方法暫時還是沒有解決 window 下資源共享的問題,或者說,只是啟動了解決這個問題的第一步。

接下來,我們先繼續(xù)探討 Worker 下實(shí)現(xiàn) DOM 操作的另外一種方案。window 下資源共享的問題我們放在其后再作討論。

AMP WorkerDOM

在我開始糾結(jié)于如 react-worker-dom 這種思路實(shí)際落地開發(fā)的諸多「天塹」問題的同時,瀏覽過其他 DOM 框架因?yàn)橥瑯泳邆洳寮C(jī)制偶然迸進(jìn)了我的腦海,它是 Google 的 AMP。

AMP 開源項(xiàng)目 中除了如 amphtml 這種通用的 Web 組件框架,還有很多其他工程采用了 Shadow DOM、Web Component 等新技術(shù),在項(xiàng)目下簡單刷了一眼后,我欣喜地看到了工程 worker-dom。

粗略翻看下 worker-dom 源碼,我們在 src 根目錄下可以看到 main-thread 和 worker-thread 兩個目錄,分別打開看了下后,可以發(fā)現(xiàn)其實(shí)現(xiàn)拆分 DOM 相關(guān)邏輯和 DOM 渲染的思路和上面的 react-worker-dom 基本類似,但 worker-dom 因?yàn)楹蜕蠈涌蚣軣o關(guān),其下的實(shí)現(xiàn)更為貼近 DOM 底層。

先看 worker-thread DOM 邏輯層的相關(guān)代碼,可以看到其下的 dom 目錄 下實(shí)現(xiàn)了基于 DOM 標(biāo)準(zhǔn)的所有相關(guān)的節(jié)點(diǎn)元素、屬性接口、document 對象等代碼,上一層目錄中也實(shí)現(xiàn)了 Canvas、CSS、事件、Storage 等全局屬性和方法。

接著看 main-thread,其關(guān)鍵功能一方面是提供加載 worker 文件從主線程渲染頁面的接口,另一方面可以從 worker.ts 和 nodes.ts 兩個文件的代碼來理解。

在 worker.ts 中像我最初所設(shè)想的那樣包裹了一層代碼,用于自動生成 Worker 對象,并將代碼中的所有 DOM 操作都代理到模擬的 WorkerDOM 對象上:

const code = `
      'use strict';
      (function(){
        ${workerDOMScript}
        self['window'] = self;
        var workerDOM = WorkerThread.workerDOM;
        WorkerThread.hydrate(
          workerDOM.document,
          ${JSON.stringify(strings)},
          ${JSON.stringify(skeleton)},
          ${JSON.stringify(cssKeys)},
          ${JSON.stringify(globalEventHandlerKeys)},
          [${window.innerWidth}${window.innerHeight}],
          ${JSON.stringify(localStorageInit)},
          ${JSON.stringify(sessionStorageInit)}
        );
        workerDOM.document[${TransferrableKeys.observe}](this);
        Object.keys(workerDOM).forEach(function(k){self[k]=workerDOM[k]});
}).call(self);
${authorScript}
//# sourceURL=${encodeURI(config.authorURL)}`
;
this[TransferrableKeys.worker] = new Worker(URL.createObjectURL(new Blob([code])));

在 nodes.ts 中,實(shí)現(xiàn)了真實(shí)元素節(jié)點(diǎn)的構(gòu)造和存儲(基于存儲數(shù)據(jù)結(jié)構(gòu)是否以及如何在渲染階段有優(yōu)化還需進(jìn)一步研究源碼)。

同時,在 transfer 目錄下的源碼,定義了邏輯層和 UI 渲染層的消息通信的規(guī)范。

總的來看,AMP WorkerDOM 的方案拋棄了上層框架的約束,通過從底層構(gòu)造了 DOM 所有相關(guān) API 的方式,真正做到了與框架技術(shù)棧無關(guān)。它一方面完全可以作為上層框架的底層實(shí)現(xiàn),來支持各種上層框架的二次封裝遷移(如工程 amp-react-prototype),另一方面結(jié)合了當(dāng)前主流 JavaScript 沙箱方案,通過模擬 window、document 全局方法的并代理到主線程的方式實(shí)現(xiàn)了部分的 JavaScript 沙箱隔離(暫時沒看到路由隔離的相關(guān)代碼實(shí)現(xiàn))。

當(dāng)然,從我個人角度來看,AMP WorkerDOM 也有其當(dāng)前在落地上一定的局限性。一個是對當(dāng)前主流上層框架如 Vue、React 等的遷移成本及社區(qū)生態(tài)的適配成本,另一個是其在單頁應(yīng)用下的尚未看到有相關(guān)實(shí)現(xiàn)方案,在大型 PC 微前端應(yīng)用的支持上還無法找到更優(yōu)方案。

其實(shí),在了解完 AMP WorkerDOM 的實(shí)現(xiàn)方案之后,基于 react-worker-dom 思路的后續(xù)方案也可以有個大概方向了:渲染通信的后續(xù)過程,可考慮結(jié)合 Browser VM 的相關(guān)實(shí)現(xiàn),在生成 Worker 對象的同時,也生成一個 iframe 對象,然后將 DOM 下的操作都通過 postMessage 發(fā)送到主線程后,以與其綁定的 iframe 兌現(xiàn)來執(zhí)行,同時,通過代理將具體的渲染實(shí)現(xiàn)再轉(zhuǎn)發(fā)給原 WorkerDomNodeImpl.js 邏輯來實(shí)現(xiàn) DOM 的實(shí)際更新。

小結(jié)與一些個人前瞻

首先聊一聊個人的一些總結(jié)。Web Worker 下實(shí)現(xiàn)微前端架構(gòu)下的 JavaScript 沙箱最初是出于一點(diǎn)個人靈光的閃現(xiàn),在深入調(diào)研后,雖然最終還是因?yàn)檫@樣那樣的問題導(dǎo)致在方案落地上無法找到最優(yōu)解從而放棄采用社區(qū)通用方案,但仍不妨礙我個人對 Web Worker 技術(shù)在實(shí)現(xiàn)插件類沙箱應(yīng)用上的持續(xù)看好。插件機(jī)制在前端領(lǐng)域一直是津津樂道的一種設(shè)計(jì),從 Webpack 編譯工具到 IDE 開發(fā)工具,從 Web 應(yīng)用級的實(shí)體插件到應(yīng)用架構(gòu)設(shè)計(jì)中插件擴(kuò)展設(shè)計(jì),結(jié)合 WebAssembly 技術(shù),Web Worker 無疑將在插件設(shè)計(jì)上占據(jù)舉足輕重的地位。

其次是一些個人的一些前瞻思考。其實(shí)從 Web Worker 實(shí)現(xiàn) DOM 渲染的調(diào)研過程中可以看到,基于邏輯與 UI 分離的思路,前端后續(xù)的架構(gòu)設(shè)計(jì)有很大機(jī)會能夠產(chǎn)生一定的變革。目前不管是盛行的 Vue 還是 React 框架,其框架設(shè)計(jì)不論是 MVVM 還是結(jié)合 Redux 之后的 Flux,其本質(zhì)上仍舊還是由 View 層驅(qū)動的框架設(shè)計(jì)(個人淺見),其具備靈活性的同時也產(chǎn)生著性能優(yōu)化、大規(guī)模項(xiàng)目層級升上后的協(xié)作開發(fā)困難等問題,而基于 Web Worker 的邏輯與 UI 分離,將促使數(shù)據(jù)獲取、處理、消費(fèi)整個流程的進(jìn)一步的業(yè)務(wù)分層,從而固化出一整套的 MVX 設(shè)計(jì)思路。

當(dāng)然,以上這些我個人還處于初步調(diào)研的階段,不成熟之處還需多加琢磨。且聽之,后續(xù)再實(shí)踐之。

作者:ES2049 / 靳志凱

https://segmentfault.com/a/1190000039795656

聲明:文章著作權(quán)歸作者所有,如有侵權(quán),請聯(lián)系小編刪除。



內(nèi)推社群


我組建了一個氛圍特別好的騰訊內(nèi)推社群,如果你對加入騰訊感興趣的話(后續(xù)有計(jì)劃也可以),我們可以一起進(jìn)行面試相關(guān)的答疑、聊聊面試的故事、并且在你準(zhǔn)備好的時候隨時幫你內(nèi)推。下方加 winty 好友回復(fù)「面試」即可。


瀏覽 38
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩高清色| 亚洲日韩欧美一厂二区入| 国产三级一区| 日韩黄色中文字幕| 九九无码| 国产精品久久久久久久久久两年半| 9797色色| 欧美在线免费视频| 欧美黄色免费在线观看| 欧美性猛交| 手机看片福利永久| 亚洲午夜视频| 国产视频网| 草久视频| 国产欧美综合在线| 热久久伊人| 这里只有精品视频在线| 少妇喷水在线观看| 日韩无码一卡二卡| 五月亚洲六月婷婷| 免费中文资源在线观看| 亚洲无码免费在线观看| 国产夫妻在线| 精品乱子伦一区二区三区| 日韩综合另类| 三级网站免费观看| 少妇高潮喷水| 一区二区成人视频| 超碰九一| 在线免费观看av网站| 噜噜噜噜射| 国产毛片久久久久久国产毛片| 精品第一页| 亚洲性网| 91免费视频在线| av无码电影| 做爰视频毛片蜜桃| 国产黄色视频在线观看免费| 日本精品黄色| 亚洲精品视频免费在线观看 | 中文A片| 久久午夜无码鲁丝片午夜精品| 成人免费无遮挡无码黄漫视频| 国产精品成人午夜福利| 亚洲欧美日韩一区二区| 777免费视频| 人妻乱码| 97人妻无码| 91AV在线电影| 免费观看高清无码| 成人网站在线看。| 国产精品国产三级国产AⅤ中文| 久久久久久久极品内射| 欧美天天性| 欧美日韩高清一区| 就去色色五月天| 中文字字幕中文字幕乱码| 欧美三级在线| 国产精品一二三| 精品91| 99久久视频| 91综合视频| 国产av黄色| 色婷婷中文字幕| 亚洲小说区图片区| 色丁香五月婷婷| 欧美三级片在线视频| 超碰碰碰碰| 欧美国产三级| 久久久久久久久久久成人| 国产一级片在线| 爆乳一区二区三区| 狠狠干天天日| 亚洲福利视频网站| 热久久91| 九九精品视频在线播放| 国产AV| av在线免费观看网站| 欧美aaa视频| 骚逼无码| 免费中文字幕av| 亚洲综合精品| 激情五月婷婷丁香| 中文字幕在线网| av天天看| 精品免费国产一区二区三区四区 | 日本少妇做爱| 国产精品三| 九九在线观看视频| 国产成人精品av| 超碰97在线免费观看| 超碰人人在线观看| 3344在线观看免费下载视频| 日本A片在线播放| 国产亲子乱XXXXinin| 久久午夜影院| 在线免费观看AV片| 人人操天天操| 黑人AV在线| 无码一区二区三区四区五区| 亚洲精品成人| 韩国午夜激情| 欧美久久一区二区三区四区视频| 麻豆疯狂做受XXXX高潮视频| 美国熟妇| 中文字幕无码Av在线| av免费观看网址| 91插插插插| 影音先锋男人网| 污网站18禁| 夜夜夜叫天天天做| 久久在线免费视频| 婷婷五月久久| 人人妻人人操人人| 色搞搞| av在线免费播放| 国产一区二区三区视频| 国产探花视频在线免费观看| 免费看A级片| 中文字幕精品久久久久人妻红杏Ⅰ| 一级aa视频| 美女高潮在线| 91麻豆精品国产91久久久久久 | 蜜桃av秘一区二区三区| 日本少妇久久| 国产av影音| 9色在线| 欧美激情四射| 综合网插菊花| 一区二区三区无码高清| 91精品久久久久久粉嫩| 无码免费婬AV片在线观看| 99热网站| 免费在线观看黄片| 肏逼网站在线观看| 黄色片亚洲| 国产自慰一区| 欧美日韩在线看| AV久草| 456亚洲影院| 99色热| 免费无码国产在线53| 五月丁香啪啪啪| 久久精彩| 高潮91PORN蝌蚪九色| 国产又粗又大又长| 色噜噜一区二区三区| 一级操逼毛片| 99re在线视频观看| 囯产精品久久久久久久久久| 五月婷婷在线观看| 日本成片网| 黄片网址在线观看| AV黑人| 亚洲无码图片| 青青青草视频在线观看| 国产成人av在线| 91麻豆成人| 欧美激情伊人久久五月天| 综合激情五月婷婷| 香蕉中文在线| 日韩一级免费电影| 中文字幕在线日亚洲9| 人人操人人摸人人| 免费操逼网站| 97资源网站| 91精品国产91久久久久久吃药 | 91人妻无码精品蜜桃| 成人做爰黄A片免费看陈冠 | 中文字幕精品一区久久久久| 国产人成| 东京热视频免费观看| 国产在线观看无码免费视频| 日韩久久精品| 健身房被教练3p喷水了| AV无码人妻| 91九色蝌蚪91POR成人| 亚洲.欧美.丝袜.中文.综合| 免费三级网站| 中文无码AV| 无码日韩av| 人人爽人人爽人人| 超碰人人操人人摸| 国内自拍一区| 国产成人无码A片V99| 亚洲天堂2014| 高清无码小视频| 欧洲性爱视频| 黄色成人网站在线| 五月av| 麻豆疯狂做受XXXX高潮视频 | 成人四区| 日韩极品视频| 免费看性蜜桃| 国产一级在线免费观看| 日逼网站视频| 91ThePorn国产在线观看| 蜜桃网站| 操逼AV无码| 国产成人V在线精品一区| 亚洲一区翔田千里无码| 亚洲免费观看高清完整版在va线 | 自慰影院| 亚洲性爱一区二区| 伊人网视频在线观看| 婷婷五月天激情丁香| 日韩一级在线免费观看| 亚洲综合成人网| 骚逼av| 亚洲口味重一级黄片| 日韩干| 成人一级a片| 丁香婷婷色| 另类老妇奶性BBWBBw| 自拍视频在线| 99热热| 欧美V| 操逼视频网| 丰满的人妻一区二区10| 天天综合在线观看| 免费观看黄色片| 在线看A片| 日日夜夜草| 国产精品V亚洲精品V日韩精品| 欧美视频第一页| 国产激情综合五月久久| 成人激情久久| 成人精品一区二区区别解析| 午夜香蕉| 精品国产乱子伦一区二区三区,小小扐 | av福利在线观看| 69国产成人综合久久精品欧美| 搡BBB搡BBBB搡BBBB'| 久久私人影院| 中文字幕乱| 国产欧美一区二区三区国产幕精品 | 強姦婬片A片AAA毛片Mⅴ| 免费国产h| 国产精品美女在线观看| 中文乱伦视频| 国产三级| 欧美一级特黄真人做受| 一级Aa视频免费看| 黄色片免费| 成年人久久| 亚洲色图片区| 強姧伦一区二区三区在线播放| 国产成人无码毛片| 狠狠操2019| 黄色小视频免费观看| 91干穴穴在线观看| 中文字幕国产在线观看| 色老板亚洲| 免费A级毛片| 国产无遮挡又黄又爽又色视频软件| 日韩人妻码一区二区三区| 高清无码在线观看视频| 天天干天天在线观看| 思思热99热| 亚洲玖玖爱| 色色色色色色色色欧美| 91久九九| 色逼| 欧美级毛片高潮| 免费视频亚洲| 亚洲成人黄色网| 懂色午夜福利一区二区三区| 日本黄A三级三级三级| 成人无码人妻| 综合天堂网| 国产乱论视频| 久久亚洲AV| 亚洲影视中文字幕| www.丁香五月| 内射毛片| 曰曰干| 91成人精品一区二区| 日本伊人在线综合视频| 成人av免费观看| 五月色综合| 你懂的在线视频观看| 91在线一区二区三区| 春色激情| 骚骚肥肥一区二区三区| 欧美夜夜| 婷婷黄色电影| 91爱逼| www.啪啪| 人人弄| 91在线日韩| 美女久草| 亚洲字幕在线观看| 国产视频福利| 国产91探花精品一区二区| 日韩爱爱视频| 老太色HD色老太HD.| 人人草人人澡| 性色aV中文字幕| 黄色a级毛片| 西西444www| 欧美性受XXXX黑人XYX性爽一 | 一道本无码在线观看| 人妻少妇精品| 曰曰操| 日韩精品网| 无码毛片在线观看| 欧美午夜精品成人片在线播放| 日韩欧美视频一区国产欧美在线| 9热在线视频| 亚洲在线视频观看| 国产一区二区三区四区在线观看 | 狠狠干五月| 国产精品污www在线观看| 亚洲精品乱码久久久久| 欧美特黄一级视频| 狠狠操在线视频| 欧美色图在线观看视频| 国产一级a毛一级a毛视频在线网站 | 91成人精品视频| 大香蕉九九| 日老女人的逼| 伊人网在线免费视频| 国产精品98| 性爱AV在线观看| 麻豆黄色| 99久久99久国产黄毛片| 蜜桃性爱视频| 亚洲一级片| 91麻豆福利| www.黄| 翔田千里无码AV在线观看| 中文字幕无码在线播放| 红桃91人妻爽人妻爽| 久久中文视频| 强行征服邻居人妻HD高清日本| 国产h视频在线观看| 成年无码| 亚洲无码专区在线| av天堂小说网| 国内免费av| 国产成人久久777777| 国产又爽又黄A片| av电影在线免费观看| 日韩一级电影在线观看| 人妖和人妖互交性XXXX视频 | 成人毛片在线播放免费| 人妻无码不卡| 国产一级操逼| 特级婬片A片AAA毛片AA做头| 97人妻碰碰中文无码久热丝袜 | 久久久久久婷婷| 久久Av电影| 美女自慰网站免费| 体内射精免费视频| 日韩一区二区在线视频| 久久精品视频在线免费观看| 国产精品国产三级国产专业不 | 91久久国产性奴调教| 亚洲国产中文字幕在线播放 | 国模私拍视频| 免费观看日韩无码视频| 69式荫蒂被添全过程频| 伊人网导航| 亚洲女人被黑人巨大进入| 西欧超碰在线| 国产一区无码| 中文字幕视频免费| 91人人操| 影音先锋av无码| 在线一级A片| 大茄子熟女AV导航| 老司机精品视频在线观看| 在线亚洲观看| 青青操天天干| 久久水蜜桃| 日韩在线中文字幕| 制服.丝袜.亚洲.中文豆花| 7799精品视频天天看| 中文字幕操逼网站| 婷婷久久网| 欧美综合视频在线观看| 欧美日韩无码| 亚洲三级黄片| 国产一区二区av| 大香蕉在8线| 中出欧美亚洲| 亚洲秘无码一区二区三区蜜桃中文 | 成人欧美精品| 自拍偷拍免费| 国产亚洲Av| 亚洲高清毛片一区二区| 久久思思热| 婷婷操逼网| 黃色A片一級二級三級免費久久久| 人妻精品在线| 色噜噜一区二区| 中文字幕欧美在线| 成人免费视频在线| 自拍偷拍网| 成人欧美精品区二区三| 日韩精品黄片| 毛片区| 精品美女视频| 成人性爱福利视频| 婷婷五月丁香花| 老女人AV| 久久久在线| AV福利在线| 久久久精品久久| 久久亚洲国产| 一插菊花网| 高清欧美日韩第一摸| 97精品人人妻人人| 黄色视频大全免费看| 加勒比无码在线| 三级片视频网址| 国产国产国产在线无码视频| 狠狠草视频| a片免费观看视频| 中出欧美亚洲| 特级西西人体444.444人体聚色 | 少妇一级片| 影音av资源| 国产午夜福利免费视频在线观看| 色综合久久88色综合天天| 成人小说视频| 日韩一及| 成人欧美| 九一av| 日韩精品一区二区三免费视频| 91无码精品国产| 韩国无码一区二区| 长泽梓黑人初解禁BDD07| 91精品大屁股白浆自慰久久久| 美女人人操| 成人黄色在线| 亚洲精品一级二级三级| 欧美性爱AAA| 欧美,日韩,日| av片在线观看| 在线观看av资源| 国产免费黄色视频| 中文字幕一区二区三区四区五区六区| 99精品国产热久久91色欲| 91在线观看18| 国产操逼视频网站| 白天操夜夜操| 久久亚洲日韩天天做日日做综合亚洲 | AV自拍偷拍| 全部在线A片免费播放| 91麻豆精品国产91久久久熟女 | 久久一道| 国产一级黄色A片| 天天干天天射天天操| 欧美亚洲成人网| 激情婷婷六月| 91香蕉| 黄色片视频在线观看| 熟女伦乱| 一区二区三区免费| 91含羞草www·Com| 嫩草嫩草69| 尤物Av| 操大香蕉| 91国产乱伦| 91视频网站入口| 免费黄色成人网站| 1024国产| 国产激情在线观看视频| 91国产视频在线播放| 婷婷精品国产a久久综合| 日韩av小电影| 人妖和人妖互交性XXXX视频 | 免费国产精品视频| 日韩精品成人专区无码| 国产婷婷色一区二区在线观看| 欧美群交videotv群交| 日韩欧美国产黄色电影| 欧美精品黄片| 久久精品91| 国产精品国产三级国产| 久久久久久三级电影| 亚洲人体视频| 国产乱子伦-区二区三区熟睡91 | 一级爱爱爱| 国产又粗又大又黄视频| 在线观看无码视频| 国产在线中文字幕| 久久国产一区二区三区| 夜色精品视频| 亚洲欧美综合| 国模私拍视频| 啪啪网站免费观看| 无码人妻精品一区二区蜜桃网站 | 大香蕉看片| 午夜福利AV在线| 蜜臀av一区| 久久久久久久久久久久久久久久久久久久| 国产精品一区二| 亚洲在线成人视频| 欧美婷婷在线| 五月天干美女| 久久草草热国产精品| 国产亚洲久一区二区三区| 亚洲精品黄色电影| 国内自拍激情视频| 亚洲AV成人无码| 国产精品久久毛片A片| 国产精品综合| 成人久久大香蕉| 亚洲色图15p| 色天堂网| 亚洲天堂无码高清| 亚洲成人午夜电影| 少妇熟女视频| 日本翔田千里奶水| 日韩精品无码一区二区三区| 色婷婷视频一区二区| 国产精成人品| AV大全在线观看| 人人艹在线| 日韩AV无码专区亚洲AV紧身裤| 99久久九九| 2025天天干| 各种BBwBBwBBwBBw| 日韩精品网址| 青春草在线视频观看| 日本中文无码视频| 欧美性爱a视频| 影音先锋成人| 西西444WWW大胆无视频软件亮点 | 国产激情在线| 美女福利导航| 午夜精品18码视频国产17c| 柠檬AV导航| 国产日韩二区| 一级a一级a爰片免费免免在线 | 欧美成人网站在线| 俺去俺来也www色官网黑人| av東熱激情东京热| 日本三级片免费| 国产黄色一级片| 欧美国产精品一二三产品在哪买| 熟妇人妻丰满久久久久久久无码| 91看片看婬黄大片女跟女| 九九re精品视频在线观看| 97这里只有精品| 亚洲网站在线观看| 久草手机在线视频| 日韩高清无码专区| 欧美操b视频| 亚洲vs天堂vs成人vs无码| 日韩中文字幕一区| 人人澡人人澡人人| 99热这里只有精品7| 黄色爱爱视频| AAA三级视频| 伊人大香蕉视频| 色哟哟av| 亚洲无码成人视频| 日韩香蕉视频| 黄色视频在线免费观看高清视频 | 成人AV午夜福利| 狼人狠干| 无码精品一区二区三区在线| 久久久婷婷婷| 亚洲成人免费在线观看| 黄色高清无码视频| 日韩久久婷婷| 波多野结衣无码在线| 91亚洲国产成人精品一区| 日韩成人三级| 大香蕉在线75| 99草在线视频| 高清无码一级片| 豆花视频一区| 天天插天天爽| 天天色免费视频| 日韩欧美不卡| 亚洲玖玖爱| 亚洲视频中文字幕| 91视频专区| 久久另类TS人妖一区二区| 91性爱视频在线观看| 久久国产热| 日本在线不卡视频| 国产激情123区| 日韩av中文在线| 国产xxxx| AV黄片| 天天艹天天干| 久久超碰99| 欧美成人免费精品| 久久a久久| 天堂A片电影网站在线观看| AV无码高清| 操逼网站免费观看| 免费av在线播放| 老熟女导航| 91久久人澡人妻人人做人人爽97| 亚洲欧洲无码在线| 成人在线视频免费| 高清无码在线免费| 黄色成人网站在线播放| 国产三级片在线观看视频| 91麻豆福利| 天堂在线中文网| 欧美精品一级| 日韩三级视频在线观看| 免费操逼网址| 免费亲子乱婬一级A片| 亚洲无码高清视频在线| 四虎A片| 大鸡巴免费视频| 一区在线免费观看| 大炕上公让我高潮了六次| 麻豆AV免费看| 日韩久久婷婷| 免费在线亚洲| 黄色免费视频| aav在线| 国产精品秘国产精品88| 三须三级久久三级久久18| 大BBBw大BBBW另类| 日日碰狠狠躁久久躁婷婷| 性爱AV| 在线观看免费欧美操逼视频| 色色色成人视频| 男人AV网| www一个人免费观看视频www| 国产精品久久久| 欧美成人第一页| 男人的天堂色婷婷| 中文字幕35页| 久久久久性| 日韩一区不卡| 亚洲伊人大香蕉| 婷婷五月天啪啪| 欧美激情国产精品| 欧美成人精品激情在线观看 | 黄色成人网站在线免费观看| 国产高清久久| 国产高清无码福利| 无码三级av| 免费在线观看AV片| 99re在线精品| 日本99视频| 激情五月天激情网| 九九re精品视频在线观看| 亚洲va欧美va| 午夜视频无码| 91久久偷拍视频| 欧美日韩国产在线观看| 在线观看黄色片| 91蜜臀| 青娱乐精品| 国产一区二区三区18| 亚洲高清在线| 欧美丝袜脚交xxxxBH| 佳佳女王footjob超级爽| 国精品无码人妻一区二区三区免费 | 欧美亚洲成人网| 色综合天天综合成人网| 欧美性爱xxxx| 久久久噜噜噜| 欧美熟妇性爱| 欧美AAA视频| 亚洲一区在线播放| 无码中文av| 成人网站在线免费| www黄片| 国产成人免费视频| 久久香蕉综合在线| 日皮视频免费看| 性V天堂| 三级三级久久三级久久18| AV在线精品| 亚洲夜夜撸| 欧美成人无码A片免费| 日本无码一区二区三区| 麻豆AV96熟妇人妻| 91久久国产综合久久| 91综合网| 蜜桔视频嫩草蜜桃| 91迷奸| 北条麻妃无码观看| 国产精品黄色电影| 久久五月天婷婷| 91乱子伦国产乱子伦| 大香蕉超碰| 人人摸人人搞| 操逼逼一区二区三区| 国产色秘乱码一区二区三区| 国产麻豆精品ThePorn| 日韩啪啪片| 操逼免费观看视频| 欧美一二三区黄色免费视屏| 中文字幕东京热加勒比| 中字无码AV| 亚洲精品少妇| 无码国产av| 日韩精品一区在线| 欧美成人怡红院| 天天干人妻| 国产三级91| 91天天干| 久久加勒比| 国产主播精品| 国产特级毛片AAAAAA| a片网站在线观看| 国产精品无码激情| 精品aaa| 97精品国产97久久久久久免费 | 亚洲欧美在线观看| 无套免费视频欧美| 99热在线观看精品| 日韩黄色精品| 久久婷婷婬片A片AAA| 91小视频在线| 亚洲精品人伦一区二区| 久久一道| 污网站免费观看| 黃色级A片一級片| 精品无码免费| 偷拍一区| 黄色视频免费在线观看| 国产亚洲欧美一区二区| 人妻人人妻| 日本一区中文字幕| 国产成人网站免费观看| 熟女AV888| 亚洲精品人妻在线| AV三级片在线观看| 精品久久电影| 日韩美女操逼| 中文精品字幕人妻熟女| 麻豆AV在线| 搞黄免费视频视频| 国产美女久久久| 豆花成人网站在线看| 91九色蝌蚪91POR成人| 精品乱子伦一区二区三区在线播放 | 撸一撸在线观看| 簧片网站在线观看| 91av成人| 欧美一区二区三区婷婷五月| 日色色色| 第一色网站| 色天堂在线观看视频| 六月丁香视频| 爱搞搞就搞搞| 亚洲AV在线人妻| 成人在线视频一区| 日韩在线成人中文字幕亚洲| 玖玖av| 99热99在线| 亚洲免费观看高清| 国产操屄网| 日韩视频在线观看一区| 亚洲观看黄色网| 99久在线精品99re8| 婷婷五月av| 操一操| 久久九九国产精品怡红院| 国产资源AV| 色呦呦在线| 重庆美女揉BBBB搡BBBB| 亚洲福利在线观看| 日韩av免费| 亚洲福利女神成人福利| 波多野结衣99| 黄色日逼网站| 亚洲黄色免费电影| 黄色91| 91成人片| 色哟哟视频在线观看| 曰曰操| 国产3级片| 天天操b| 日韩欧美一级| 亚洲一本色道中文无码| 成人黄色免费在线| 欧美一级特黄真人做受| 欧美女人日逼视频| 无码伊人| 插综合网| 日本精品乱伦| 亚洲xxxxxx| 欧美日韩中文字幕在线视频| AV天堂无码| 色中文字幕| 色av影音先锋无吗一区| 欧美日韩北条麻妃视频在线观看 | 91看片看婬黄大片女跟女| 免费黄片视频在线观看| 黄片视频免费在线观看| 97这里只有精品| 好男人一区二区三区在线观看| 五月天婷婷色色| 久草手机在线视频| 久久免费操| a视频免费看| 在线免费观看亚洲| 免费av大全| 激情另类| 久久久久亚洲AV无码网影音先锋| 日韩A片免费看| 日本一区二区不卡| 国产在线一二三| 免费看毛片的网站| 91久久国产综合久久91精品网站 | 五月婷婷啪| 看免费黄色视频| 97在线国产| 日韩成人精品| 婷婷V亚洲V丁香月天V日韩V| 欧美AⅤ在线| 亚洲中文无码字幕| 无套免费视频欧美| 国产做受精品网站在线观看| 中文在线不卡| 国产中文在线视频| 久久精品成人电影| 91在线91| 成人综合娱乐网| 3344在线观看免费下载视频| 强奸乱伦制服丝袜| 亚洲无人禁区| 黄色一级视频在线观看| 国产成人视频免费观看| 成人做爰黄A片免费看三区蜜臀 | 欧美成人网站视频| 国产91免费| 91精品婷婷国产综合久久| 国产在线无码观看| 97人人妻| 国产乱国产乱老熟300视频| 51妺嘿嘿午夜福利视频| 久久久亚洲无码精品| 亚洲激情小说| 久久精品无码一区二区无码性色| a√天堂中文在线8| 黄色资源在线观看| 国产免费乱伦| 欧美性猛交XXXXⅩXX| 男女69视频| 99热9| 色婷婷香蕉| 三级片日韩| 嫩BBB揍BBB揍BBB| 大香蕉一区二区三区| 在线日韩一区二区| 欧美日韩亚洲视频| 激情在线视频| 麻豆传媒一区| 欧美性爱怡红院| 毛片在线视频| 福利视频导航自拍| 欧美一级AA大片免费看视频| 日韩一区二区无码| 一级a一级a爰片免费免免在线 | 91视频福利网| 婷婷久久综合久| 国产骚妇| 熟女人妻人妻の视频| 中国黄色A片| 亚洲第一网站| 亚洲加勒比久久88色综合| 欧美网站在线观看| 性爱一区| 人妻啪啪| 亚洲免费黄色电影| 国产精品伦理| 就要干就要操| 久久久久网站| 狼友视频免费| 日本中文在线观看| 日韩少妇| 色综合99久久久无码国产精品| 老汉av| 站街大龄熟女x| 日韩欧美中文| 免费在线观看AV片| 波多野成人无码精品视频| 欧美一级黄色性爱视频| 日韩欧美视频在线播放| 成人av无码| 91麻豆天美传媒在线| 国产成人AV免费无码| 99热亚洲| 久草香蕉| 久久久人妻| 五丁香在线观看AV| 免费观看一级毛一片| 婷婷精品国产a久久综合| 国产AV网| 中文字幕在线观看视频免费| 毛片网站在线观看| 伊人网站| 在线免费观看成人视频|