微前端框架 之 qiankun

介紹

qiankun 是基于 single-spa 做了二次封裝的微前端框架擦酌,通過解決了 single-spa 的一些弊端和不足富蓄,來幫助大家實(shí)現(xiàn)更簡(jiǎn)單像街、無痛的構(gòu)建一個(gè)生產(chǎn)可用的微前端架構(gòu)系統(tǒng)筹裕。

因?yàn)?qiankun 是基于 single-spa 做的二次封裝较鼓,主要解決了 single-spa 的一些痛點(diǎn)和不足椎木,所以最好對(duì) single-spa 有一個(gè)全面的了解和認(rèn)識(shí),明白其原理博烂、了解它的不足和缺陷拓哺,然后帶著問題和目的去閱讀 qiankun 源碼,可以達(dá)到事半功倍的效果脖母,整個(gè)閱讀過程的思路也會(huì)更加清晰明了士鸥。

qiankun 解決了以下幾個(gè)問題:

  1. HTML Entry
    qiankun 通過 HTML Entry 的方式來解決 JS Entry 帶來的問題,讓你接入微應(yīng)用像使用 iframe 一樣簡(jiǎn)單谆级。
  2. 樣式隔離
    qiankun 實(shí)現(xiàn)了兩種樣式隔離
  • 嚴(yán)格的樣式隔離模式烤礁,為每個(gè)微應(yīng)用的容器包裹上一個(gè) shadow dom 節(jié)點(diǎn)讼积,從而確保微應(yīng)用的樣式不會(huì)對(duì)全局造成影響
  • 實(shí)驗(yàn)性的方式,通過動(dòng)態(tài)改寫 css 選擇器來實(shí)現(xiàn)脚仔,可以理解為 css scoped 的方式
  1. 運(yùn)行時(shí)沙箱
    qiankun 的運(yùn)行時(shí)沙箱分為 JS 沙箱和 樣式沙箱
    JS 沙箱 為每個(gè)微應(yīng)用生成單獨(dú)的 window proxy 對(duì)象勤众,配合 HTML Entry 提供的 JS 腳本執(zhí)行器 (execScripts) 來實(shí)現(xiàn) JS 隔離;
    樣式沙箱 通過重寫 DOM 操作方法鲤脏,來劫持動(dòng)態(tài)樣式和 JS 腳本的添加们颜,讓樣式和腳本添加到正確的地方,即主應(yīng)用的插入到主應(yīng)用模版內(nèi)猎醇,微應(yīng)用的插入到微應(yīng)用模版窥突,并且為劫持的動(dòng)態(tài)樣式做了 scoped css 的處理,為劫持的腳本做了 JS 隔離的處理硫嘶,更加具體的內(nèi)容可繼續(xù)往下閱讀或者直接閱讀 微前端專欄 中的 qiankun 2.x 運(yùn)行時(shí)沙箱 源碼分析

  2. 資源預(yù)加載
    qiankun 實(shí)現(xiàn)預(yù)加載的思路有兩種阻问,一種是當(dāng)主應(yīng)用執(zhí)行 start 方法啟動(dòng) qiankun 以后立即去預(yù)加載微應(yīng)用的靜態(tài)資源,另一種是在第一個(gè)微應(yīng)用掛載以后預(yù)加載其它微應(yīng)用的靜態(tài)資源沦疾,這個(gè)是利用 single-spa 提供的 single-spa:first-mount 事件來實(shí)現(xiàn)的

  3. 應(yīng)用間通信
    qiankun 通過發(fā)布訂閱模式來實(shí)現(xiàn)應(yīng)用間通信称近,狀態(tài)由框架來統(tǒng)一維護(hù),每個(gè)應(yīng)用在初始化時(shí)由框架生成一套通信方法哮塞,應(yīng)用通過這些方法來更改全局狀態(tài)和注冊(cè)回調(diào)函數(shù)刨秆,全局狀態(tài)發(fā)生改變時(shí)觸發(fā)各個(gè)應(yīng)用注冊(cè)的回調(diào)函數(shù)執(zhí)行,將新舊狀態(tài)傳遞到所有應(yīng)用

框架目錄結(jié)構(gòu)

github 克隆項(xiàng)目以后忆畅,執(zhí)行一下命令:

  • 安裝 qiankun 框架所需的包
    yarn install

  • 安裝示例項(xiàng)目的包
    yarn examples:install

以上命令執(zhí)行結(jié)束以后:


  • npm-run-all
    一個(gè) CLI 工具衡未,用于并行或順序執(zhí)行多個(gè) npm 腳本

  • father-build
    基于 rollup 的庫構(gòu)建工具,father 更加強(qiáng)大

  • 多項(xiàng)目的目錄組織以及 scripts 部分的編寫

  • main 和 module 字段
    標(biāo)識(shí)組件庫的入口邻眷,當(dāng)兩者同時(shí)存在時(shí)眠屎,module 字段的優(yōu)先級(jí)高于 main

示例項(xiàng)目中的主應(yīng)用

這里需要更改一下示例項(xiàng)目中主應(yīng)用的 webpack 配置

{
  ...
  devServer: {
    // 從 package.json 中可以看出剔交,啟動(dòng)示例項(xiàng)目時(shí)肆饶,主應(yīng)用執(zhí)行了兩條命令,其實(shí)就是啟動(dòng)了兩個(gè)主應(yīng)用岖常,但是卻只配置了一個(gè)端口驯镊,瀏覽器打開 localhost:7099 和你預(yù)想的有一些出入,這時(shí)顯示的是 loadMicroApp(手動(dòng)加載微應(yīng)用) 方式的主應(yīng)用竭鞍,基于路由配置的主應(yīng)用沒起來板惑,因?yàn)槎丝诒徽加昧?    // port: '7099'
  // 這樣配置,手動(dòng)加載微應(yīng)用的主應(yīng)用在 7099 端口偎快,基于路由配置的主應(yīng)用在 7088 端口
    port: process.env.MODE === 'multiple' ? '7099' : '7088'
  }
  ...
}
啟動(dòng)示例項(xiàng)目
yarn examples:start
示例項(xiàng)目

官方為我們準(zhǔn)備了兩種主應(yīng)用的實(shí)現(xiàn)方式冯乘,五種微應(yīng)用的接入示例,覆蓋面可以說是比較廣了晒夹,足以滿足大家的普遍需要了

主應(yīng)用

主應(yīng)用在 examples/main 目錄下裆馒,提供了兩種實(shí)現(xiàn)方式姊氓,基于路由配置的 registerMicroApps 和 手動(dòng)加載微應(yīng)用的 loadMicroApp。主應(yīng)用很簡(jiǎn)單喷好,就是一個(gè)從 0 通過 webpack 配置的一個(gè)同時(shí)支持 react 和 vue 的項(xiàng)目翔横,至于為什么同時(shí)支持 react 和 vue,繼續(xù)往下看

webpack.config.js

就是一個(gè)普通的 webpack 配置梗搅,配置了一個(gè)開發(fā)服務(wù)器 devServer禾唁、兩個(gè) loader (babel-loader、css loader)无切、一個(gè)插件 HtmlWebpackPlugin (告訴 webpack html 模版文件是哪個(gè))

通過 webpack 配置文件的 entry 字段得知入口文件分別為 index.js 和 multiple.js

基于路由配置

通用將微應(yīng)用關(guān)聯(lián)到一些 url 規(guī)則的方式荡短,實(shí)現(xiàn)當(dāng)瀏覽器 url 發(fā)生變化時(shí),自動(dòng)加載相應(yīng)的微應(yīng)用的功能

https://zhuanlan.zhihu.com/p/463905990?utm_id=0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末订雾,一起剝皮案震驚了整個(gè)濱河市肢预,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洼哎,老刑警劉巖烫映,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異噩峦,居然都是意外死亡锭沟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門识补,熙熙樓的掌柜王于貴愁眉苦臉地迎上來族淮,“玉大人,你說我怎么就攤上這事凭涂∽@保” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵切油,是天一觀的道長(zhǎng)蝙斜。 經(jīng)常有香客問我,道長(zhǎng)澎胡,這世上最難降的妖魔是什么孕荠? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮攻谁,結(jié)果婚禮上稚伍,老公的妹妹穿的比我還像新娘。我一直安慰自己戚宦,他們只是感情好个曙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著受楼,像睡著了一般垦搬。 火紅的嫁衣襯著肌膚如雪祠挫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天悼沿,我揣著相機(jī)與錄音等舔,去河邊找鬼。 笑死糟趾,一個(gè)胖子當(dāng)著我的面吹牛慌植,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播义郑,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蝶柿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了非驮?” 一聲冷哼從身側(cè)響起交汤,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劫笙,沒想到半個(gè)月后芙扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填大,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年戒洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片允华。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圈浇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靴寂,到底是詐尸還是另有隱情磷蜀,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布百炬,位于F島的核電站褐隆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏收壕。R本人自食惡果不足惜妓灌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一轨蛤、第九天 我趴在偏房一處隱蔽的房頂上張望蜜宪。 院中可真熱鬧,春花似錦祥山、人聲如沸圃验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澳窑。三九已至斧散,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摊聋,已是汗流浹背鸡捐。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻裁,地道東北人箍镜。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煎源,于是被迫代替她去往敵國和親色迂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容