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

探索小程序底層架構(gòu)原理

開發(fā) 架構(gòu)
在這之前,我們先來思考一個問題,小程序在架構(gòu)上為什么會選擇雙線程?

雙線程架構(gòu)

在這之前,我們先來思考一個問題,小程序在架構(gòu)上為什么會選擇雙線程?

為什么是雙線程?

加載及渲染性能

小程序的設(shè)計之初就是要求快速,這里的快指的是加載以及渲染。

目前主流的渲染方式有以下3種:

  • Web技術(shù)渲染
  • Native技術(shù)渲染
  • Hybrid技術(shù)渲染(同時使用了webview和原生來渲染)

從小程序的定位來講,它就不可能用純原生技術(shù)來進(jìn)行開發(fā),因為那樣它的編譯以及發(fā)版都得跟隨微信,所以需要像Web技術(shù)那樣,有一份隨時可更新的資源包放在遠(yuǎn)程,通過下載到本地,動態(tài)執(zhí)行后即可渲染出界面。

但如果用純web技術(shù)來開發(fā)的話,會有一個很致命的缺點(diǎn)那就是在 Web 技術(shù)中,UI渲染跟 JavaScript 的腳本執(zhí)行都在一個單線程中執(zhí)行,這就容易導(dǎo)致一些邏輯任務(wù)搶占UI渲染的資源,這也就跟設(shè)計之初要求的快相違背了。

因此微信小程序選擇了Hybrid 技術(shù),界面主要由成熟的 Web 技術(shù)渲染,輔之以大量的接口提供豐富的客戶端原生能力。同時,每個小程序頁面都是用不同的WebView去渲染,這樣可以提供更好的交互體驗,更貼近原生體驗,也避免了單個WebView的任務(wù)過于繁重。

微信小程序是以webview渲染為主,原生渲染為輔的混合渲染方式。

管控安全

由于web技術(shù)的靈活開放特點(diǎn),如果基于純web技術(shù)來渲染小程序的話,勢必會存在一些不可控因素和安全風(fēng)險。

為了解決安全管控的問題,小程序從設(shè)計上就阻止了開發(fā)者去使用一些瀏覽器提供的開放性api,比如說跳轉(zhuǎn)頁面、操作DOM等等。如果把這些東西一個一個地去加入到黑名單,那么勢必會陷入一個非常糟糕的循環(huán),因為瀏覽器的接口也非常豐富,那么就很容易遺漏一些危險的接口,而且就算是禁用掉了所有的接口,也防不住瀏覽器內(nèi)核的下次更新。

所以要徹底解決這個問題,必須提供一個沙箱環(huán)境來運(yùn)行開發(fā)者的JavaScript 代碼。這個沙箱環(huán)境只提供純 JavaScript 的解釋執(zhí)行環(huán)境,沒有任何瀏覽器相關(guān)接口。那么像HTML5中的ServiceWorker、WebWorker特性就符合這樣的條件,這兩者都是啟用另一線程來執(zhí)行 javaScript。

這就是小程序雙線程模型的由來:

  • 渲染層:界面渲染相關(guān)的任務(wù)全都在 WebView 線程里執(zhí)行,通過邏輯層代碼去控制渲染哪些界面。一個小程序存在多個界面,所以渲染層存在多個 WebView。
  • 邏輯層:創(chuàng)建一個單獨(dú)的線程去執(zhí)行 JavaScript,在這個環(huán)境下執(zhí)行的都是有關(guān)小程序業(yè)務(wù)邏輯的代碼。

雙線程模型

小程序的架構(gòu)模型有別與傳統(tǒng)web單線程架構(gòu),小程序為雙線程架構(gòu)。

微信小程序的渲染層與邏輯層分別由兩個線程管理,渲染層的界面使用 webview 進(jìn)行渲染;邏輯層采用 JSCore運(yùn)行JavaScript代碼。

webview渲染線程

如何找到渲染層?

1.我們可以通過調(diào)試微信開發(fā)者工具:微信開發(fā)者工具 ->調(diào)試 ->調(diào)試微信開發(fā)者工具

圖片

2.然后我們會再看到一個調(diào)試界面,看起來跟我們平時用的瀏覽器調(diào)試界面幾乎一摸一樣

圖片

但這并不是小程序的渲染層,而是開發(fā)者工具的結(jié)構(gòu)。但我們在里面可以發(fā)現(xiàn)有一些webview標(biāo)簽,在第一個webview上的src屬性看著是不是有點(diǎn)眼熟,沒猜錯的話它就是我們當(dāng)前小程序打開頁面的路徑。所以這個webview才是小程序真正的渲染層。這里你會發(fā)現(xiàn)它里面并不只有一個webview,其實(shí)里面包含著視圖層的webview,業(yè)務(wù)邏輯層webview,開發(fā)者工具的webview。

開發(fā)者工具的邏輯層跑在webview中主要是為了模擬真機(jī)上的雙線程

3.打開渲染層一探究竟

通過showdevTools方法來打開調(diào)試此webview界面的調(diào)試器

document.querySelectorAll('webview')[0].showDevTools(true)

這里我們看到的才真正是小程序的渲染層,也就是小程序代碼編譯后的樣子,我們會發(fā)現(xiàn)這里的標(biāo)簽都與我們開發(fā)時寫的不一樣,都統(tǒng)一加了wx-前綴。了解過webComponent的同學(xué)相信一眼就能看出他們非常相似,但小程序并沒有直接使用webComponent,而是自行搭建了一套組件系統(tǒng)Exparser。

Exparser的組件模型與WebComponents標(biāo)準(zhǔn)中的Shadow DOM高度相似。Exparser會維護(hù)整個頁面的節(jié)點(diǎn)樹相關(guān)信息,包括節(jié)點(diǎn)的屬性、事件綁定等,相當(dāng)于一個簡化版的Shadow DOM實(shí)現(xiàn)。

為什么不直接使用webComponent,而是選擇自行搭建一套組件系統(tǒng)?

點(diǎn)擊查看:

  • 管控與安全:web技術(shù)可以通過腳本獲取修改頁面敏感內(nèi)容或者隨意跳轉(zhuǎn)其它頁面
  • 能力有限:會限制小程序的表現(xiàn)形式
  • 標(biāo)簽眾多:增加理解成本

JSCore邏輯線程

邏輯層我們直接在小程序開發(fā)者工具的調(diào)試器中輸入document就能看到。

小程序?qū)⑺袠I(yè)務(wù)代碼置于同一個線程中運(yùn)行,在小程序開發(fā)者工具中邏輯線程同樣是跑在一個webview中;webview中的appservice.html除了引入業(yè)務(wù)代碼js之外,還有后臺服務(wù)內(nèi)嵌的一些基礎(chǔ)功能代碼。

編譯原理

了解完小程序的雙線程架構(gòu),我們再來看一下小程序的代碼是如何編譯運(yùn)行的,微信開者工具模擬器運(yùn)行的代碼是經(jīng)過本地預(yù)處理、本地編譯,而微信客戶端運(yùn)行的代碼是額外經(jīng)過服務(wù)器編譯的。這里我們還是以微信開發(fā)者工具為例來探索一番。

在開發(fā)者工具輸入openVendor(),會幫我們打開微信開發(fā)者工具的WeappVendor文件夾

圖片

在這里我們我們會看到一些wxvpkg文件,這是小程序的各個版本的基礎(chǔ)庫文件,還有兩個值得我們注意的文件:wcc、wcsc,這兩個文件是小程序的編譯器,分別用來編譯wxml和wxss文件。

編譯wxml

這里我們可以將開發(fā)者工具中的wcc編譯器拷貝一份出來,嘗試去用它編譯一下wxml文件,看看最后的產(chǎn)物是什么?

圖片

我們在終端執(zhí)行一下以下命令

./wcc -b index.wxml >> wxml_output.js

然后它會在當(dāng)前目錄下生成一個wxml_output.js文件,文件中有一個非常重要的方法$gwx,該方法會返回一個函數(shù)。該函數(shù)的具體作用我們可以嘗試執(zhí)行一下看看結(jié)果。

我們打開渲染層webview搜索一下該方法(為了方便查看,這里會用個小項目來演示)

圖片

從這里我們可以看到該方法會傳入一個小程序頁面的路徑,返回的依然是一個函數(shù)

var decodeName = decodeURI("./index/index.wxml")
var generateFunc = $gwx(decodeName)

我們嘗試按這里流程執(zhí)行一下$gwx返回的函數(shù),看看返回的內(nèi)容是什么?

<!--compiler-test/index.wxml-->
<view class="qd_container" >
<text name="title">wxml編譯</text>
<view >{{ name }}</view>
</view>
const func = $gwx(decodeURI('index.wxml'))
console.log(func())

圖片

沒錯,這個函數(shù)正是用來生成Virtual DOM。

編譯wxss

我們同樣可以用微信開發(fā)者工具中的wcsc來編譯一下wxss文件。

(大家認(rèn)為這里應(yīng)該是會生成css文件還是js文件呢?)

我們在終端執(zhí)行一下以下命令來編譯wxss文件

./wcsc -js index.wxss >> wxss_output.js

圖片

相比之前的wcc編譯wxml文件來說,這次的編譯相對來說比較簡單,它主要完成了以下內(nèi)容:

  • rpx單位的換算,轉(zhuǎn)換成px
  • 提供setCssToHead方法將轉(zhuǎn)換好的css添加到head中

rpx動態(tài)適配

小程序提供rpx單位來適配各種尺寸的設(shè)備。

圖片

比如:

/*index.wxss */
.qd_container {
width: 100rpx;
background: skyblue;
border: 1rpx solid salmon;
}
.qd_reader {
font-size: 20rpx;
color: #191919;
font-weight: 400;
}

經(jīng)過編譯之后會生成setCssToHead方法并執(zhí)行

setCssToHead([".",[1],"qd_container { width: ",[0,100],"; background: skyblue; border: ",[0,1]," solid salmon; }\n.",[1],"qd_reader { font-size: ",[0,20],"; color: #191919; font-weight: 400; }\n",])( typeof __wxAppSuffixCode__ == "undefined"? undefined : __wxAppSuffixCode__ );

里面會調(diào)用transformRPX方法將rpx轉(zhuǎn)成px

var transformRPX = window.__transformRpx__ || function(number, newDeviceWidth) {
if ( number === 0 ) return 0;
number = number / BASE_DEVICE_WIDTH * ( newDeviceWidth || deviceWidth );
number = Math.floor(number + eps);
if (number === 0) {
if (deviceDPR === 1 || !isIOS) {
return 1;
} else {
return 0.5;
}
}
return number;
}
// 主要公式
number = number / BASE_DEVICE_WIDTH * (newDeviceWidth || deviceWidth);
number = Math.floor(number + eps); //為了精確
// rpx值 / 基礎(chǔ)設(shè)備寬750 * 真實(shí)設(shè)備寬

渲染流程

上面了解完wxml與wxss的編譯過程,我們再來整體了解一下頁面的渲染流程。

先來了解渲染層模版

從上面的渲染層webview我們可以找到這兩個webview

圖片

第一個index/indexwebview我們上面說了它就是對應(yīng)我們的小程序的渲染層,也就是真正的小程序頁面。

那么下面這個instanceframe.html是什么呢?

這個webview其實(shí)是小程序渲染模版,打開查看一番

圖片

它其實(shí)就是提前注入了一些頁面所需要的公共文件,以及紅框內(nèi)的一些頁面獨(dú)立的文件占位符,這些占位符會等小程序?qū)?yīng)頁面文件編譯完成后注入進(jìn)來。

如何保證代碼的注入是在渲染層webview的初始化之后執(zhí)行?

在剛剛渲染模版webview的下方有這樣一段腳本:

if (document.readyState === 'complete') {
alert("DOCUMENT_READY")
} else {
const fn = () => {
alert("DOCUMENT_READY")
window.removeEventListener('load', fn)
}
window.addEventListener('load', fn)
}

很明顯,這里在頁面初始化完成后,通過alert來進(jìn)行通知。此時的native/nw.js會攔截這個alert,從而知道此時的webview已經(jīng)初始化完成。

整體渲染流程

了解了上面這個重要過程,我們就可以將整個流程串聯(lián)起來了。

1.打開小程序,創(chuàng)建視圖層頁的webview時,此時會初始化渲染層webview,并且會將該web view地址設(shè)置為instanceframe.html,也就是我們的渲染層模版。

2.然后進(jìn)入頁面/index/index,等instanceframewebview初始化完成,會將頁面index/index編譯好的代碼注入進(jìn)來并執(zhí)行。

// 將webview src路徑修改為頁面路徑
history.pushState('', '', 'http://127.0.0.1:26444/__pageframe__/index/index')

/*
...
這里還有一些 wx config及wxss編譯后的代碼
*/

// 這里是
var decodeName = decodeURI("./index/index.wxml")
var generateFunc = $gwx(decodeName)
if (decodeName === './__wx__/functional-page.wxml') {
generateFunc = function () {
return {
tag: 'wx-page',
children: [],
}
}
}
if (generateFunc) {
var CE = (typeof __global === 'object') ? (window.CustomEvent || __global.CustomEvent) : window.CustomEvent;
document.dispatchEvent(new CE("generateFuncReady", {
detail: {
generateFunc: generateFunc
}
}))
__global.timing.addPoint('PAGEFRAME_GENERATE_FUNC_READY', Date.now())
} else {
document.body.innerText = decodeName + " not found"
console.error(decodeName + " not found")
}

3.此時通過history.pushState方法修改webview的src但是webview并不會發(fā)送頁面請求,并且將調(diào)用$gwx為生成一個generateFun方法,前面我們了解到該方法是用來生成虛擬dom的。

4.然后會判斷該方法存在時,通過document.dispatchEvent 派發(fā)發(fā)自定義事件generateFuncReady 將generateFunc當(dāng)作參數(shù)傳遞給底層渲染庫。

5.然后在底層渲染庫WAWebview.js中會監(jiān)聽自定義事件generateFuncReady ,然后通過 WeixinJSBridge 通知 JS 邏輯層視圖已經(jīng)準(zhǔn)備好()。

圖片

6.最后 JS 邏輯層將數(shù)據(jù)給 Webview 渲染層,WAWebview.js在通過virtual dom生成真實(shí)dom過程中,它會掛載到頁面的document.body上,至此一個頁面的渲染流程就結(jié)束了。

數(shù)據(jù)更新

小程序的視圖層目前使用 WebView 作為渲染載體,而邏輯層是由獨(dú)立的 JavascriptCore 作為運(yùn)行環(huán)境。

在架構(gòu)上,WebView 和 JS Core 都是獨(dú)立的模塊,并不具備數(shù)據(jù)直接共享的通道。所以在更新數(shù)據(jù)時必須調(diào)用setData來通知渲染層做更新。

setData

  • 邏輯層虛擬 DOM 樹的遍歷和更新,觸發(fā)組件生命周期和 observer 等;
  • 將 data 從邏輯層傳輸?shù)揭晥D層;
  • 視圖層虛擬 DOM 樹的更新、真實(shí) DOM 元素的更新并觸發(fā)頁面渲染更新。

這里第二步由于WebView 和 JS Core 都是獨(dú)立的模塊,數(shù)據(jù)傳輸是通過 evaluateJavascript 實(shí)現(xiàn)的,還會有額外 JS 腳本解析和執(zhí)行的耗時因此數(shù)據(jù)到達(dá)渲染層是異步的。

因此切記:

  • 不要頻繁的去setData
  • 不要每次 setData 都傳遞大量新數(shù)據(jù)(單次stringify后不超過256kb)
  • 不要對后臺態(tài)頁面進(jìn)行setData,會搶占正在執(zhí)行的前臺頁面的資源

與Vue對比(再來看看Vue)

整體來講,小程序身上或多或少都有著vue的影子...(模版文件,data,指令,虛擬dom,生命周期等)

但在數(shù)據(jù)更新這里,小程序卻與Vue表現(xiàn)的截然不同。

1.頁面更新DOM是同步的還是異步的?

2.既然更新DOM是個同步的過程,為什么Vue中還會有nextTick鉤子?

mounted() {
this.name = '前端南玖'
console.log('sync',this.$refs.title.innerText) // 舊文案
// 新文案
Promise.resolve().then(() => {
console.log('微任務(wù)',this.$refs.title.innerText)
})
setTimeout(() => {
console.log('宏任務(wù)',this.$refs.title.innerText)
}, 0)
this.$nextTick(() => {
console.log('nextTick',this.$refs.title.innerText)
})
}

圖片

責(zé)任編輯:華軒 來源: 前端南玖
相關(guān)推薦

2023-06-09 14:01:00

架構(gòu)程序APP

2021-10-25 09:41:04

架構(gòu)運(yùn)維技術(shù)

2019-10-16 16:33:41

Docker架構(gòu)語言

2021-09-14 09:52:56

ToB小程序生態(tài)評估

2022-10-28 10:23:27

Java多線程底層

2020-11-05 11:14:29

Docker底層原理

2023-01-04 07:54:03

HashMap底層JDK

2024-01-05 09:00:00

SpringMVC軟件

2019-12-16 10:01:54

Java開發(fā)Web

2017-06-09 10:40:00

微信小程序架構(gòu)分析

2017-06-09 12:58:20

微信小程序架構(gòu)分析

2017-06-09 10:06:54

微信小程序架構(gòu)分析

2021-06-10 10:51:27

程序基礎(chǔ)架構(gòu)

2023-10-18 10:55:55

HashMap

2022-12-19 08:00:00

SpringBootWeb開發(fā)

2021-07-05 07:51:43

JVM底層Python

2021-07-23 13:34:50

MySQL存儲InnoDB

2010-02-04 10:43:05

Android DDM

2023-08-11 09:00:00

點(diǎn)贊
收藏

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

亚洲高清免费| 亚洲开心激情| 国产精品国产三级国产aⅴ原创| 国产日韩在线免费| 一区二区在线观看免费视频| 超碰精品在线观看| 一本一本大道香蕉久在线精品| 亚洲第一导航| 日批视频免费播放| 久久成人羞羞网站| 韩国美女主播一区| 呻吟揉丰满对白91乃国产区| 精品在线网站观看| 欧美欧美欧美欧美首页| 国产av人人夜夜澡人人爽麻豆| 国产午夜视频在线观看| 国产一区在线视频| 91国产精品91| caoporn91| 国产96在线亚洲| 欧美视频第二页| 男人的天堂狠狠干| 黄色网页在线看| 久久久久久久电影| 国产精品v欧美精品∨日韩| 中文字幕精品一区二区精| 亚洲激情在线| 日韩中文字幕精品| 日韩一区二区a片免费观看| 天堂久久一区| 色噜噜狠狠一区二区三区果冻| 国产精品igao激情视频| 尤物视频在线免费观看| 久久麻豆一区二区| 国产一区二区高清不卡| a毛片在线免费观看| 美女视频一区二区| 国产精品久久9| 久久午夜免费视频| 国产精品vip| 久久这里只有精品视频首页| 亚洲精品国产一区黑色丝袜| 牛牛视频精品一区二区不卡| 日韩欧美国产综合| 中文av字幕在线观看| 欧美三区四区| 91久久精品一区二区| 国产精品一区二区免费在线观看| 欧美人与禽性xxxxx杂性| 亚洲欧美另类久久久精品 | 久久精品五月天| 亚洲电影在线| 欧美激情在线观看视频| 我家有个日本女人| 亚洲成人av| 久久伊人精品天天| 国产日韩欧美在线观看视频| 久久精品亚洲人成影院 | 粉嫩精品一区二区三区在线观看| 91在线精品入口| 毛片av一区二区| 国产精品久久久久久久久男| 波多野结衣一区二区三区四区| 亚洲欧美日韩精品一区二区 | 麻豆精品一区二区三区视频| 国产精品国内免费一区二区三区| 色偷偷综合社区| 91禁男男在线观看| 欧美gvvideo网站| 日韩在线视频中文字幕| 亚洲综合图片一区| 91精品啪在线观看国产81旧版 | 高清电影在线免费观看| 亚洲一区二区在线观看视频| 男女私大尺度视频| 成人午夜视屏| 欧美日韩在线电影| 国产免费中文字幕| 色妞ww精品视频7777| 欧美videossexotv100| 岛国av免费观看| 性欧美lx╳lx╳| 亚洲一区二区国产| 欧美色图17p| 亚洲精品中文字幕乱码| 久久精品国产99国产精品澳门| 国产这里有精品| 91久久视频| 国产精品高精视频免费| 一级黄色片视频| 国产99久久久国产精品潘金| 久久久久久久久四区三区| 国产福利片在线| 亚洲精品乱码久久久久久久久| 成人免费在线网| 色天使综合视频| 欧美一区二区视频观看视频| 亚洲av无码一区二区三区观看| 精品视频免费在线观看| 欧美精品在线第一页| 日韩精品在线观看免费| 久久99久久99| 韩国成人av| 日韩欧美小视频| 亚洲va韩国va欧美va精品| 国产三级三级三级看三级| 日韩精品三级| 亚洲欧美成人网| 久久免费看少妇高潮v片特黄| 国产精品视区| 亚洲www视频| 国产在线资源| 亚洲一区二区三区中文字幕| 天天碰免费视频| 欧美成年网站| 夜夜嗨av一区二区三区四区| 成人免费看片98| 另类人妖一区二区av| 国产成人av一区二区三区| 韩日在线视频| 亚洲mv大片欧洲mv大片精品| 亚洲第一天堂久久| 美女毛片一区二区三区四区| 欧美精品成人在线| 亚洲天堂中文字幕在线| 久久先锋资源网| 老子影院午夜伦不卡大全| 欧美在线se| 亚洲性视频网站| 日韩伦人妻无码| 国产精品性做久久久久久| 日韩中文字幕一区| 男人最爱成人网| 亚洲国产女人aaa毛片在线| 天天色影综合网| 免费成人在线视频观看| 久久天天狠狠| 超碰资源在线| 亚洲精品一区二区三区蜜桃下载| 国产成人自拍网站| 精品在线视频一区| 亚洲午夜精品国产| 黄色精品视频| 亚洲天堂视频在线观看| 亚洲欧美偷拍一区| 91小视频免费观看| 久久久一本二本三本| 国偷自产视频一区二区久| 欧美日本黄视频| 精品人妻一区二区三区换脸明星| 国产精品第四页| 九九热免费在线观看| 不卡在线一区二区| 国产精品三级久久久久久电影| 国产在线中文字幕| 欧美亚洲国产一区二区三区| 中文字幕免费在线看线人动作大片| 久久婷婷av| 日韩国产高清一区| 99亚洲伊人久久精品影院| 亚洲天堂网在线观看| 国产精品露脸视频| 中文字幕中文字幕一区| 福利视频999| 午夜精品电影| 国产九区一区在线| 麻豆视频在线观看免费网站黄| 日韩极品精品视频免费观看| 黄色片免费观看视频| 国产视频视频一区| 免费一区二区三区在线观看| 91精品精品| 高清av免费一区中文字幕| 丁香花视频在线观看| 亚洲电影中文字幕| 久久夜色精品国产噜噜亚洲av| 国产日产欧美一区| 日本77777| 91久久午夜| 四虎影视永久免费在线观看一区二区三区| 99只有精品| 欧美成年人视频网站| 好吊色一区二区| 色哟哟精品一区| 特级西西人体高清大胆| 国产成人鲁色资源国产91色综| 男女激情无遮挡| av伊人久久| 亚洲一区二区三区四区视频| 国产三级电影在线播放| 中文字幕亚洲综合久久| 亚洲AV无码精品色毛片浪潮| 色综合久久99| 人妻人人澡人人添人人爽| 不卡电影免费在线播放一区| 国产无套粉嫩白浆内谢的出处| 91精品一区二区三区综合在线爱| 精品视频一区二区| a一区二区三区亚洲| 91精品国产电影| 日本福利专区在线观看| 精品国产伦一区二区三区观看方式| 日韩一级在线视频| 亚洲精品久久久蜜桃| 国产精品揄拍100视频| 狠狠色伊人亚洲综合成人| 男人操女人免费软件| 亚洲色图欧美| 色噜噜狠狠一区二区三区| 中文字幕一区二区三区四区久久 | 日韩欧美精品电影| 欧美黑人极品猛少妇色xxxxx | 国产网站一区二区三区| 日韩av片免费观看| 久久男女视频| 99在线观看视频免费| 日韩精品免费一区二区在线观看| 国产欧美日韩在线播放| 97色婷婷成人综合在线观看| 琪琪第一精品导航| 人人澡人人添人人爽一区二区| 一本色道久久综合狠狠躁篇怎么玩| 黑人乱码一区二区三区av| 欧美高清你懂得| 日韩xxx视频| 欧美日韩在线视频观看| 久久久国产精品黄毛片| 中文字幕一区二区三| 国产 欧美 在线| 99久久免费视频.com| 成年人看片网站| 国内精品自线一区二区三区视频| www.超碰com| 亚洲在线国产日韩欧美| 成年人看的毛片| 欧美91福利在线观看| 在线视频欧美一区| 精品视频黄色| 色狠狠久久av五月综合|| 嫩草一区二区三区| 鲁丝一区二区三区免费| 日本欧美韩国国产| 国产一区自拍视频| 国产色噜噜噜91在线精品| aa日韩免费精品视频一| 视频二区欧美毛片免费观看| 91情侣偷在线精品国产| 99re8精品视频在线观看| 国产精品一区二区久久| 天堂久久午夜av| 国产福利精品在线| 日韩漫画puputoon| 国产狼人综合免费视频| 麻豆久久久久| 91精品一区二区| 高清久久一区| 97se在线视频| theporn国产在线精品| 成人免费视频视频在| 亚洲精品一区国产| 国产精品手机视频| 色狼人综合干| 欧美日产一区二区三区在线观看| 最新国产精品视频| 亚洲开发第一视频在线播放| 区一区二视频| 老汉色影院首页| 亚洲大胆av| 97成人在线免费视频| 久久高清免费观看| 日本中文字幕高清| 精品一区二区国语对白| 四虎国产精品免费| 99热精品一区二区| 3d动漫精品啪啪一区二区下载 | 蜜桃成人365av| 91精品国产免费久久久久久 | 亚洲最大福利网| 大奶在线精品| 免费看成人午夜电影| 色婷婷色综合| 美女黄色免费看| 蜜桃久久av| 三级一区二区三区| 国产成人在线影院| 欲求不满的岳中文字幕| 国产精品午夜久久| 加勒比av在线播放| 色偷偷久久一区二区三区| 在线观看不卡的av| 日韩欧美国产系列| 男同在线观看| 精品中文字幕在线观看| 一区二区乱码| 成人国产精品av| 国偷自产视频一区二区久| 日韩在线电影一区| 国内揄拍国内精品久久| 黄色高清无遮挡| 国产精品自拍一区| 国产一二三四五区| 亚洲一区二区三区视频在线播放 | 亚洲国产精品精华素| 日本三级韩国三级久久| 日本精品在线观看| 色女人综合av| 日韩午夜高潮| 男人操女人下面视频| 国产欧美精品一区| 久久精品视频8| 欧美精品九九99久久| 免费在线观看污视频| 九九热99久久久国产盗摄| 国产在线|日韩| 久久精品国产精品青草色艺| 综合在线一区| 校园春色 亚洲色图| 91影院在线观看| 九九视频免费看| 欧美军同video69gay| 欧美孕妇孕交xxⅹ孕妇交| 欧美大片网站在线观看| 久久精品嫩草影院| 欧洲一区二区日韩在线视频观看免费| 韩国一区二区三区在线观看| 在线视频日韩欧美| 中文字幕免费观看一区| 欧美日韩乱国产| 亚洲精品成人久久久| 免费毛片在线看片免费丝瓜视频 | 久久的精品视频| 美女色狠狠久久| 欧美性bbwbbwbbwhd| 一区二区国产在线观看| 亚洲无人区码一码二码三码| 亚洲欧美日韩国产手机在线 | 日本不卡的三区四区五区| 野花社区视频在线观看| 亚洲国产精品久久久久秋霞影院| 99久久夜色精品国产亚洲| 久久精品一区中文字幕| 国内精品伊人| 日韩片电影在线免费观看| 久久免费国产| 亚洲精品国产91| 在线亚洲+欧美+日本专区| 免费在线观看一级毛片| 情事1991在线| 精品视频久久| 欧美精品久久久久久久久25p| 欧美韩日一区二区三区四区| 中文字幕 欧美激情| 日韩在线欧美在线| 亚洲美女色播| 亚洲av综合色区| 国产成人在线视频播放| 久久久久久免费观看| 欧美精品一区视频| 波多野结衣在线播放| 久久国产精品免费一区| 免费中文字幕日韩欧美| 亚洲图片另类小说| 欧美在线视频全部完| 久久日韩视频| 99re6热在线精品视频播放速度| 亚洲国产一区二区三区a毛片| 白嫩情侣偷拍呻吟刺激| 岛国av在线不卡| 成人免费在线电影| 成人久久一区二区| 欧美精品观看| 国产精品无码网站| 欧美探花视频资源| www在线免费观看视频| 国产精成人品localhost| 9久re热视频在线精品| a级片在线观看| 欧美猛男gaygay网站| 婷婷丁香在线| 久久久久无码国产精品一区| 久色婷婷小香蕉久久| 国产精品九九九九九九| 精品视频久久久久久久| 黄色日韩网站| 美女扒开大腿让男人桶| 久久久久久**毛片大全| 91中文字幕在线视频| 性欧美长视频免费观看不卡| 欧美亚洲激情| 欧美熟妇精品一区二区| 色综合久久66| 污污的网站在线免费观看| 欧美日韩一区二区视频在线| 国内成人自拍视频| 中文字幕亚洲精品一区| 播播国产欧美激情| 丝袜久久网站| 伊人免费视频二| 色婷婷av一区二区三区大白胸 | 亚洲**2019国产|