qiankun單個(gè)微應(yīng)用集成的demo

qiankun單個(gè)微應(yīng)用集成的demo

這里改造的主應(yīng)用和微應(yīng)用都是Vue的項(xiàng)目,但是qiankun本身不限制技術(shù)棧枯途,不同子應(yīng)用可以是不同的技術(shù)棧愉舔,并且為了簡單,方便大家搭建锈嫩,這里的主微應(yīng)用全部都是利用Vue-cli腳手架生成的。

0改造主應(yīng)用

00創(chuàng)建微應(yīng)用容器

微應(yīng)用容器用于承載微應(yīng)用垦搬,渲染顯示微應(yīng)用

<!-- App.vue -->
<template>
  <div id="appf">
    <img src="./assets/logo.png">
    <!-- <router-view/> -->
    <hello-world/>
    <div id='yourContainer'></div>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue';
export default {
  name: 'App',
  components: { HelloWorld },
}
</script>
<!-- HelloWorld.vue -->
<router-link to="/chaiQiankunTest/ffff">
    test1
</router-link>
<div @click="onChangePage('/chaiQiankunTest/ffff')" >test2</div>

//定義跳轉(zhuǎn)方法
onChangePage(url){
    console.log(url)
    this.routerGo(url, '我喜愛的男明星')
},
routerGo(href = '/', title = null, stateObj = {}) {
    window.history.pushState(stateObj, title, href); 
}

出于簡單考慮呼寸,這里沒有使用router-view,防止因?yàn)槁酚傻母淖兒锓。鲬?yīng)用的渲染出現(xiàn)變化对雪,現(xiàn)在這樣做方便微應(yīng)用掛載之后進(jìn)行對(duì)比。

01注冊微應(yīng)用

微應(yīng)用的注冊點(diǎn)可以自己選擇米绕,既可以在main.js中進(jìn)行注冊瑟捣,那么在應(yīng)用啟動(dòng)時(shí)就會(huì)執(zhí)行相應(yīng)的生命周期函數(shù)馋艺,還可以在路由守衛(wèi)中,命中路由之后進(jìn)行注冊迈套,demo中選擇在路由命中后動(dòng)態(tài)的注冊微應(yīng)用捐祠。

//router/index.js
import { registerMicroApps, start } from "qiankun"

router.beforeEach((to, from, next) => {
  if (to.path.includes('/chaiQiankunTest/ffff')) {
    registerMicroApps(
      [
          {
              name: "chai-project",//這里的name一定要和微應(yīng)用這配置的output中的library相互對(duì)應(yīng),因?yàn)?   name是主應(yīng)用找到微應(yīng)用對(duì)外暴露的生命周期函數(shù)的主要憑證
              entry: "http://localhost:8080",//這是微應(yīng)用的入口地址
              container: '#yourContainer',//這是在主應(yīng)用中微應(yīng)用的渲染承載容器
              activeRule: "/chaiQiankunTest/ffff"http://這是進(jìn)行路由監(jiān)聽桑李,一旦匹配踱蛀,就會(huì)加載微應(yīng)用并進(jìn)行掛載,這里也要主要在微應(yīng)用中需要設(shè)置路由base的時(shí)候要相互對(duì)應(yīng)芙扎,后面會(huì)提到
          }
      ],
      {
          beforeLoad: [
              app => {
                  console.log("before load", app);
              }
          ], // 掛載前回調(diào)
          beforeMount: [
              app => {
                  console.log("before mount", app);
              }
          ], // 掛載后回調(diào)
          afterUnmount: [
              app => {
                  console.log("after unload", app);
              }
          ] // 卸載后回調(diào)
      }
    )
    start();
  }
  next();
})

01改造微應(yīng)用

00導(dǎo)出 qiankun 主應(yīng)用所需要的三個(gè)生命周期鉤子函數(shù)

這里主要修改的就是微應(yīng)用的入口文件main.js星岗,由于代碼不多,這里直接將整個(gè)文件代碼貼出來

//main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import routes from './router'
import axios from 'axios'
import Router from 'vue-router'
import './public-path'

let router = null;
let instance = null;

Vue.config.productionTip = false
Vue.use(Router);

/**
 * 渲染函數(shù)
 * 兩種情況:主應(yīng)用生命周期鉤子中運(yùn)行 / 微應(yīng)用單獨(dú)啟動(dòng)時(shí)運(yùn)行
 */
function render (props) {
  // 在 render 中創(chuàng)建 VueRouter戒洼,可以保證在卸載微應(yīng)用時(shí)俏橘,移除 location 事件監(jiān)聽,防止事件污染
  router = new Router({
    // 運(yùn)行在主應(yīng)用中時(shí)圈浇,添加路由命名空間 /chaiQiankunTest/ffff,這和主應(yīng)用中注冊微應(yīng)用時(shí)的activeRule相互對(duì)應(yīng)
    base: window.__POWERED_BY_QIANKUN__ ? 'chaiQiankunTest/ffff' : '/',
    mode: 'history',
    routes
  });

  // 掛載應(yīng)用
  instance = new Vue({
    router,
    render: (h) => h(App),
    beforeCreate () {
      window.util = {}
      window.util.$http = axios.create({
        timeout: 1000 * 50,
        withCredentials: true
      })
    }
  }).$mount('#app');
}

// 獨(dú)立運(yùn)行時(shí)寥掐,直接掛載應(yīng)用
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

/**
 * bootstrap 只會(huì)在微應(yīng)用初始化的時(shí)候調(diào)用一次,下次微應(yīng)用重新進(jìn)入時(shí)會(huì)直接調(diào)用 mount 鉤子磷蜀,不會(huì)再重復(fù)觸發(fā) bootstrap召耘。
 * 通常我們可以在這里做一些全局變量的初始化,比如不會(huì)在 unmount 階段被銷毀的應(yīng)用級(jí)別的緩存等褐隆。
 */
export async function bootstrap () {
  console.log('mscrtApp bootstraped');
}

/**
 * 應(yīng)用每次進(jìn)入都會(huì)調(diào)用 mount 方法污它,通常我們在這里觸發(fā)應(yīng)用的渲染方法
 */
export async function mount (props) {
  console.log('mscrtApp mount', props);
  render(props);
}

/**
 * 應(yīng)用每次 切出/卸載 會(huì)調(diào)用的方法,通常在這里我們會(huì)卸載微應(yīng)用的應(yīng)用實(shí)例
 */
export async function unmount () {
  console.log('mscrtApp unmount');
  instance.$destroy();
  instance = null;
  router = null;
}
//public-path.js
if (window.__POWERED_BY_QIANKUN__) {
    // 動(dòng)態(tài)設(shè)置 webpack publicPath庶弃,防止資源加載出錯(cuò)
    // eslint-disable-next-line no-undef
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

這里面可能還牽扯到router/index.js的改造衫贬,將VueRouter的創(chuàng)建遷移到render中,具體的作用是可以保證在卸載微應(yīng)用時(shí)歇攻,移除 location 事件監(jiān)聽固惯,防止事件污染。

01配置 webpack

主要的目的是使 main.js 導(dǎo)出的生命周期鉤子函數(shù)可以被 qiankun 識(shí)別獲取 缴守。

//webpack.base.conf.js
output: {
    // 微應(yīng)用的包名葬毫,這里與主應(yīng)用中注冊的微應(yīng)用名稱一致。這個(gè)名字也就是package.json中的name
    library: 'chai-project',
    // 將你的 library 暴露為所有的模塊定義下都可運(yùn)行的方式
    libraryTarget: 'umd',
    // 按需加載相關(guān)屡穗,設(shè)置為 webpackJsonp_VueMicroApp 即可
    jsonpFunction: `webpackJsonp_chai-project`
  },
//webpack.base.conf.js中的devServer對(duì)象中需要加入下面這個(gè)配置贴捡,這樣主應(yīng)用在fatch微應(yīng)用靜態(tài)資源時(shí)會(huì)出現(xiàn)跨域的問題
disableHostCheck: true,
headers: {
    'Access-Control-Allow-Origin': '*'
}

如果沒有設(shè)置這個(gè)跨域的設(shè)置,那么就可能出現(xiàn)跨域問題村砂,

跨域問題.jpg

02demo演示

主應(yīng)用界面初始化

主應(yīng)用界面.jpg

test1和test2是兩個(gè)觸發(fā)注冊微應(yīng)用的按鈕烂斋,功能一樣,點(diǎn)擊test1可以得到:

qiankundemo演示.jpg

此時(shí)成功加載微應(yīng)用,并且DOM結(jié)構(gòu)為:

加載微應(yīng)用后的dom結(jié)構(gòu).jpg

主應(yīng)用和微應(yīng)用的生命周期函數(shù)的執(zhí)行順序?yàn)?/p>

掛載子應(yīng)用時(shí)的生命周期鉤子函數(shù)主子應(yīng)用的執(zhí)行順序.jpg

在點(diǎn)擊回退到主應(yīng)用的頁面之后源祈,主微應(yīng)用的生命周期鉤子函數(shù)的執(zhí)行順序?yàn)?/p>

子應(yīng)用unmount時(shí)的主子應(yīng)用生命周期函數(shù)的執(zhí)行順序.jpg

總結(jié)

到這,Vue技術(shù)棧的主應(yīng)用和微應(yīng)用的集成Demo算是基本完成色迂,這里只是最基礎(chǔ)的一個(gè)集成示例香缺,它們的鉤子函數(shù)的執(zhí)行順序有些類似Vue中父子組件的生命周期函數(shù)的執(zhí)行順序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歇僧,一起剝皮案震驚了整個(gè)濱河市图张,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诈悍,老刑警劉巖祸轮,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侥钳,居然都是意外死亡适袜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門舷夺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苦酱,“玉大人,你說我怎么就攤上這事给猾∫哂” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵敢伸,是天一觀的道長扯饶。 經(jīng)常有香客問我,道長池颈,這世上最難降的妖魔是什么尾序? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮饶辙,結(jié)果婚禮上蹲诀,老公的妹妹穿的比我還像新娘。我一直安慰自己弃揽,他們只是感情好脯爪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矿微,像睡著了一般痕慢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涌矢,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天掖举,我揣著相機(jī)與錄音,去河邊找鬼娜庇。 笑死塔次,一個(gè)胖子當(dāng)著我的面吹牛方篮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播励负,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼藕溅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了继榆?” 一聲冷哼從身側(cè)響起巾表,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略吨,沒想到半個(gè)月后集币,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翠忠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鞠苟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负间。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偶妖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出政溃,到底是詐尸還是另有隱情趾访,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布董虱,位于F島的核電站扼鞋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愤诱。R本人自食惡果不足惜云头,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淫半。 院中可真熱鬧溃槐,春花似錦、人聲如沸科吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对人。三九已至谣殊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牺弄,已是汗流浹背姻几。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛇捌。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓抚恒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親络拌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柑爸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345