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

基于wujie的解決方案來(lái)簡(jiǎn)單聊聊微前端

共 14074字,需瀏覽 29分鐘

 ·

2024-06-28 08:30

點(diǎn)擊關(guān)注公眾號(hào),“技術(shù)干貨” 及時(shí)達(dá)!

「1.5W 字預(yù)警」

前言

因?yàn)槟壳坝袝r(shí)間了,所以在整理一下自己這幾年寫(xiě)過(guò)的一些東西的相關(guān)文檔,準(zhǔn)備把一些東西改一下發(fā)出來(lái),有的內(nèi)容可能并不復(fù)雜,甚至有點(diǎn)淺顯,但是也是對(duì)自己這幾年的一些復(fù)盤(pán)和總結(jié)了.

往期精彩

什么是微前端,它解決了什么問(wèn)題

什么是微前端

微前端這個(gè)概念相信對(duì)于前端來(lái)講,其實(shí)并不陌生,大家也或多或少看到過(guò)相關(guān)的文章、或者有過(guò)相關(guān)的實(shí)踐,如果我們?nèi)ニ阉鳎菏裁词俏⑶岸?/p>

那么我們其實(shí)很容易找到以下一些類似的定義:

  1. 是將前端應(yīng)?分解成?些更?、更簡(jiǎn)單的能夠獨(dú)?開(kāi)發(fā)、測(cè)試、部署的?塊,?在?戶看來(lái)仍 然是內(nèi)聚的單個(gè)產(chǎn)品的技術(shù)或思想。
  2. 將某個(gè)單?的單體應(yīng)?,轉(zhuǎn)化為多個(gè)可以獨(dú)?運(yùn)?、獨(dú)?開(kāi)發(fā)、獨(dú)?部署、獨(dú)?維護(hù)的服務(wù)或者應(yīng)? 的聚合,從?滿?業(yè)務(wù)快速變化及分布式多團(tuán)隊(duì)并?開(kāi)發(fā)的需求
  3. .......

等等,諸如此類的定義

「這時(shí)候可能會(huì)有同學(xué)會(huì)說(shuō):哎嘿?那我搞幾個(gè)項(xiàng)目里面套幾個(gè)iframe那不也是微前端?」

沒(méi)錯(cuò),如果按照上面的微前端的定義來(lái)說(shuō),iframe或許就是最初的微前端方案了,甚至連通過(guò)nginx路由轉(zhuǎn)發(fā)來(lái)組合不同項(xiàng)目的功能組成一個(gè)系統(tǒng)都能可以是微前端。

那這時(shí)候可能不太清楚的同學(xué)就會(huì)想:既然基于 iframe 我們就可以搭建一套微前端的系統(tǒng)了,那為什么現(xiàn)在業(yè)界的微前端方案還層出不窮,各自都給出了自己的答卷?

關(guān)于這個(gè)問(wèn)題,莫急,關(guān)于這個(gè)我們稍后簡(jiǎn)單討論一下

「前面說(shuō)了這么多,那微前端到底是什么呢?」

就像我們前面說(shuō)過(guò)的一樣,我們將不同的功能模塊或業(yè)務(wù)通過(guò)例如
1、按照業(yè)務(wù)
2、按照權(quán)限
3、按照變更的頻率
4、按照組織結(jié)構(gòu)
5、跟隨后端微服務(wù)設(shè)計(jì)
6、從代碼出發(fā)的ddd實(shí)踐
(可能很多人了解 ddd 這個(gè)概念都是在微前端或者微服務(wù)入坑的,手動(dòng)滑稽.jpg)

等等的各種適用于不同實(shí)際業(yè)務(wù)場(chǎng)景的原則來(lái)劃分出不同的子應(yīng)用,通過(guò)「組合」的方式來(lái)組成一個(gè)完整應(yīng)用的思想和技術(shù)方案 (所以微前端的拆分通常沒(méi)辦法簡(jiǎn)單抄作業(yè))

所以,微前端本質(zhì)上是一種通過(guò) 「模塊化、拼圖式」的開(kāi)發(fā),以「組合的思想」來(lái)降低前端集成的復(fù)雜度和成本的思想(以上概念僅限于個(gè)人理解,本人不為該觀點(diǎn)正確性負(fù)責(zé))

說(shuō)到組合的思想,這時(shí)候可能很多同學(xué)都會(huì)不約而同地想到:

「嘿,終于到我熟悉的領(lǐng)域了」

在目前組合代替繼承的思想流行下,相信每位前端同學(xué)對(duì)組合的思想都有自己的經(jīng)驗(yàn)和見(jiàn)解,那么在這種思想下進(jìn)行的前端開(kāi)發(fā)中碰到的一些組合的思想所帶來(lái)的問(wèn)題,其實(shí)在微前端這種應(yīng)用層面的組合上也不能逃脫

具體的內(nèi)容我們會(huì)在第二部分中再進(jìn)行簡(jiǎn)單的討論

微前端適用于什么場(chǎng)景

在前面我們拋出了一大堆的概念,大家其實(shí)對(duì)微前端的思想也有了一定的了解,很多人可能這時(shí)候會(huì)在想:
前面巴巴巴說(shuō)了一大堆,那我一定就要用到這玩意嗎?
它能給我們的業(yè)務(wù)帶來(lái)什么價(jià)值,能超過(guò)它所帶來(lái)的項(xiàng)目管理的問(wèn)題嗎?
(雖然我們可以通過(guò) Lerna+Monorepo之類的工程結(jié)構(gòu)來(lái)緩解管理的問(wèn)題)
我們面臨的問(wèn)題就非它不可,必須要從架構(gòu)的層面上去改變嗎?

其實(shí)在采用微前端架構(gòu)的時(shí)候,不管是用 qiankun,還是用 iframe,抑或是其他的什么解決方案,能用不同框架只是添頭,實(shí)際上并沒(méi)有觸及到問(wèn)題的本質(zhì),微前端各個(gè)部分之間相互獨(dú)立,獨(dú)立部署的能力本質(zhì)上是在允許構(gòu)建孤立或「松散耦合」的服務(wù)。

而松散耦合的系統(tǒng),對(duì)于開(kāi)發(fā)、維護(hù)、還是后期漸進(jìn)式重構(gòu)的好處都是毋庸置疑的。

什么是松散耦合

松散耦合是各種相互聯(lián)合事件的反映但是,每一個(gè)事件也都在保持自身的獨(dú)特性,也存在著某些物質(zhì)或邏輯上的分離,各種結(jié)構(gòu)性要素松散聯(lián)系,但是結(jié)構(gòu)對(duì)結(jié)果基本沒(méi)有什么影響的狀態(tài),有興趣的同學(xué)可以了解一下相關(guān)概念,挺有意思的

所以在下面我們可以簡(jiǎn)單討論一下,它更具體一點(diǎn)的應(yīng)用場(chǎng)景

1. 治理巨石應(yīng)用

image.png

這個(gè)無(wú)疑是提起微前端時(shí)最容易被聯(lián)想到的場(chǎng)景,在實(shí)際的開(kāi)發(fā)生涯中其實(shí)我們經(jīng)常能碰到以下的經(jīng)典場(chǎng)景:

「(1) 在進(jìn)入一個(gè)新團(tuán)隊(duì)的時(shí)候,經(jīng)常有可能接手到一個(gè) 5 年陳的項(xiàng)?,或者我們需要重啟一個(gè)多年未維護(hù)的項(xiàng)目」

這個(gè)項(xiàng)目可能會(huì)有強(qiáng)?混?多種技術(shù)棧的情況,例如我們現(xiàn)在這個(gè)六年陳的pc端就會(huì)有react 和 jq 混合開(kāi)發(fā)的情況,或者是使?的技術(shù)棧落后、較為?眾或?qū)W習(xí)成本過(guò)?。

例如Foundation、angular1.x、Easy Framework之類的玩意,又或者是重構(gòu)不徹底的代碼,經(jīng)歷了了重構(gòu)-爛尾-又重構(gòu)-又爛尾的項(xiàng)目(沒(méi)錯(cuò),說(shuō)的上面那項(xiàng)目)

那這時(shí)候我們把原有功能抽離為單獨(dú)的子應(yīng)用,而新的功能模塊作為新的子應(yīng)用嵌入的辦法來(lái)保證在逐漸重構(gòu)的同時(shí)既要保證中間版本能夠平滑過(guò)渡,同時(shí)持續(xù)交付新的功能?(只是一個(gè)思路,不一定就是用這種方式)

「(2) 保證當(dāng)前技術(shù)?案在 3-5 年的業(yè)務(wù)迭代后還保有?命?,不會(huì)變成?個(gè)遺產(chǎn)項(xiàng)?」

「(3) 避免代碼庫(kù)不斷膨脹?帶來(lái)的各種問(wèn)題」

「例如」

  1. 因?yàn)閱误w應(yīng)用的不斷膨大導(dǎo)致的理解和修改成本的不斷上升

  2. 從代碼的提交到實(shí)際部署的周期越來(lái)越?,并且很容易出問(wèn)題,例如我們的H5項(xiàng)目有接近一百五十個(gè)打包入口,在每一個(gè)版本的迭代都需要重新全量打包部署,之前在有集團(tuán)內(nèi)項(xiàng)目打包時(shí)間統(tǒng)計(jì)的時(shí)候也名列打包最長(zhǎng)時(shí)間的前三

  3. 難以交付可靠的單體應(yīng)?, 系統(tǒng)龐?復(fù)雜 -> ?法進(jìn)?全??徹底的測(cè)試 -> 代碼中的錯(cuò)誤會(huì)進(jìn)??產(chǎn)環(huán)境 -> 因?yàn)槌绦蛑械拇a都在同?進(jìn)程中運(yùn)?,應(yīng)?缺乏故障隔離 -> 可能出現(xiàn)?些例如:內(nèi)存泄漏 之類的問(wèn)題導(dǎo)致?戶運(yùn)?過(guò)久后崩潰之類的問(wèn)題

    例如node寫(xiě)的中間件的實(shí)例則有可能崩潰導(dǎo)致?半夜因?yàn)?產(chǎn)環(huán)境的問(wèn)題爬起來(lái)查bug

  4. 需要?期依賴某個(gè)可能已經(jīng)過(guò)時(shí)的技術(shù)棧,并且框架難以升級(jí)新的版

等等。。。。。。。。

2.快速驗(yàn)證

其實(shí)我們碰到

「(1)產(chǎn)品想要去上線一個(gè)試驗(yàn)性的活動(dòng)或者功能的場(chǎng)景非常多」

這類功能在用戶反饋不好的時(shí)候或許在很短的時(shí)間內(nèi)就會(huì)被下線,而這個(gè)活動(dòng)或功能的上線和下線每次都要經(jīng)歷一個(gè)成本較高的過(guò)程。

「(2)同時(shí)驗(yàn)證同一個(gè)功能的不同實(shí)現(xiàn)」

而在這方面其實(shí)就像酷狗曾經(jīng)有一個(gè)組件即服務(wù)的微前端實(shí)現(xiàn),每個(gè)直播間的組件靈活控制上下線,對(duì)于用戶反饋的時(shí)機(jī)把握賊靈活

3. 應(yīng)?功能?由組合拆分及定制化開(kāi)發(fā)

例如我們的目前的業(yè)務(wù)、實(shí)際上經(jīng)常有可能會(huì)面臨對(duì)不同學(xué)校有不同的特定的定制化需求或者功能組合,那實(shí)際上我們可以對(duì)每個(gè)單獨(dú)的功能作為一個(gè)單獨(dú)的子系統(tǒng)開(kāi)發(fā)、?系統(tǒng)間的耦合只需要規(guī)定好相應(yīng)的通訊?式和內(nèi)容,不需要關(guān)注對(duì)?的實(shí)現(xiàn),在需要的時(shí)候自由組合即可。

4. 可同時(shí)灰度多條產(chǎn)品功能等等

因?yàn)樗缮Ⅰ詈系南到y(tǒng)結(jié)構(gòu)可應(yīng)用的場(chǎng)景太多了,所以就不一一列舉了

如果我們需要微前端的能力我們需要關(guān)注什么

如果我們需要一個(gè)微前端方案,我們需要關(guān)注什么?

通過(guò)第一部分的簡(jiǎn)單描述,我們大概了解了什么是微前端,那么,在我們假設(shè)對(duì)目前流行的微前端的技術(shù)方案或者架構(gòu)都不清楚的情況下,倘若我們需要去實(shí)踐這么一個(gè)微前端的架構(gòu),我們需要關(guān)注哪些切實(shí)的問(wèn)題?

組件之間的組合最重要的是什么

跟我們?cè)诘谝徊糠炙岬降囊粯?,微前端的?shí)現(xiàn)本質(zhì)上也是一種組合的思想,子應(yīng)用間的組合其實(shí)和功能中組件的組合有一定程度上的異曲同工之妙,那么我們組件之間的組合最重要的是什么?

沒(méi)錯(cuò)!就是 「通訊和狀態(tài)管理」

就好像組件一樣,子應(yīng)用總會(huì)有各樣的組合方式,那么父子應(yīng)用間的通訊、兄弟應(yīng)用之間的通訊、甚至爺孫應(yīng)用之間的通訊就成了一個(gè)需要關(guān)注的問(wèn)題。

既然是由不同的子應(yīng)用之間組合而成,無(wú)法避免狀態(tài)管理的問(wèn)題,無(wú)論是全局下的狀態(tài)管理、幾個(gè)子應(yīng)用間的局部狀態(tài)管理,還是單個(gè)子應(yīng)用間的狀態(tài)管理,以及狀態(tài)的上傳和下發(fā),都將是我們需要去考慮的問(wèn)題

我們簡(jiǎn)單舉一個(gè)例子,對(duì)于數(shù)據(jù)和狀態(tài)的管理、在你想采用微前端架構(gòu)的時(shí)候,不管是用 qiankun,還是用 iframe,用不同框架只是添頭,沒(méi)什么作用(因?yàn)榫幊陶Z(yǔ)言或者目標(biāo)語(yǔ)言沒(méi)有改變),很多時(shí)候你遇到的問(wèn)題可以轉(zhuǎn)化成這樣

就容易變成了redux 動(dòng)機(jī)文檔中的曼妥思糖 如果一個(gè) model 的變化會(huì)引起另一個(gè) model 變化,那么當(dāng) view 變化時(shí),就可能引起對(duì)應(yīng) model 以及另一個(gè) model 的變化,依次地,可能會(huì)引起另一個(gè) view 的變化。直至你搞不清楚到底發(fā)生了什么

單獨(dú)看這個(gè)問(wèn)題,你會(huì)很想當(dāng)然地說(shuō)出狀態(tài)提升的解法

這種解法沒(méi)有問(wèn)題,但是,當(dāng)你這么解決問(wèn)題,一旦應(yīng)用范圍內(nèi)廣泛存在數(shù)據(jù)耦合,你怎么辦?

這時(shí)候必然將所有數(shù)據(jù)放置于全局單例,雖然犧牲了多例和初始化控制以及析構(gòu)控制能力,但是確實(shí)能大大減少開(kāi)發(fā)負(fù)擔(dān),這種解法就是 redux 或者說(shuō)狀態(tài)管理的本質(zhì)

但是!

這種解法在微前端中是完全無(wú)法使用的

因?yàn)槲⑶岸思軜?gòu),在應(yīng)用這一層級(jí)之上,目標(biāo)是「分開(kāi)開(kāi)發(fā),分開(kāi)構(gòu)建,分開(kāi)部署」

「你能將單一數(shù)據(jù)原則應(yīng)用于此么?」

答案是不能的,每個(gè)應(yīng)用有自己的 store,最終還是會(huì)回到第一個(gè)例子的問(wèn)題上去

所以,我們要正視怎么解決這樣的問(wèn)題,這才是微前端之所以微,松散耦合之所以松散的本質(zhì)

「其實(shí)這個(gè)本質(zhì)上是兩個(gè)問(wèn)題」

1、子會(huì)響應(yīng)父的狀態(tài)變化,父會(huì)在子初始化之后初始化,子會(huì)在父變更后變更,導(dǎo)致子狀態(tài)必須在子組件內(nèi)部
2、react 以及狀態(tài)管理,只有子向父 dispatch 事件的能力,父無(wú)法向子 dispatch 事件

即使是換到父子應(yīng)用層面上的理解也依舊如此

而且我們需要知道一件事,在第一部分中其實(shí)我們有提過(guò)微前端的應(yīng)用間的關(guān)系其實(shí)也是一種組合關(guān)系

在組合關(guān)系中,「被組合對(duì)象是絕對(duì)會(huì)耦合于源對(duì)象的」

所以我們?cè)跔顟B(tài)管理的層面上將組合的方式轉(zhuǎn)為更松散的邏輯關(guān)系,例如:聚合?

而這種轉(zhuǎn)換其實(shí)一般來(lái)說(shuō)我們都是通過(guò)「依賴注入」的方式去實(shí)現(xiàn)的

但是這種情況下,子組件依然無(wú)法擁有自己的狀態(tài),因?yàn)檫@依然是單一數(shù)據(jù)處理方式,只不過(guò)沒(méi)有隔一層 props

并且這時(shí)候還是沒(méi)能解決 只有子向父 dispatch 事件的能力,父無(wú)法向子 dispatch 事件的問(wèn)題

「那我們需要怎么解決這個(gè)問(wèn)題?」

其實(shí)這個(gè)問(wèn)題很好解決,實(shí)現(xiàn)一個(gè)「發(fā)布訂閱模型」就可以了,所以這也是為什么qiankun之類的微前端方案的應(yīng)用間通訊方式是使用發(fā)布訂閱的方式進(jìn)行

這樣處理,parent 和 Child 就可以彼此通過(guò)事件傳遞消息,且獨(dú)立變化,讓整個(gè)結(jié)構(gòu)松散耦合起來(lái)

工作空間的獨(dú)立

js沙箱相關(guān):https://zhuanlan.zhihu.com/p/527437146

「js 沙箱」

因?yàn)槲覀兠恳粋€(gè)子應(yīng)用都是一個(gè)單獨(dú)的項(xiàng)目和應(yīng)用,在同一個(gè)頁(yè)面中出現(xiàn)多個(gè)子應(yīng)用是很常見(jiàn)的場(chǎng)景

那么出于安全的考慮,例如全局變量污染、多版本庫(kù)、以及上面提到的故障隔離,還有各種復(fù)雜的場(chǎng)景下的執(zhí)行問(wèn)題

我們理所當(dāng)然是需要對(duì)每個(gè)子應(yīng)用間的 js 的工作空間進(jìn)行隔離,使每個(gè)子應(yīng)用內(nèi)的執(zhí)行自洽,只關(guān)注輸出和輸入

那么js沙箱的實(shí)現(xiàn)也就無(wú)疑成為了微前端方案中急需關(guān)注的一點(diǎn)。

「css 沙箱」

既然關(guān)注了js的隔離,那css的隔離自然也逃不掉

雖然是微前端的結(jié)構(gòu),但是本質(zhì)上同一個(gè)頁(yè)面中每個(gè)子應(yīng)用的掛載依舊在同一個(gè)dom樹(shù)上

那么我們自然不希望子應(yīng)用間的樣式會(huì)出現(xiàn)互相干擾的情況,并且在子應(yīng)用切換時(shí)可以自行裝載和卸載。


說(shuō)句實(shí)話,單純的iframe實(shí)現(xiàn)微前端的方案雖然有很多問(wèn)題,但是在js和css的隔離的上無(wú)疑是成本最低且較好的實(shí)現(xiàn)

預(yù)加載

因?yàn)樵谖⑶岸说姆桨钢校總€(gè)子應(yīng)用都是獨(dú)立的,所以如果不做任何處理的話在一個(gè)頁(yè)面存在多個(gè)子應(yīng)用的情況下,每個(gè)子應(yīng)用的加載都是獨(dú)立的,在這種情況下我們就很容易讓用戶體驗(yàn)到不同功能之間陸續(xù)從白屏到加載完成的割裂過(guò)程。這個(gè)無(wú)疑是致命的缺陷。

并且在實(shí)際用戶使用中,瀏覽器大部分時(shí)間是處在空閑的,我們要怎么利用這樣的空閑時(shí)間,去加載其他子應(yīng)用的JS,用來(lái)優(yōu)化用戶體驗(yàn)?

公共依賴的處理問(wèn)題

這個(gè)問(wèn)題屬于我們軟件開(kāi)發(fā)中項(xiàng)目管理的部分,子項(xiàng)目多了之后,公共依賴如果處理不好,不但造成我們開(kāi)發(fā)工時(shí)的浪費(fèi),有各種重復(fù)工作,同時(shí)BUG的風(fēng)險(xiǎn)也會(huì)隨著復(fù)制的代碼過(guò)多,成指數(shù)增長(zhǎng),更不要說(shuō)日后的長(zhǎng)期維護(hù)

  1. 可以企業(yè)內(nèi)部搭建npm服務(wù)器發(fā)布到,但問(wèn)題也很明顯,例如npm包更新,需要手動(dòng)更新、任何改動(dòng)都需要子應(yīng)用重新部署上線,用的子應(yīng)用多了,這更新氣來(lái)就麻煩死了
  2. webpack external 外部擴(kuò)展,可以將通用的一些包排除在bundle之外,然后使用直接訪問(wèn)公共包JS的方式(一般采用CDN),直接在index.html中引入,但是這樣的話,公共依賴必須采用UMD格式,那用的時(shí)候也要遵循,就有點(diǎn)麻煩
  3. webpack federation 模塊聯(lián)邦,可以使一個(gè)JS應(yīng)用,動(dòng)態(tài)加載其他JS應(yīng)用的代碼,并且我們可以把一些公共依賴,都抽離到主包。在子包中,只輸出業(yè)務(wù)代碼即可,模塊聯(lián)邦提供對(duì)應(yīng)的配置功能,并且由于是從網(wǎng)絡(luò)獲取,可以做做熱更新。但是老項(xiàng)目要升級(jí)webpack,子項(xiàng)目和主項(xiàng)目都需要進(jìn)行webpack federation的配置工作,才能用,這個(gè)也是要開(kāi)發(fā)工作量,太麻煩
  4. monorepo 多包管理,目前主流使用lerna框架進(jìn)行多包管理,把單獨(dú)的包抽離到獨(dú)立的子項(xiàng)目中維護(hù),后期如果項(xiàng)目穩(wěn)定,可以把依賴抽離到webpack federation 做熱更新,但是也好麻煩

路由的管理

這個(gè)為啥要關(guān)注不用我多說(shuō)了吧,這位靚仔,你也不想你的路由不知道咋跳對(duì)吧。目前我知道的有兩個(gè)方案

路由劫持

方案原理大致是監(jiān)聽(tīng)了popstats或者h(yuǎn)ashchange事件,并劫持了瀏覽器history下的pushState和replaceState后

主應(yīng)用控制路由

實(shí)現(xiàn)思路是主應(yīng)用使用現(xiàn)有的路由庫(kù),例如vue router或者react router,子應(yīng)用使用webpack federation,將現(xiàn)有的頁(yè)面發(fā)布成獨(dú)立的服務(wù),在主應(yīng)用中重新配置路由,使用webpack提供的import()函數(shù),動(dòng)態(tài)加載子用的模塊

但是上面其實(shí)沒(méi)有考慮到子應(yīng)用自身的路由跳轉(zhuǎn)、子應(yīng)用a跳轉(zhuǎn)到子應(yīng)用b,或者子應(yīng)用a要打開(kāi)子應(yīng)用b的指定路由的跳轉(zhuǎn)之類的場(chǎng)景

子應(yīng)用的資源加載方式

是html entry還是js entry。別問(wèn),問(wèn)就是快,一個(gè)加載的是按原來(lái)方式打包出來(lái)的一個(gè)html文件,一個(gè)是加載子應(yīng)用打出來(lái)的整個(gè)js文件。

而且將整個(gè)微應(yīng)用打包成一個(gè) JS 文件常見(jiàn)的打包優(yōu)化基本上都沒(méi)了,按需加載、首屏資源加載優(yōu)化、css 獨(dú)立打包等想都別想

支不支持應(yīng)用?;?/span>

事關(guān)keep-alive之類的需求在微前端的架構(gòu)中怎么做,這位靚仔你也不想切個(gè)子應(yīng)用,之前的狀態(tài)就全沒(méi)了吧

子應(yīng)用之間的互相嵌套

支不支持子應(yīng)用之間的互相嵌套,子應(yīng)用件互相嵌套情況下的通訊和狀態(tài)管理

是否有生命周期的設(shè)計(jì)

小結(jié)

當(dāng)然,以上這些實(shí)際上只是具體在落地微前端方案的時(shí)候需要關(guān)注的具體問(wèn)題 但是從更高一點(diǎn)的層面上來(lái)看

其實(shí)我個(gè)人覺(jué)得主要其實(shí)要關(guān)注的有「三個(gè)緯度和兩個(gè)問(wèn)題」

三個(gè)維度:代碼的管理、工程的獨(dú)立性、優(yōu)雅地集成

兩個(gè)問(wèn)題:什么場(chǎng)景適用、怎么更好地拓展


其實(shí)以上的問(wèn)題都是圍繞著解決 安全性和域完整性這兩塊問(wèn)題

包括了請(qǐng)求安全、數(shù)據(jù)安全、配置安全、界面完整、交互完整、元素完整等,但是這里我們就不細(xì)細(xì)討論了

畢竟這只是一個(gè)四十分鐘不到的分享


「所以我們最后的小結(jié)是」

在我們需要一個(gè)微前端方案時(shí),我們需要考慮的問(wèn)題有如下幾點(diǎn):

  • 應(yīng)用間的通訊
  • 應(yīng)用間的狀態(tài)管理
  • js 沙箱
  • css 隔離
  • 預(yù)加載
  • 公共依賴的處理
  • 路由狀態(tài)管理
  • 是否支持html entry
  • 應(yīng)用支不支持保活
  • 子應(yīng)用之間的互相嵌套
  • 是否有生命周期的設(shè)計(jì)

目前都有什么流行的技術(shù)方案,它們解決了什么問(wèn)題

通過(guò)第二部分的思考,我們大概了解了,假設(shè)我們?cè)趯?duì)現(xiàn)有的微前端解決方案都不清楚的情況下

我們需要去落地一個(gè)微前端的架構(gòu),我們將會(huì)需要關(guān)注哪方面,以及需要應(yīng)對(duì)哪些可能會(huì)出現(xiàn)的問(wèn)題

那么在這一部分,我們將會(huì)去對(duì)比一下當(dāng)前除了 wujie 以外的較為流行的微前端方案

簡(jiǎn)單探討一下他們的實(shí)現(xiàn)方案的優(yōu)劣,以及未來(lái)可能會(huì)存在的發(fā)展方向

(因?yàn)闀r(shí)間有限,并且不是此次分享重點(diǎn),所以不會(huì)過(guò)于詳細(xì))

nginx轉(zhuǎn)發(fā)

根據(jù)我們第一部分對(duì)微前端的定義來(lái)說(shuō),nginx轉(zhuǎn)發(fā)來(lái)分割和組合應(yīng)用其實(shí)也能算是一種微前端的實(shí)現(xiàn)方案 但是根據(jù)我們第二部分的思考來(lái)說(shuō),顯然大部分問(wèn)題的處理都是做不到的,所以這里就貼個(gè)圖出來(lái)湊個(gè)數(shù)算了

純iframe的實(shí)現(xiàn)方案

根據(jù)我們第二部分的思考,其實(shí)iframe的方案在一些地方有著天然的優(yōu)勢(shì),例如 iframe 的隔離完美,無(wú)論是 js、css、dom 都完全隔離開(kāi)來(lái),子應(yīng)用間的嵌套毫無(wú)壓力,隨便套,并且使用簡(jiǎn)單,沒(méi)有任何心智負(fù)擔(dān),天然支持html entry

但是「缺點(diǎn)」也非常明顯:

  1. ?論是使?postMessage還是通過(guò) iframeEl.contentWindow 去獲取 iFrame 元素的 Window 對(duì)象,?或者是直接???調(diào)?????法:FrameName.window.childMethod();???調(diào)?????法:parent.window.parentMethod();來(lái)通訊都并不是太過(guò)友好的事情,需要設(shè)計(jì)?套規(guī)范的通訊標(biāo)準(zhǔn),實(shí)在過(guò)于麻煩,并且狀態(tài)管理、公共依賴的處理等都能通過(guò)其他的方式封裝實(shí)現(xiàn)
  2. 路由狀態(tài)丟失,刷新一下,iframe 的 url 狀態(tài)就丟失了
  3. dom 割裂嚴(yán)重,彈窗只能在 iframe 內(nèi)部展示,無(wú)法覆蓋全局,并且事件傳遞上存在者很大的問(wèn)題,例如拖拽
  4. 白屏?xí)r間太長(zhǎng),對(duì)于SPA 應(yīng)用應(yīng)用來(lái)說(shuō)無(wú)法接受
  5. 難以做預(yù)加載
  6. 應(yīng)用完全沒(méi)辦法?;?,每次都是新的加載
  7. iframe和主??共享連接池,?瀏覽器對(duì)相同域的連接有限制,所以會(huì)影響??的并?加載,出現(xiàn)iframe中的資源占?了可?連接?阻塞了主??的資源加載

所以這很難說(shuō)得上是一個(gè)比較好的實(shí)現(xiàn)方案,但是后續(xù)我們會(huì)講到wujie是怎么解決iframe的缺點(diǎn),打造一個(gè)接近完美的iframe方案的。

基座模式的代表 qiankun.js (基于single-spa)

qiankun是一個(gè)很經(jīng)典的基座模式下的微服務(wù)方案,但是在使用成本上來(lái)說(shuō)是有點(diǎn)大的,它對(duì)代碼的侵入型很強(qiáng),如果要改造的話,從 webpack、代碼、路由等等都要做一系列的適配

能力 現(xiàn)狀
通訊與狀態(tài)管理 1、初始化狀態(tài)通過(guò)props傳入子組件
2、qiankun通過(guò)initGlobalState, onGlobalStateChange, setGlobalState實(shí)現(xiàn)主應(yīng)?的全局狀態(tài)管理,然后默認(rèn)會(huì)通過(guò)props將通信?法傳遞給?應(yīng)?,但是本質(zhì)上還是通過(guò)發(fā)布 - 訂閱的方式來(lái)進(jìn)行通訊
3、主子應(yīng)用localStrage、cookie可共享 所以在通訊上并不是很完美
js和css隔離 提供js和css隔離,但是在js的沙箱方面依然有不少坑有問(wèn)題,近一年的很多changelog都是在修js沙箱的問(wèn)題
預(yù)加載 做了靜態(tài)資源的預(yù)加載能力
公共依賴的處理 文檔內(nèi)寫(xiě)明不推薦,但是硬要的話可以在微應(yīng)用中將公共依賴配置成 external,然后在主應(yīng)用中導(dǎo)入這些公共依賴的
路由管理 1、每個(gè)子應(yīng)用中注冊(cè),然后由主應(yīng)用進(jìn)行管理,主應(yīng)用的路由實(shí)例通過(guò) props 傳給微應(yīng)用,微應(yīng)用這個(gè)路由實(shí)例跳轉(zhuǎn)
2、注冊(cè)微應(yīng)用的基礎(chǔ)配置信息。當(dāng)瀏覽器 url 發(fā)生變化時(shí),會(huì)自動(dòng)檢查每一個(gè)微應(yīng)用注冊(cè)的 activeRule 規(guī)則,符合規(guī)則的應(yīng)用將會(huì)被自動(dòng)激活
3、頁(yè)面上不能同時(shí)顯示多個(gè)依賴于路由的微應(yīng)用,因?yàn)闉g覽器只有一個(gè) url,如果有多個(gè)依賴路由的微應(yīng)用同時(shí)被激活,那么必定會(huì)導(dǎo)致其中一個(gè) 404。
「(因?yàn)榛诼酚善ヅ洌詿o(wú)法同時(shí)激活多個(gè)子應(yīng)用)」
html entry 支持
應(yīng)用?;?/td> 無(wú)法支持子應(yīng)用保活
應(yīng)用嵌套 支持
生命周期 支持


micro-app

能力 現(xiàn)狀
通訊與狀態(tài)管理 基于發(fā)布訂閱+CustomEvent
js和css隔離 js: 使用Proxy攔截了用戶全局操作的行為。
css: 利用標(biāo)簽的name屬性為每個(gè)樣式添加前綴,將子應(yīng)用的樣式影響禁錮在當(dāng)前標(biāo)簽區(qū)域,但是依舊沒(méi)辦法必定隔絕
預(yù)加載 在瀏覽器空閑時(shí)間,依照開(kāi)發(fā)者傳入的順序,依次加載每個(gè)應(yīng)用的靜態(tài)資源,以確保不會(huì)影響基座應(yīng)用的性能
公共依賴的處理 沒(méi)有解決基座應(yīng)用和子應(yīng)用共用依賴的特性,issues中回答了在計(jì)劃中,但是還沒(méi)想好怎么做
路由管理 每個(gè)應(yīng)用的路由實(shí)例都是不同的,應(yīng)用的路由實(shí)例只能控制自身,無(wú)法影響其它應(yīng)用,包括基座應(yīng)用無(wú)法通過(guò)控制自身路由影響到子應(yīng),路由跳轉(zhuǎn)只有三種方式:window.history,通過(guò)history.pushState或history.replaceState進(jìn)行跳轉(zhuǎn)、通過(guò)數(shù)據(jù)通信控制跳轉(zhuǎn)(基座控制子應(yīng)用跳轉(zhuǎn),子應(yīng)用監(jiān)聽(tīng)基座數(shù)據(jù)變化而跳轉(zhuǎn))、傳遞路由實(shí)例方法,把實(shí)例傳到子應(yīng)用里去跳轉(zhuǎn)(子應(yīng)用控制基座跳轉(zhuǎn))
url屬性和子應(yīng)用路由沒(méi)有關(guān)系,只是用來(lái)加載html資源
html entry 支持, 實(shí)際上是以類WebComponent + HTML Entry實(shí)現(xiàn)微前端的組件化,但是webcomponents沒(méi)有做降級(jí)處理
應(yīng)用?;?/td> 支持,< micro-app name='xx' url='xx' keep-alive>
應(yīng)用嵌套 支持
生命周期 支持


Module Federation

image.png
能力 現(xiàn)狀
通訊與狀態(tài)管理 別想了,互相之間都是獨(dú)立模塊,并且去中心了,你還想咋共享?
js和css隔離 js: 沒(méi)有沙箱,全憑開(kāi)發(fā)者自覺(jué)不瞎搞
css: 別想了,只能通過(guò) postcss-selector-namespace 添加前綴或者別名之類的方式來(lái)處理 簡(jiǎn)單來(lái)說(shuō),沒(méi)有有用的 css 沙箱和 js 沙箱,一切需求靠用戶自覺(jué)
預(yù)加載 沒(méi)有利用瀏覽器空閑時(shí)間去做子應(yīng)用加載的處理
公共依賴的處理 天然支持
路由管理 微應(yīng)用的路由是有發(fā)生沖突的可能性的,為了實(shí)現(xiàn)獨(dú)立部署能切換頁(yè)面,各微應(yīng)用都有自己的路由,要解決就只能微應(yīng)用單獨(dú)部署時(shí),使用 web 路由,集成到 container 時(shí),使用內(nèi)存路由,web 路由由 container 接管,瀏覽器地址欄變化時(shí),告 訴集成進(jìn)來(lái)的微應(yīng)用,然后微應(yīng)用再跳轉(zhuǎn)到相應(yīng)的頁(yè)面。
html entry 沒(méi)有
應(yīng)用?;?/td> 沒(méi)有,別想
應(yīng)用嵌套 想怎么套就怎么套
生命周期 別想


wujie 是怎么解決以上問(wèn)題的?

通過(guò)第二和第三部分的思考,我們大概了解了落地一個(gè)微前端的架構(gòu)可能會(huì)需要面臨的挑戰(zhàn),以及當(dāng)前流行的技術(shù)方案對(duì)于面臨的問(wèn)題提出了哪些思想或解決方案 所以第四部分我們就簡(jiǎn)單講講第二部分我們所考慮到的問(wèn)題在 wujie 的方案中是怎么處理的

其實(shí)我們可以直接看 wujie 的github倉(cāng)庫(kù) 可以發(fā)現(xiàn)它的實(shí)現(xiàn)實(shí)際上非常簡(jiǎn)單,加起來(lái)不過(guò)3000行代碼,所以打消了我想挑一塊源碼功能的實(shí)現(xiàn)來(lái)講用于消磨時(shí)間的打算(滑稽.jpg)


wujie是怎么解決純 iframe 微前端方案所遇到問(wèn)題的?

wujie 是一個(gè)iframe + webComponent 的解決方案 既然提到了iframe,那么我們肯定要關(guān)注前面提到的iframe存在著通訊、路由、dom割裂嚴(yán)重、白屏?xí)r間長(zhǎng)、難做預(yù)加載、應(yīng)用無(wú)法?;睢g覽器對(duì)相同域的連接有限制,會(huì)影響??的并?加載等問(wèn)題在wujie中是否被解決

最重要的通訊問(wèn)題

在wujie中提供了三種通訊方式:
(1 「props 通信」,主應(yīng)用可以通過(guò)props注入數(shù)據(jù)和方法
(2 「window 通信」,由于在設(shè)計(jì)上子應(yīng)用運(yùn)行的iframe的src和主應(yīng)用是同域的,所以相互可以直接通信,這個(gè)我們?cè)谙乱徊街屑?xì)述
(3 「eventBus 通信」 其中最有趣的就是這一點(diǎn),wujie 提供了一套去中心化的通訊方式


其中的 eventBus 的功能實(shí)現(xiàn)非常簡(jiǎn)單簡(jiǎn)潔,整塊功能的實(shí)現(xiàn)不過(guò) 105 行,除了全部事件的存儲(chǔ)的map會(huì)根據(jù)是否存在wujie進(jìn)行判斷和兼容之外,本質(zhì)上就是一個(gè)非常常規(guī)的發(fā)布訂閱的實(shí)現(xiàn),跟咱們今年校招的筆試題其實(shí)是一樣的,撐死是個(gè)加強(qiáng)版

iframe 問(wèn)題解決:dom 割裂嚴(yán)重、路由狀態(tài)丟失、通信非常困難的問(wèn)題

路由狀態(tài)的問(wèn)題

假如我們?cè)趹?yīng)用a中想要加載應(yīng)用b,那么我們可以怎么做才能避免上述問(wèn)題?

在應(yīng)用 A 中構(gòu)造一個(gè)shadowRoot 和iframe,然后將應(yīng)用 B 的html寫(xiě)入shadowRoot中,js運(yùn)行在iframe中,因?yàn)閕frame的js隔離真的很完美。

這時(shí)候我們注意 iframe 的 url,iframe保持和主應(yīng)用同域但是保留子應(yīng)用的路徑信息,這樣子應(yīng)用的js可以運(yùn)行在iframe的location和history中保持路由正確。

「這樣就可以解決了路由狀態(tài)的問(wèn)題,并且解決可以使用window來(lái)通訊」

Shadow DOM API 的 ShadowRoot 接口是一個(gè) DOM 子樹(shù)的根節(jié)點(diǎn),它與文檔的主 DOM 樹(shù)分開(kāi)渲染。

「源碼」


dom割裂的問(wèn)題

那在iframe中dom割裂的問(wèn)題要怎么處理?

在iframe中攔截document對(duì)象,統(tǒng)一將dom指向shadowRoot,此時(shí)比如新建元素、彈窗或者冒泡組件就可以正常約束在shadowRoot內(nèi)部。

我們可以從源碼中看出,在非降級(jí)的情況下, wujie對(duì)iframe的 document進(jìn)行了代理,從而解決了解決了 dom 割裂嚴(yán)重的問(wèn)題


首次白屏的問(wèn)題

那這時(shí)候?qū)嶋H就只剩下了白屏、預(yù)加載和應(yīng)用?;畹膯?wèn)題

白屏實(shí)際上可以分為兩個(gè)場(chǎng)景,一是「首次加載白屏」,二是「切換應(yīng)用時(shí)白屏」

「首次白屏的問(wèn)題」,wujie實(shí)例可以提前實(shí)例化,包括shadowRoot、iframe的創(chuàng)建、js的執(zhí)行,這樣極大的加快子應(yīng)用第一次打開(kāi)的時(shí)間

「切換白屏的問(wèn)題」,一旦wujie實(shí)例可以緩存下來(lái),子應(yīng)用的切換成本變的極低,如果采用?;钅J剑敲聪喈?dāng)于shadowRoot的插拔

所以以上的整套機(jī)制在wujie中的實(shí)現(xiàn)對(duì)應(yīng)的流程圖如下圖一樣


預(yù)加載的處理

對(duì)于預(yù)加載的處理也非常簡(jiǎn)單,在子應(yīng)用使用fiber模式執(zhí)行的情況下,使用 requestIdleCallback ,在瀏覽器空閑時(shí)間去加載資源

js和css隔離

這個(gè)不用多言,懂的都懂

公共依賴的處理

文檔內(nèi)寫(xiě)明不推薦,但是硬要的話可以在微應(yīng)用中將公共依賴配置成 external,然后在主應(yīng)用中導(dǎo)入這些公共依賴的

路由管理

跟其他方案不同的是,wujie的路由管理有兩個(gè)比較有意思的點(diǎn)

「1、路由同步」

會(huì)將子應(yīng)用路徑的path+query+hash通過(guò)window.encodeURIComponent編碼后掛載在主應(yīng)用url的查詢參數(shù)上,其中key值為子應(yīng)用的 name。

開(kāi)啟路由同步后,「刷新瀏覽器或者將url分享出去子應(yīng)用的路由狀態(tài)都不會(huì)丟失」,當(dāng)一個(gè)頁(yè)面存在多個(gè)子應(yīng)用時(shí)無(wú)界支持所有子應(yīng)用路由同步,瀏覽器刷新、前進(jìn)、后退子應(yīng)用路由狀態(tài)也都不會(huì)丟失,并且「提供短路徑的能力」,當(dāng)子應(yīng)用的url過(guò)長(zhǎng)時(shí),可以通過(guò)配置 prefix 來(lái)縮短子應(yīng)用同步到主應(yīng)用的路徑,無(wú)界在選取短路徑的時(shí)候,按照匹配最長(zhǎng)路徑原則選取短路徑。

「2、路由跳轉(zhuǎn)」

無(wú)界支持子應(yīng)用間的路由的跳轉(zhuǎn),例如子應(yīng)用a可以跳轉(zhuǎn)子應(yīng)用b,也可以從子應(yīng)用a跳轉(zhuǎn)到子應(yīng)用b的指定路由中,這點(diǎn)在其他方案中暫時(shí)還沒(méi)看到有。

并且如果子應(yīng)用a要跳轉(zhuǎn)到子應(yīng)用b是?;顟?yīng)用,并且已經(jīng)進(jìn)行過(guò)初始化了,那也有對(duì)應(yīng)的方案使子應(yīng)用b的狀態(tài)不會(huì)因?yàn)樘D(zhuǎn)而丟失


降級(jí)處理

wujie 和 micro-app 的發(fā)布時(shí)間其實(shí)相距不遠(yuǎn),并且兩者都用到了webComponent的能力,但是wujie 對(duì)于webComponent 特性不支持的情況做了無(wú)感知的降級(jí)方案,但是micro-app沒(méi)有

結(jié)束

以上內(nèi)容純屬個(gè)人觀點(diǎn),僅供討論,不保證內(nèi)容正確性

點(diǎn)擊關(guān)注公眾號(hào),“技術(shù)干貨” 及時(shí)達(dá)!

瀏覽 173
1點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
1點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 精品欧美一区二区三区| 欧美日韩亚洲另类| 国产狂喷水潮免费网站www| 99在线观看免费视频| 亚洲国产毛片| 一区二区三区无码区| 天天干天天射天天| 91逼逼| 婷婷国产亚洲精品网站| 欧美丰满老熟妇XXXXX性| 天堂网亚洲| 狠狠色av| 日韩视频成人| 无码迷穴| www.俺去也| 亚洲视频免费完整版在线播放| 欧美精品福利| 欧美做受高潮白| 翔田千里53歳在线播放| 大奶一区二区| 日韩无码中字| 欧美黑吊大战白妞| Chinese搡老女人| 国产乱子伦-区二区三区熟睡91 | 9118禁| 国产免费a| 日韩成人无码免费视频| 午夜福利澳| 97欧美日韩| 美女裸体视频网站| 大香蕉最新国产2025| 中文字幕二区| 国产福利在线观看| 欧美在线一级| 日韩AV无码一区二区三区| 天堂色综合| 91亚洲精华国产精华精华液| 免费观看高清无码视频| 丁香色综合人妻| 欧美天堂在线| av无码在线播放| 激情av在线| XXXXⅩHD亚洲人HD| 久久久免费观看视频| 欧美日韩国产91| 人妻少妇精品视频一区二区三区| 无码AV高清| 亚洲无码高清在线| 免费在线观看黄色视频网站| 激情网五月天| 99久久精品国产精品有折扣吗| 蜜臀av一区二区| 青在线视频| 亚洲日韩欧美一厂二区入| 超碰1999| 国产又粗又长又硬又大毛苴茸图片| 亚洲人妻电影一区| 一级黄色视频日逼片| 欧美不卡视频| 1024在线视频| 久久久久久亚洲Av无码精品专口| 蜜芽av在线| 亚洲电影av| 玖玖99视频| 青娱乐91视频| 亚洲无码资源| 一区二区三区四区五区| 午夜天堂在线| 日本无码成人片在线播放| 国产wwwww| 3D动漫精品啪啪一区二区| 亚洲高清人妻| 欧美一级黄色性爱视频| 38D蜜桃臀| 免费黄色在线| 色综合99| 亚洲综合激情| 搡BBBB搡BBB搡五十| 国产二级片| 成人特级毛片| 免费亚洲无码| 亚洲精品娱乐| 人人艹人人干| 91精品国产三级| 伊人综合网站| 影音先锋在线视频| 啊啊啊啊啊网站| 国产夫妻自拍AV| 五月丁香激情综合| 婷婷狠狠操| 天天日天天操天天摸天天干天日射天天插 | 亚洲无线视频| 久久99人妻无码精品一区| 精品乱伦视频| 国产无套内射视频| 婷婷亚洲天堂| 亚洲国产精品成人综合| 91叉叉叉| 天天操夜夜操人人操| 午夜福利1000| 欧美男人的天堂| 日本欧美一级| 国产嫩BBwBBw高潮| 能看的av| 中文字幕无码视频在线观看| 污视频在线看| 国产色情在线观看| 黄网站免费在线观看| 日韩黄色小视频| 国产精品a片| 草久视频| 久在线观看| 欧美成人自拍| 免费高清无码视频| 青青草手机在线视频| 在线播放你懂的| 日韩黄色一级片| 亚洲精品一区二区三区在线观看| 免费v片| 丰满人妻一区二区三区| 中文无码字幕| 久久国产黄色一级片| 2025av中文字幕| 日韩欧美在线中文| 亚洲AV三级片| 伊人精品大香蕉| 国产免费高清无码| 操逼爆奶网站| 在线操逼视频| 黄色免费视频| 五月丁香婷婷基地| 国产三级麻豆| 69国产在线| 天天综合7799| 国产精品久久精品| 免费观看av| 黄色三级视频在线观看| 久热久热| 奶大丰满一乱一视频一区二区三区在 | 亚洲欧美成人片| 国产91丝袜在线播放| 不卡的AV| 九色麻豆| 欧美av| 天天操夜夜操人人操| 臭小子晚上让你爽个够视频| 亚洲天堂2015| 亚洲日韩精品中文字幕在线| 欧美777| 九九久久影院| 中文字幕97| 日韩极品在线观看| 亚洲人免费视频| 国产农村妇女精品一二区| 1024在线| 大鸡吧网| 欧美成人精品一区二区三区| 亚洲欧美性爱| 欧美国产在线观看综合| 欧美在线观看视频一区| 大香蕉大香蕉免费网| 丁香六月色| 黑人AV在线观看| 国产精品无码ThePorn| 国产成人精品免高潮在线人与禽一| 日韩性爱无码| 国产在线激情| 国产午夜91人妻| 成人尤物网站| 亚洲AV毛片成人精品网站| 一插菊花综合视频| 国产伊人影院| 欧美日韩三区| 波多野结衣黄色视频| 天堂网址激情网址| 99精品一区二区三区| 91色色色色| 亚洲男人的天堂视频网在线观看+720P | 青青草黄色视频| 人人色人人操人人干| 久久韩国| 日韩无码小电影| 三级成人网站| 91要爱爱| 青娱乐国产av| 人人鲁人人操| 欧美夜夜爽| 亚洲插逼| 人人操人人看人人摸| 老鸭窝成人| 阿v视频在线观看| 热久久伊人| 中文字幕在线观看网址最新地址| 特级444WWW大胆高清| 国产精品久久AV电影| 国产婷婷五月天| 天堂va欧美ⅴa亚洲va一夜| 人人干97| 西西西444www无码视| 91嫖妓站街按摩店老熟女| 中文字幕观看av| 夜色精品视频| 一级电影视频去去去| 久久免费视屏| 精品偷拍| 日本黄色的视频| 成人A片免费在线观看| wwwAV在线观看| 九色PORNY蝌蚪视频| 免费一级电影| 欧美视频色| 97人妻一区| 五月丁香婷婷色色| www中文字幕| 91精品国产综合久久久久久| 日本亚洲欧洲免费| 青青草视频偷拍| 91叉叉叉| 在线观看国产黄色| 性A免费在线播放| 亚洲第一黄| 欧美日韩中文字幕在线视频| 精品乱子伦一区二区三区免费播成| 另类老妇性bbwbbwbbw| 日本不卡在线观看| 超碰青青青| 无码人妻精品一区| 欧美三级片网址| 亚洲天堂天天| 欧美成人免费观看| 欧美操逼网址| 中文视频在线观看| 天天爽夜夜爽AA片免费| 国产自慰一区| 国产v在线| 色五月丁香婷婷| 91人妻日韩人妻无码专区精品| 99久久精品国产成人一区二区 | 人人操人人操人人操| 就去se超碰| 日本一级婬片A片免费播放一| 国产精品自拍三级| 一二三四在线视频| 丝袜制服中文字幕无码专区| 在线观看中文字幕网站| 好男人WWW一区二区三区| 蜜桃网站| 中文字幕五月久久婷婷| 黄色无码在线观看| 丁香五月社区| 欧美怡春院| 欧美中文网| 亚洲黄色免费电影| 中文字幕福利| 欧美日韩AV| 欧美日韩一区视频| 久久国产成人| 国产18欠欠欠一区二区| 亚洲黄色在线观看视频| 亚洲V国产v欧美v久久久久久| 五十路在线| 国产伦精品一区二区三区色大师 | 婷婷手机在线| www.日逼| 99re在线观看视频| 亚洲va综合va国产va中文 | 免费在线无码视频| 自拍做爱视频| 人人干人人草| 黄色视频在线观看大全| 日韩成人区| 操操操操操| 国产91麻豆视频| 91无码秘蜜桃一区二区三区-百度| 免费黄色A片| 无码不卡一区| 日韩中文字幕在线免费观看| 天堂在线| 国产精品视频久久久久| 中文字幕国产AV| 91人妻无码一区二区三区| 亚洲日本一区二区三区| 成人网站三级片| 日韩无码影院| 蜜桃无码在线| 色婷婷在线观看视频| 99精品视频在线| 欧美性xxxxx| 91久久综合| 亚洲成人中文字幕| 午夜老司机福利一二三区| 日韩色综合| 欧美自拍性爱视频| 日韩一区二区三区无码| 一本色道久久综合亚洲精品久久| 久久久久久成人无码| 好男人av| 中文字幕专区| 日韩黄色激情| 免费av在线播放| 午夜无码鲁丝片午夜精品| 亚洲免费成人电影| 夜夜骑天天操| 色五月视频在线| 操操网站| 久久久久久久| a片免费观看视频| 日韩二区三区| 亚洲视频99| 亚洲无码视频免费| 狠狠躁夜夜躁人人爽人妻| 久久中文字幕人妻| 亚洲综合电影| 51成人精品午夜福利| 人人操人人摸人人爱| 男女操逼免费观看| 五月天久久久久| 综合天堂AV久久久久久久| 亚洲操操操操| av资源网站| 免费国产h| 国产99自拍| www.操逼| 九色欧美| 在线中文字幕视频| 日韩少妇AV| 大香蕉操逼网| 国产成人视频在线播放| 先锋AV资源| 波多野结衣无码AV专区| 日老女人的逼| 操逼视频,黄色大全| 伊人逼逼| 欧美操逼图片| 亚洲欧美日韩免费| 免费三级网| 成人国产精品在线观看| 欧美在线无码| 午夜精品视频| 久色天堂| 91在线精品无码秘入口苹果 | 亚洲小说区图片区都市| 久久毛久久久j| 骚逼无码| av在线资源| 开心激情婷婷| 熟妇无码| 在线亚洲欧洲| 欧美成人视频在线观看| 国产黄片一区二区三区| 青青草无码成人天堂免费| 国产精品人妻无码一区牛牛影视| 亚洲高清av| 婷婷色大师| 免费无码AV| 欧美一级片免费看| 亚洲色在线观看| 精品孕妇一级A片免费看| 豆花视频成人版www满18| 操青青| 中文在线字幕免费观| 亚洲激情黑人| 亚洲AA| 久久久桃色| 福利视频三区| 亚洲免费清高| 谁有毛片网站| 蜜臀AV一区二区三区免费看| 人人色人人操人人干| 欧美国产日韩欧美亚洲国产| 国产操逼大全| 视色视频在线观看| 欧美在线大香蕉| 欧美午夜精品一区二区蜜桃| 玖玖资源站中文字幕| 日韩亚洲中文在线| 成人国产在线无码AV免费| 怡春院熟女精品AV| 午夜精东影业传媒在线观看| 日韩高清一级免费| 欧美日逼网站| 日本少妇中文字幕| 亚洲免费中文字幕| 国精品无码一区二区三区在线秋菊 | 色欲欲www成人网站| 欧美99| 国产精品第二页| 狠狠色AV| 国产凹凸视频| 久草大香蕉在线视频| 亚洲综合国产| 九热视频| 少妇搡BBBB搡BBB搡澳门| 日韩精品一区二区亚洲AV观看| 少妇大战28厘米黑人| 天天日日干| 久久久天堂国产精品女人| 日韩美女免费视频| 影音先锋av在线资源站| 亚洲国产日本| 成人无码欧美大片免费看| 免费的毛片| 一起操在线视频| 亚洲精品福利| 日韩在线观看中文字幕| 色视频在线观看| 青娱乐在线视频精品| 亚洲色色视频| a在线观看视频| 免费观看一级黄片| 成人性爱在线观看| 国产无码三级| 天堂资源地址在线| 日本二区三区| 免费av中文字幕| 亚洲秘无码一区二区三区av| 北条麻妃在线一区二区| 亚洲黄色在线观看| 色色色亚洲| 狼人综合色| 99热偷拍| 九九精品网| 亚洲无码高清在线| 中文字幕福利视频| 中文字幕一区三区人妻视频| 1级毛片| 国产1级a毛a毛1级a毛1级| 在线观看中文字幕| 日韩在线观看视频网站| 亚洲日日干| 高清无码在线观看18| 成人午夜啪免费视频在线观看软件 | 色婷婷AV国产精品| 免费高清无码| 日本特级黄色毛片| 国产三级午夜理伦三级| 国产精品伊人| 精品人妻一区二区三区日产| 丁香五月天av| 91最新国产| 日韩无码观看| 国产欧美岛国| 天天撸天天干天天日| 精品码一区二在线观看| 秋霞丝鲁片一区二区三区手机在绒免 | 日韩中文字幕av在线| 黄色视频一区二区| 男女69视频| 久久久久久久久久久久高清毛片一级| 亚洲精品电影| 天天射天天射| 精品中文字幕视频| 无码中文字幕在线观看| 婷婷五月欧美| 亚洲中文无码在线观看| 一区二区三区在线观看视频| 久久艹久久| 日本视频爱爱| 国产精品性爱| 一区二区三区免费播放| 成人A视频| 日韩成人无码一区二区| 中文字幕精品在线视频| 91视频福利网| 免费无码在线观看| 日韩人妻av| 精品吃奶一区二区三区视频| 一级成人片| 超小超嫩国产合集六部| 亚洲色一| 国产激情久久| 人妻无码高清| 国产在线观看无码| 黄色色情小说| 88AV在线| 无码人妻精品一区二区蜜桃漫画| 蜜臀久久99精品久久一区二区| 免费操逼视频网站| 东京热无码一区| 色噜噜一区二区| 99欧美| 搡中国东北老女人视频| 激情无码在线观看| 成人肏逼视频在线| 激情色播| 免费18禁网站| 人人爱人人干人人操| 神马午夜福利| 看毛片网址| 黄在线免费观看| 亚洲中文字幕在线观看免费| 中文黄片| 西西人体大胆裸体A片| 日韩欧美天堂| 北条麻妃久久视频在线播放| 日韩av免费在线观看| 三级网站网址| 国产婬片一级A片AAA毛片AⅤ| 蜜臀久久99精品久久久久久酒店| 日韩人妻无码一区二区三区| 中文字幕日本| 午夜成人爽| 免费在线观看黄色| 91久久亚洲| 丁香婷婷五月基地| 亚洲三级网站在线观看| 九九九亚洲| 黄色免费在线观看| 久久超碰99| brazzers疯狂作爱| 欧美77777| 影音先锋av资源网站| 骚逼免费观看| 亚洲美女网站在线观看| 俺去俺来也www色视频| 91ThePorn国产在线观看| 日本免费黄色小视频| 六月婷婷在线观看| 黄片网站免费| 99精品丰满人妻无码| 成人午夜| 91巨乳| 久草视频在线播放| 亚洲成人小说| 在线观看中文字幕AV| 嫩BBB槡BBBB槡BBBB二一| 久久久久亚洲AV成人片| 国产做受91| 婷婷精品在线| 激情久久AV一区AV二区AV三区 | 刘玥精品国产一区二区三区| 日韩三级片网址| 欧美伊人| 国产又粗又长的视频| 江苏妇搡BBB搡BBBB| 国产精品无码无套在线照片| 亚洲日韩免费在线观看| 人人干人人爱| 欧美成人版| 玖玖av| 激情无码在线观看| 天天撸天天色| 免费黄色视频在线观看| 天天草天天射| 91老熟女视频| 吹潮喷水高潮HD| 蝌蚪窝在线视频观看| 欧美日本激情| 欧美日韩卡一卡二在线播放视频| 国产A片免费观看| 人人操国产| 少妇人妻一区二区三区| 六月婷婷在线观看| 国产精品美女| 久草视频免费| 日批免费视频| 丁香花五月激情| 亚洲婷婷在线观看| 色欲成人AV| 牛牛AV| 成人毛片在线观看| 日韩激情片| 日本成人毛片| 17c白丝喷水自慰| 大香蕉啪啪啪啪| 在线免费人成视频| 欧美成人网站在线观看| 亚洲丁香五月| 老湿机福利视频| 成人免费网站黄| 成人激情四射网| 自拍偷拍福利视频网站| 成人区123| 青青草手机在线视频| 超碰人人草| AV无码在线免费观看| 九九韩剧网最新电视剧免费观看| 97免费视频在线观看| 亚欧在线视频| 免费岛国av大片| 欧美久久久| 日皮视频免费看| 亚洲无码高清视频在线| 日韩无码精品一区二区三区| 国产亚洲无码激情| 91国产精品在线视频| 久久精品国产亚洲AV麻豆痴男| 三级视频在线播放| 精品国产三级| 亚洲综合另类| 日本特黄AA片免费视频| 91超碰大香蕉| 一区二区经典| 青春草在线视频免费观看| 中文av网站| 黄色3A片在线观看| 国产精品大香蕉| 婷婷五月天激情四射| 成人午夜无码视频| 欧美精品日韩在线观看| 熟女少妇一区二区三区| 悠悠久久久| 天天舔天天操| 大荫蒂精品另类| 欧美一级特黄AAAAAA片在线视频| 777免费观看成人电影视频| 人人色人人摸| 日本免费黄色电影| 护士小雪的yin荡高日记H视频 | 国产日韩91| 松岛枫在线视频| 中文字幕不卡AV在线观看| 国产欧美在线观看| 电影91久久久| 特级av| 成人A片免费看| 99视频久久| 国产AV无码成人精品区| 丁香婷婷激情| 久操免费观看| 日本成人电影一区二区三区| 影音先锋无码专区| 香蕉福利网| 青青日逼| 日韩V欧美| 黄色一级在线| 日本一区二区三区免费看| 韩国精精品视频| 国产激情久久| 婷婷五月天影院| 色婷婷基地| 精品久久久久久久久久| 成人乱无码AV在线观看| 日韩高清无码不卡| 国产日韩在线视频| 日韩黄色三级| 日韩精品人妻中文字幕第4区| 老婆被黑人杂交呻吟视频| 日韩无码精品一区二区三区| 蝌蚪久久| 久久怡春院| 亚洲国产成人AV| 免费人成视频在线| 成人午夜啪免费视频在线观看软件| 国产成人激情| 少妇厨房愉情理伦BD在线观| 日日爱av| 爱爱爱爱网| 高清无码网站在线观看| 色婷婷中文在线| 一区二区小视频| 嫩BBB搡BBBB搡BBBB| av无码导航| 国产日韩a| 做爱视频91| 国精产品一区二区三区在线观看 | 成人aV免费观看| 亚洲AV无码成人精品区天堂小说 | 亚洲精品少妇| 午夜一本道| 日日夜夜天天综合| 免费观看的av| 久久久视频6r| 青青操天天干| 91区视频| 影音先锋蜜桃| 在线观看小视频| 91精品青青草| 亚洲在线资源| 国产一级AV免费观看| 蜜臀久久99精品久久久| 成人日韩在线| 亚洲午夜精品成人毛片| 伊人免费在线| 久久99国产乱子伦...| 91毛片在线观看| 精品国产欧美| 亚洲美女视频在线观看| 国产91精品在线观看| 婷婷亚洲色| 无码一二三四| 中文字幕在线不卡| 一区二区黄色| 日韩国产av| 激情六月天| 伊人中文字幕| 一区二区三区欧美| 91麻豆大奶巨乳一区白虎| 无码不卡视频在线观看| 蝌蚪九色啦403| 亚洲午夜精品久久久久久APP| 亚洲精品另类| 中文字幕在线播放av| 日韩中文无码电影| 色五月网站| 91麻豆精品无码人妻| 国产精品无码中文在线| 婷婷狠狠操| 狠狠躁18三区二区一区免费人| 色99视频| 亚洲视频在线免费播放| 中文字幕无码Av在线看| 天堂在线免费视频| 久久在线视频| 亚洲天堂在线视频| 亚洲精品国产精品乱玛不99| 免费av一区二区| 久久久久久久久成人| 亚洲免费视频网站| 婷婷三级| 美日韩精品| 伊人国产视频| 伊人大香蕉电影| 伊人久久免费| 香蕉久久a毛片| 亚洲AV成人无码| 国产高清无码在线观看| 亚色网址| 色色色999| 亚洲中文无码在线观看| 97伊人大香蕉| 欧美日韩色情| 欧美日韩成人一区二区三区| 欧美香蕉视频| 国产免费一区二区| 乱婬妺妺躁爽A片| 日韩一级黄色电影| 亚洲av成人网| 先锋影音亚洲无码av| 骚骚肥肥一区二区三区| 亚洲黄色在线看| 免费黄色一级电影| 99热播| av免费播放| 一区二区三区在线观看| 一级A片免费黄色视频| 69av电影| 婷婷色色五月| 日韩免费视频一区| 毛片成人网| 欧美日逼网站| 亚洲精品a| 亚洲中文av| 亚洲香蕉av| 亚洲视频在线免费| 天天干天天操天天爽| 国产亚洲欧洲| 1024国产| 99在线视频免费观看| 91精品婷婷国产综合久久韩漫| AV天堂小说| 影音先锋91视频| 欧美日韩婷婷| 婷婷丁香一区二区三区| 人妻少妇无码精品| 欧美日韩一二三区| 日批视频| 色五月视频在线| www.99热视频| 人人草在线观看| 91视频色| 少妇无码视频| 天天天日天天天操| 玖热精品| 国产亚洲欧美视频| 水蜜桃视频免费| 波多野结衣成人在线| 国产成人精品AV在线观| www.五月天婷婷| 五月天啪啪视频| 波多野结衣大战黑人| 日韩在线中文字幕视频| 18一20女一片毛片| 欧美成人毛片AAAAAA| 夏目あきら被续侵犯7天| 日韩亚洲在线视频| 精品无码人妻一区二区三区| 69视频国产| 亚洲黄色网址| 麻豆91免费视频| 双腿张开被9个男人调教| 粉嫩小泬BBBBBB免费看| 尤物视频在线| 97超碰在线播放| 999久久精品| 欧美视频在线观看一区| 无码免费毛片一区二区三区古代| 婷婷五月丁香花| 久久不卡| 国产精品久久久久久久久久二区三区| 波多野结衣AV网站| 国产亲子乱XXXXimim/| 毛片小说| 黄色成人18| 少妇人妻一区| 手机AV在线观看| 强伦轩人妻一区二区三区四区| 欧美香蕉| 淫荡少妇美红久久久久久久久久| 91插插网| 亚洲男人的天堂网| 日韩精品一二三| 国产精品一二三| 免费AV资源在线观看| 亚洲视频www| 无码免费一区| 午夜天堂| 亚洲高清视频无码| 亚洲在线观看中文字幕| 精品国产污污免费网站入口| 国产操片| 老太奶性BBwBBw侧所| 日爽夜爽| 日韩无| 欧美三级| 成人黄片在线免费观看| 久草在| 日韩午夜福利| www.四虎成人网站| 大香伊人国产| 美日韩精品| 四川女人毛多水多A片| 操一操| 亚洲无码黄色片| 亚洲中文字幕在| 亚洲精品福利| 久久亚洲Aⅴ成人无码国产丝袜| 亚洲天天在线| 国产啊啊啊啊| 亚洲免费高清| 午夜AV福利影院| 大鷄巴成人A片| 国产伦乱| 无码不卡视频在线观看| 深爱激情综合网| 精品欧美一区二区三区久久久 | 午夜激情AV| 操逼不卡视频| 先锋资源久久| 91精品国产日韩91久久久久久 | 五月婷婷婷婷| 国产一级特黄A片| 婷婷五月在线播放| 亚洲成人在线观看视频| 无码人妻精品一区二区三区99仓| 麻豆三级电影| 大香蕉九九| 国产女人18毛片水18精品| 91资源在线| 体内射精免费视频| 91污视频在线观看| 日韩一级在线播放| 亚洲一区二区黄色电影视频网站 | 91香蕉网站| 久久这里精品| 91工厂露脸熟女| 91视频福利网| 成人日皮视频| 黄色午夜福利| 老司机精品视频在线观看| 一级黄视频| 伊人东京热| 国内自拍99| 欧美日韩精品一区二区三区视频播放| 久久午夜视频| 啪啪网网站| 七十路の高齢熟女千代子下载| 荫蒂添出高潮A片视频| 性欧美成人播放77777| 国产网站精品| 女生自慰网站在线观看| 国精产品秘一区二区| 网站啪啪| 色婷婷影院| 久久婷婷久久| 亚洲乱伦网站| 操批视频| 人人澡人人爽欧一区| 理论片无码| 一区二区三区四区五区在线| 五月天视频网| 日韩无码影视| 黄色欧美视频| 日本黄在线看| 青青青草视频在线| 日韩综合色视频导航| 福利导航视频| 日韩中出| 欧美aa片| 精品超碰| 色五月在线| 91av导航| 精品国产黄色| 中文字幕在线观看辣文| 亚洲AV成人电影| 91av免费观看| 黄色一级生活片| 午夜成人精品| 91视频亚洲| 国产乱叫456在线|