微前端,qiankun
微前端?
spa 单页应用时代,我们的页面只有 index.html 这一个 html 文件,并且这个文件里面只有一个内容标签 <div id="app"></div>,用来充当其他内容的容器,而其他的内容都是通过 js 生成的。也就是说,我们只要拿到了子项目的容器 <div id="app"></div> 和生成内容的 js,插入到主项目,就可以呈现出子项目的内容。
我们只需要拿到子项目的上面四个标签,插入到主项目的 HTML 中,就可以在父项目中展现出子项目。
然后再把相对应的静态资源引用路径处理好,就可以实现微前端。
微前端意义?
可以把功能离散,一个功能一个工程,自由组合。复用(嵌入)别人的项目页面,但是别人的项目运行在他自己的环境之上。
qiankun ?
qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。https://qiankun.umijs.org/zh/
子应用配置
// public-path.js if (window.__POWERED_BY_QIANKUN__) { // eslint-disable-next-line no-undef __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; }
//vue.config.js // 可以在这个文件修改CLI配置 // 配置项参考 https://cli.vuejs.org/zh/config/ const { name } = require('./package'); module.exports = { publicPath: './', productionSourceMap:false, devServer: { // port: 8080, headers: { 'Access-Control-Allow-Origin': '*', }, }, chainWebpack: (config) => { config.module .rule('fonts') .test(/.(ttf|otf|eot|woff|woff2)$/) .use('url-loader') .loader('url-loader') .tap(options => ({ name: '/fonts/[name].[hash:8].[ext]' })) .end() }, // 自定义webpack配置 configureWebpack: { output: { library: `${name}`, libraryTarget: 'umd',// 把子应用打包成 umd 库格式 jsonpFunction: `webpackJsonp_${name}`, }, }, }
// package.json { "name": "data-dew", ... }
// 子应用入口-例子 import './public-path'; import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css'; import request from './http/request' Vue.prototype.$axios = request; Vue.config.productionTip = false Vue.use(ElementUI) let instance = null; let render = ({ data = {}, container } = {}) => { instance = new Vue({ router, store, data() { return { parentRouter: data.router, parentVuex: data.store, } }, render: h => h(App) }).$mount(container ? container.querySelector('#dataDew') : '#dataDew'); } if (!window.__POWERED_BY_QIANKUN__) { render(); } export async function bootstrap() { console.log('vue app bootstraped'); } export async function mount(props) { console.log('props from main framework', props.data); render(props); }
export async function update(props) {
render(props);
}
export async function unmount() { instance.$destroy(); instance.$el.innerHTML = ""; instance = null; console.log(router) }
主应用配置
1 import Vue from 'vue' 2 import App from './App.vue' 3 import router from './router' 4 import store from './store' 5 import ElementUI from 'element-ui' 6 import 'element-ui/lib/theme-chalk/index.css'; 7 import request from './http/request' 8 import { loadMicroApp,initGlobalState,registerMicroApps, start } from 'qiankun'; 9 10 Vue.prototype.$axios = request; 11 12 Vue.config.productionTip = false 13 14 Vue.use(ElementUI) 15 16 17 18 const vm = new Vue({ 19 router, 20 store, 21 render: h => h(App) 22 }) 23 24 vm.registerMicroApps = {}; 25 26 vm.loadMicroApps = {}; 27 28 // name-app名称,path-app访问路径,url—app资源路径 29 vm.loadMicroApp = (name,path,url) => { 30 if(!vm.loadMicroApps[name]){ 31 vm.loadMicroApps[name] = loadMicroApp({ 32 name:name, 33 entry: url, 34 container: '#subAppContainer', 35 activeRule: path, 36 props: { vm } 37 }) 38 } 39 }; 40 41 // name-app名称 42 vm.destroyLoadMicroApp = (name) => { 43 44 vm.loadMicroApps[name] && vm.loadMicroApps[name].mountPromise.then(() => { 45 46 microApp.unmount() 47 48 }); 49 50 }; 51 52 // name-app名称 53 vm.registerMicroApp = (name,path,url) => { 54 55 const config = { 56 name:name, 57 entry: url, 58 container: '#subAppContainer', 59 activeRule: path, 60 props: { vm } 61 }; 62 63 if(!vm.registerMicroApps[name]){ 64 65 registerMicroApps([config],{ 66 beforeLoad: (a,b) => { 67 // console.log("加载前",a,b); 68 }, 69 beforeMount: () => { 70 // console.log("挂在前"); 71 }, 72 afterMount: () => { 73 // console.log("挂载后"); 74 }, 75 beforeUnmount: () => { 76 // console.log("销毁前"); 77 }, 78 afterUnmount: () => { 79 // console.log("销毁后"); 80 }, 81 }) 82 83 start(); 84 85 vm.registerMicroApps[name] = config; 86 87 } 88 89 }; 90 91 vm.$mount('#app');
注册应用
this.$root.registerMicroApp('data-dew2','/bbb','http://192.168.10.161:1111/'); this.$root.registerMicroApp('data-dew','/aaa','http://192.168.10.161:6321/'); this.$root.registerMicroApp('dataworkshop','/ccc','http://192.168.10.161:8083');
做你说过的 说你能做的;

浙公网安备 33010602011771号