vue-qiankun微前端

官网: https://qiankun.umijs.org/zh

首先 主应用

yarn add qiankun    或者   npm i qiankun -S

然后 主应用main.js注册子应用

import { registerMicroApps, start } from 'qiankun';

registerMicroApps([{

name: 'vueDome', // 子应用名称

entry: '//localhost:8081', // 子应用服务(改成自己的)

container: '#vueDome',  // 这里需要与App.vue里边新建dom的id一样

activeRule: '/#/vue-dome', // 本项目路由没有采用history模式

}]);

// 启动 qiankun

start();

vue-qiankun微前端

 主应用App.vue 新建div用来存放子应用(id需与上述注册内container的value一样)

vue-qiankun微前端

 子应用

子应用main.js 先暴露三个生命周期

import Vue from 'vue'

import App from './App.vue'

import router from './router'

import store from './store'

Vue.config.productionTip = false

let instance = null

function render({ container, parentStore } = {}) {

instance = new Vue({

router,

store,

data() {

return { parentStore }

},

render: h => h(App)

}).$mount(container ? container.querySelector('#vueDome') : '#vueDome')

// 这里的id,应与 index.html 里边的 id 保持一致,不然无法找到 (index.html内id不能与主项目index.html相同[app],这里边id我改为vueDome)

}

if (window.__POWERED_BY_QIANKUN__) {

__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;

}

if (!window.__POWERED_BY_QIANKUN__) {

// 全局变量来判断环境

render()

}

/**

* bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。

* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。

*/

export async function bootstrap() {

console.log('子应用bootstrap阶段')

}

/**

* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法

*/

export async function mount(props) {

console.log('现在进入子应用的mount周期', props)

render(props)

}

/**

* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例

*/

export async function unmount() {

console.log('现在进入子应用的unmount阶段')

instance.$destroy()

instance.$el.innerHTML = ''

instance = null

}

/**

* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效

*/

export async function update(props) {

console.log('子应用update props', props)

}

vue-qiankun微前端

vue-qiankun微前端 

vue-qiankun微前端 

接下来 把路由 加一点判断 

window.__POWERED_BY_QIANKUN__ 这个是qiankun用来判断是否是通过qiankun来进入的应用

import Vue from 'vue'

import VueRouter from 'vue-router'

import Home from '../views/Home.vue'

const Path = window.__POWERED_BY_QIANKUN__ ? '/vue-dome' : ''

Vue.use(VueRouter)

const routes = [

{

path: Path === '' ? '/' : Path,

name: 'Home',

component: Home

},

{

path: Path + '/about',

name: 'About',

component: function () {

return import(/* webpackChunkName: "about" */ '../views/About.vue')

}}]

const router = new VueRouter({

routes

})

if (window.__POWERED_BY_QIANKUN__) {

// 路由全局守卫

router.beforeEach((to, from, next) => {

// 判断要跳转的路由是否带 /vue-dome

if (!to.path.includes("/vue-dome")) {

// 判断是否要回主项目 / 是要回主项目 如果是要回主项目直接放行

if(to.path === '/') return next()

// 不是要回主项目 就拼接/vue-dome后 next

next({path: "/vue-dome" + to.path})

} else { next() }

})}

export default router

vue-qiankun微前端

然后 再把index.html的id再改一下,与main.js内相同(但是切记不可再为 app 因为与主项目冲突) 

vue-qiankun微前端

最后把 vue.config.js 配置一下

'use strict'

const path = require('path')

function resolve (dir) {

return path.join(__dirname, dir)

}

const port = 8080 // 端口配置

const name = 'main-app'

module.exports = {

// hash 模式下可使用

publicPath: process.env.NODE_ENV === 'development' ? '/' : '/main-app/',

outputDir: 'dist',

assetsDir: 'static',

lintOnSave: process.env.NODE_ENV === 'development',

productionSourceMap: false,

devServer: {

port: port,

open: false, // 启动项目以后自动打开浏览器

hot: true, // 模块热替换(HMR - hot module replacement)功能会在应用程序运行过程中,替换、添加或删除 模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度

hotOnly: false, // hot 和 hotOnly 的区别是在某些模块不支持热更新的情况下,前者会自动刷新页面,后者不会刷新页面,而是在控制台输出热更新失败

overlay: {

warnings: false,

errors: true

},

proxy: {

'/auth': {

target: 'http://192.168.13.157:8199',

changeOrigin: true,

pathRewrite: {

'^/auth': 'auth'

}}}},

configureWebpack: {

name: name,

resolve: {

alias: {

'@': resolve('src')

}}}}

vue-qiankun微前端 

这样就完成了,弄的不好 望各位大佬见谅,如有不足欢迎补充,谢谢! 

 

上一篇:qiankun


下一篇:草珊瑚理解IFC(inline formatting context)