qiankun + Vue實現(xiàn)微前端服務

本文介紹如何使用qiankun + Vue搭建一個前端微服務

一尝艘、什么是微前端

Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. -- Micro Frontends
微前端是一種多個團隊通過獨立發(fā)布功能的方式來共同構(gòu)建現(xiàn)代化 web 應用的技術(shù)手段及方法策略妖枚。

以上內(nèi)容均來自于 qiankun手冊楞件,有興趣可以也看看這個api文檔塘揣,很多關于微前端的困惑都在里面,以及為什么是不用iframe等....
本文代碼,可以直接食用:qiankun-demo
效果:

微前端效果.gif

二、創(chuàng)建應用

在本例子中劣光,我們需要通過vue-cli創(chuàng)建創(chuàng)建一個主應用,兩個子應用糟把。
目錄結(jié)構(gòu):

|——qiankun-demo // 主文件夾
|——|——child-app01 //子應用1
|——|——child-app02 //子應用2
|——|——main-app //主應用
|——|——server.js // 自己寫的一個快捷啟動服務腳本绢涡,手動啟動服務的可以忽略
|——|——package.js // 腳本依賴,手動啟動服務的可以忽略

三遣疯、應用配置

主應用相關代碼:

qiankun是通過registerMicroApps(apps, lifeCycles)API來注冊子應用的雄可,在main-app目錄下

npm install qiankun -S
npm install element-ui -S // 引入element快速實現(xiàn)樣式

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(element);
import { registerMicroApps, start } from 'qiankun'

Vue.config.productionTip = false

const microAppNum = 2
let apps = [];
for (let i = 1; i <= microAppNum; i++) {
  apps.push(
    {
      name: '子應用child0' + i,
      entry: 'http://localhost:90' + i + '0',
      //fetch,
      container: '#vue',
      activeRule: '/child0' + i,
      props: { param01: i }
    }
  );
}
const config = {
    beforeLoad: [
        app => {
            console.log("%c before load",
            'background:#0f0 ; padding: 1px; border-radius: 3px;  color: #fff',
            app);
        }
    ], // 掛載前回調(diào)
    beforeMount: [
        app => {
            console.log("%c before mount",
            'background:#f1f ; padding: 1px; border-radius: 3px;  color: #fff',
            app);
        }
    ], // 掛載后回調(diào)
    afterUnmount: [
        app => {
            console.log("%c after unload",
            'background:#a7a ; padding: 1px; border-radius: 3px;  color: #fff',
            app);
        }
    ] // 卸載后回調(diào)
  }
registerMicroApps(apps, config);
let option = { prefetch: false }
start();


new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
  • 如果暫時不需要看到生命周期的輸出,可以不定義config缠犀,同時注冊應該時registerMicroApps(apps, config);把里面的config去掉即可
  • 其中的container內(nèi)的#vue数苫,對應app.vue內(nèi)的id="vue"元素塊

vue.config.js

若不存在該文件,新建一個vue.config.js

module.exports = {
    devServer: {
        port: 9000,
        headers: {
            //'Access-Control-Allow-Origin': "*"
        }
    }
};

App.vue

利用引入的element夭坪,快速搭建一個簡單的頁面

<template>
  <div>
    <el-menu :router="true" mode="horizontal">
      <el-menu-item index="/">首頁</el-menu-item>
      <el-menu-item v-for="no in  microAppNum" :key="no" :index="'/child0'+no">子應用0{{no}}</el-menu-item>
    </el-menu>
    <router-view />
    <!-- 子應用入口 -->
    <div id="vue"></div>
  </div>
</template>

<script>
export default {
  name: "main01",
  data() {
    return {
      microAppNum: 2
    };
  },
};
</script>

子應用配置

mian.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

// Vue.config.productionTip = false

let install = null;
function render(props) {
  install = new Vue({
    router,
    store,
    render: h => h(App)
  }).$mount('#app')
}
if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
} else {
  render();
}
export async function bootstrap(props) {

}

export async function mount(props) {
  render(props);
}
export async function unmount(props) {
  install.$destroy();
}

vue.config.js

同樣文判,在該文件內(nèi),

const port = 9010; // 一個應用寫9010室梅,另一個寫9020
module.exports = {
    devServer: {
        port,
        headers: {
            'Access-Control-Allow-Origin': '*'
        }
    },
    configureWebpack: {
        output: {
            library: 'child',
            libraryTarget: 'umd'
        }
    }
};

子應用必須支持跨域:由于 qiankun 是通過 fetch 去獲取子應用的引入的靜態(tài)資源的戏仓,所以必須要求這些靜態(tài)資源支持跨域;

本地服務直接在vue.config.js內(nèi)配上跨域相關即可亡鼠,上線的話赏殃,需要在服務器配置白名單。后續(xù)文章將更新跟打包相關內(nèi)容间涵。

/router/index.js

這里需要特別注意仁热,我們在父應用注冊微服務的時候,寫了相關activeRule勾哩,
所以子應用路由這邊配置也要相應的修改


image.png

四抗蠢、使用

分別進入父子應用目錄

npm run serve

全部啟動后举哟,可以單獨打開子應用,看到頁面迅矛,也可以在主應用內(nèi)妨猩,直接看到里面的子應用,效果類似iframe秽褒。

發(fā)現(xiàn)服務啟動壶硅,因為代碼端口寫死,若端口沖突销斟,可以關閉端口重新啟動服務庐椒,或者修改代碼。

由于我不想每次都進入父子應用目錄蚂踊,去重復啟動多個服務约谈,手動寫了一個node腳本,去快速啟動三個服務犁钟,可以手動啟動服務的窗宇,可忽略該腳本,分別手動啟動三個服務即可特纤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末军俊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捧存,更是在濱河造成了極大的恐慌粪躬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昔穴,死亡現(xiàn)場離奇詭異镰官,居然都是意外死亡,警方通過查閱死者的電腦和手機吗货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門泳唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宙搬,你說我怎么就攤上這事笨腥。” “怎么了勇垛?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵脖母,是天一觀的道長。 經(jīng)常有香客問我闲孤,道長谆级,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮肥照,結(jié)果婚禮上脚仔,老公的妹妹穿的比我還像新娘。我一直安慰自己舆绎,他們只是感情好玻侥,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亿蒸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掌桩。 梳的紋絲不亂的頭發(fā)上边锁,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音波岛,去河邊找鬼茅坛。 笑死,一個胖子當著我的面吹牛则拷,可吹牛的內(nèi)容都是我干的贡蓖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼煌茬,長吁一口氣:“原來是場噩夢啊……” “哼斥铺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坛善,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晾蜘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后眠屎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剔交,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年改衩,在試婚紗的時候發(fā)現(xiàn)自己被綠了岖常。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡葫督,死狀恐怖竭鞍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情橄镜,我是刑警寧澤笼蛛,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蛉鹿,受9級特大地震影響滨砍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一惋戏、第九天 我趴在偏房一處隱蔽的房頂上張望领追。 院中可真熱鬧,春花似錦响逢、人聲如沸绒窑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽些膨。三九已至,卻和暖如春钦铺,著一層夾襖步出監(jiān)牢的瞬間订雾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工矛洞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼哎,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓沼本,卻偏偏與公主長得像噩峦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抽兆,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359