微前端乾坤框架的实际应用

上来就干货!

主应用(基座)

h5_config.js 配置(引入到index.html)

window.SITE_CONFIG = {};
window.SITE_CONFIG['appName'] = '微前端‘;
window.SITE_CONFIG['storeState'] = {} // vuex本地储存初始化状态(用于不刷新页面的情况下,也能重置初始化项目中所有状态)

//微应用
window.MicroPre = 'http://127.0.0.1'
window.microApps = [
    // 子应用1
    {
        name: 'subApp1',
        entry: MicroPre+':8001/',
        container: '#micro-app',
        activeRule: '/subapp1',
    },
    // 子应用2
    {
        name: 'subApp2',
        entry: MicroPre+':8002/',
        container: '#micro-app',
        activeRule: '/subapp2',
    },
]

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import http from '@/utils/request'
import cloneDeep from 'lodash/cloneDeep'

//==========================微前端=====start
import { registerMicroApps, start, addGlobalUncaughtErrorHandler } from 'qiankun';
// 子应用
window.microApps = window.microApps.map(item=>{
  item.props = {
    microData:{
      entry:item.entry,
      parentStore:store,
      parentRouter:router,
      ProjectData: '额外参数'
    }
  }
  return item;
})
registerMicroApps(window.microApps,{
  beforeLoad: (app) => {
    store.commit("qiankunFinish",true);
    console.log('beforeLoad, 子应用注册:', app.name)
  },
  beforeMount: (app) => {
    console.log('beforeMount,子应用挂载前:', app.name)
  },
  afterMount: (app) => {
    store.commit("qiankunFinish",false);
    console.log('afterMount,子应用挂载:', app.name)
  },
  beforeUnmount:(app)=>{
    store.commit("qiankunFinish",true);
    console.log('beforeUnmount,子应用卸载前:', app.name)
  },
  afterUnmount: (app) =>{
    store.commit("qiankunFinish",false);
    console.log("afterUnmount,卸载后", app.name)
  },

});

addGlobalUncaughtErrorHandler(e => {
  console.log('qk error:', e)
  const {message: msg} =e
  if(msg&&msg.includes('died in status LOADING_SOURCE_CODE')){
    console.log('微应用加载失败, 请检查应用是否可用')
  }
})

start({prefetch:true});
//==========================微前端=====end

Vue.config.productionTip = false

// 挂载全局
Vue.prototype.$http = http

// 保存整站vuex本地储存初始状态
window.SITE_CONFIG['storeState'] = cloneDeep(store.state)
// 主应用(基座)
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#micro-service')

子应用

创建public-path

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

创建qiankun.js

import './public-path'; // 微前端路径
import Vue from 'vue';
import Router from 'vue-router'
import Cookies from 'js-cookie'
import http from '@/utils/request'

Vue.config.productionTip = false

Vue.use(Router);

// 挂载全局
Vue.prototype.$http = http

/**
 * 
 * @param {*} App 
 * @param {*} store 
 * @param {*} setting 微服务配置
 * @param {*} projectFiles 文件夹下的路由
 * @param {*} otherRoutes :各自项目自定义的路由
 * @returns 
 */
export default function qiankun(App, store, setting, projectFiles,otherRoutes=[]){
    let instance = ''
    let router = ''
    const isQiankun = !!window.__POWERED_BY_QIANKUN__;//当前是微
    function render(props={}) {
        const { container } = props;
        const defaultRoutes =  [...otherRoutes];
        router = new Router({
            base: isQiankun ? `/${setting.QIANKUN_APP_NAME}` : setting[process.env.NODE_ENV],
            mode: 'history',
            scrollBehavior: () => ({ y: 0 }),
            routes:defaultRoutes
        })
          
        Vue.config.performance = process.env.NODE_ENV === 'development';
        instance = new Vue({
            router,
            store,
            render: h => h(App)
        }).$mount(container ? container.querySelector(`#${setting.QIANKUN_APP_NAME}`) : `#${setting.QIANKUN_APP_NAME}`);
    }
    
    // 微前端钩子
    async function bootstrap() {
        console.log('[vue] 微应用初始化时调用一次');
    }
    async function mount(props) {
        const microData = props.microData;
        window.entry = microData.entry || "";
        window.ProjectData = microData.ProjectData;
        window.parentStore = microData.parentStore;
        window.parentRouter = microData.parentRouter;
        console.log(window.parentStore)
        console.log('[vue] 应用每次进入都会触发渲染', props);
        let token = window.parentStore.state.token
        token && Cookies.set('token', window.parentStore.state.token)
        render(props);
    }
    async function unmount() {
        console.log('[vue] 应用每次切出/卸载都会触发');
        instance.$destroy();
        instance.$el.innerHTML = '';
        instance = null;
        router = null;
        window.SITE_CONFIG['dynamicMenuRoutesHasAdded'] = false;
        console.log('销毁成功')
    }
    return {render, bootstrap, mount, unmount}
}

setting.js 配置

module.exports = {
    QIANKUN_APP_NAME: "subApp1",// 子应用的名称
    production: '/child/subApp1/', // 生产环境打包路径(根据实际部署环境配置)
    devlopment: './', // 本地运行路径
}

main.js

import Vue from 'vue';
import App from './App'
import * as directiverData from '@/utils/directive';
import store from './store'
import qiankun from '@/qiankun'

import cloneDeep from 'lodash/cloneDeep'

for(let name in directiverData){
    Vue.directive(name,{inserted:directiverData[name]});
}

const setting = require('./setting.js')

window.SITE_CONFIG['storeState'] = cloneDeep(store.state)

Vue.prototype.$setting = setting
const projectFiles = require.context('./views', true, /\.vue$/).keys()
const init = qiankun(App, store, setting, projectFiles)

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
    console.log('独立')
    init.render();
}

// 抛出乾坤钩子
export const {bootstrap,mount,unmount} = init;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容