微前端完整vue实例-乾坤【qiankun】

一、前言

功能说明:

  1. 此实例包含有一个qiankun-main主应用和qiankun-vue-child子应用。【可以包含若干个子应用,这里只建立一个vue子应用进行演示】
  2. 主应用跨域访问子应用系统。
  3. qiankun-main主应用运行端口8085qiankun-vue-child子应用运行端口8083。【由于使用了vue create创建vue项目,故需在项目文件夹下手动创建vue.config.js进行配置,下面会讲到】
  4. 参考文档:qiankun 官方文档
  5. 相关推荐:微服务相比iframe的优势
  6. 博客资源下载:微前端完整vue实例-乾坤【qiankun】

二、乾坤实例应用

STEP1:前期准备工作【需关注代码注释重点部分】

1. 创建主应用【qiankun-main】

  1. 新建主应用。
vue create qiankun-main
  1. 创建src/components/father.vue,内容如下:
<template>
    <div>我是father</div>
</template>
<script>
    export default {
        name: "father"
    }
</script>
  1. src/router/index.js中添加路由信息,内容如下:
import Router from 'vue-router'
export default new Router({
    mode:'history',
    base:'',
    routes: [
        { path: '/', redirect: '/father'},
        { path:'/father', component: ()=> import('@/components/father')}
    ]
})
  1. main.js中引入路由,内容如下:
import Vue from 'vue';
import App from './App.vue'
import Router from 'vue-router'
import router from "./router"
Vue.use(Router)
new Vue({
    router,
    render: h => h(App),
}).$mount('#app')
  1. 在项目根目录下新建vue.config.js,添加内容如下:
module.exports ={
    devServer: {
        port: 8085,
        headers: {			// 重点1: 允许跨域访问子应用页面
            'Access-Control-Allow-Origin': '*',
        }
    }
}
  1. 修改app.vue中的内容,如下:
<template>
  <div class="app">
    <span><router-link to="/">点击跳转到父页面</router-link></span>
    <span><router-link to="/vue">点击跳转到子页面</router-link></span>
    <router-view />
    <div id="vue"></div>	<!-- 重点2:子应用容器 id -->
  </div>
</template>
  1. 测试:运行程序后,浏览器打开本地http://localhost:8085/father,能成功显示father.vue页面的内容。结果如下:结果1

2. 创建子应用【qiankun-vue-child】

  1. 新建子应用。
vue create qiankun-vue-child
  1. 创建src/components/child.vue,内容如下:
<template>
    <div>我是child</div>
</template>
<script>
    export default {
        name: "child"
    }
</script>
  1. src/router/index.js中添加路由信息,内容如下:
import Router from 'vue-router'
import '../public-path'			// 重点3: 引入public-path文件
export default new Router({
    base: window.__POWERED_BY_QIANKUN__ ? '/vue' : '/',			// 重点4
    mode: 'history',			// 重点5
    routes: [
        { path:'/', redirect: '/child'},
        { path: '/child', component: ()=>import('../components/child')}]
})
  1. main.js中引入路由,内容如下:
import Vue from 'vue';
import App from './App.vue'
import Router from 'vue-router'
import router from "./router"
Vue.use(Router)
new Vue({
    router,
    render: h => h(App),
}).$mount('#app')
  1. 在项目根目录下新建vue.config.js,添加内容如下:
const { name } = require('./package');
module.exports = {
    devServer: {
        port: 8083,			// 重点6
        headers: {			// 重点7:同重点1,允许子应用跨域
            'Access-Control-Allow-Origin': '*',
        },
    },
    // 自定义webpack配置
    configureWebpack: {
        output: {
            library: `${name}-[name]`,
            libraryTarget: 'umd',		// 把子应用打包成 umd 库格式
            jsonpFunction: `webpackJsonp_${name}`,
        },
    },
};
  1. 修改app.vue中的内容,如下:
<template>
  <div class="app">
    我是子应用的内容
    <router-view />
  </div>
</template>
  1. 测试:运行程序后,浏览器打开本地http://localhost:8083/child,能成功显示father.vue页面的内容。结果如下:
    结果2

STEP2:乾坤简单配置步骤【主要内容】

1. 主应用配置【qiankun-main】

  1. 安装乾坤。【说明:主应用需要安装乾坤依赖,子应用均不需要,但子应用需要暴露生命周期方法给主应用】
$ yarn add qiankun # 或者 npm i qiankun -S
  1. 在主应用入口文件src/main.js中注册子应用。
import Vue from "vue"
import App from "./App.vue"
import Router from 'vue-router'
import router from "./router"
import { registerMicroApps, start } from "qiankun"

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

new Vue({
    router,
    render: h => h(App),
}).$mount('#app');

// 在主应用中注册子应用
registerMicroApps([
    {
        name: "vue app",
        entry: "//localhost:8083",	// 重点8:对应重点6
        container: '#vue',			// 重点9:对应重点2
        activeRule: '/vue'			// 重点10:对应重点4
    }]
);
// 启动
start();

2. 子应用配置【qiankun-vue-child】

  1. 在src目录新增public-path.js,内容如下:
if (window.__POWERED_BY_QIANKUN__) {
    // eslint-disable-next-line no-undef
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}
  1. main.js中配置如下:
import Vue from 'vue';
import App from './App.vue'
import Router from 'vue-router'
import router from "./router/index"

// new Vue({
//   router,
//   render: h => h(App),
// }).$mount('#app')

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

let instance = null;
function render( props = {}) {
    const { container } = props;
    instance = new Vue({
        router,
        render: h => h(App),
    }).$mount(container ? container.querySelector('#app'): '#app');  // 为了避免根id#app与其他DOM冲突,需要限制查找范围
}

if (!window.__POWERED_BY_QIANKUN__) {
    render();
}

//--------- 生命周期函数------------//
export async function bootstrap() {
    console.log('[vue] vue app bootstraped');
}
export async function mount(props) {
    console.log('[vue] props from main framework', props);
    render(props);
}
export async function unmount() {
    instance.$destroy();
    instance.$el.innerHTML = '';
    instance = null;
}

说明:子应用的四个周期函数:

  1. bootstrap:bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
  2. mount:应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法。
  3. unmount:应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例。
  4. update:可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效。

在本地启动qiankun-mainqiankun-vue-child之后,浏览器打开本地http://localhost:8085/vue/child,结果如下:
结果3

附加

  1. 设置默认启动子应用,与子应用activeRule设置的值一样。
    结果:当打开qiankun-main主页面,默认为/vue系统的主页面。
- import { registerMicroApps, start } from "qiankun"
+ import { registerMicroApps, start, setDefaultMountApp } from "qiankun"
...
+ setDefaultMountApp("/vue");
// 启动
start();
  1. 主应用给子应用传值。
修改1:主应用【qiankun-main】-main.js
// 在注册子应用的时候添加props属性
registerMicroApps([
    {
        name: "vue App",
        entry: "//localhost:8083",
        container: '#vue',
        activeRule: '/vue',
+        props: {
+           appContent: '我是子应用传给主应用的值'
+        }
    }]
);
修改2:子应用【qiankun-vue-child】-main.js
function render(props = {}) {
-    const { container } = props;
+    const {container, appContent} = props;
    instance = new Vue({
        router,
+        data() {
+            return {
+                content: appContent
+            }
+        },
-        render: h => h(App)
+        render(h) {
+            return h(App, {
+                props: {
+                    content: this.content
+                }
+            })
+        }
    }).$mount(container ? container.querySelector('#app') : '#app');  // 为了避免根id#app与其他DOM冲突,需要限制查找范围
}
修改3:子应用【qiankun-vue-child】-App.vue
<template>
  <div class="app">
    {{ content }}
    <router-view />
  </div>
</template>

<script>
export default {
  name: 'App',
  props:{
      content: {
          type: String,
          default: 'child没有接收到main的数据'
      }
  }
}
</script>

结果:
在这里插入图片描述

  • 17
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
vue-element-admin qiankun是将vue-element-admin框架与qiankun前端框架相结合的方案。 vue-element-admin是一个基于Vue.js和Element UI的前端框架,它提供了一套完整的后台管理系统解决方案,包括登录、权限管理、数据展示等功能。它使用了Vue的单文件组件的开发方式,使得代码结构清晰,并且提供了丰富的组件和插件,大大加快了开发速度。同时,它还使用了Element UI组件库,样式美观且易于使用。 而qiankun是一个基于前端架构的开源框架,能够帮助我们将多个独立的前端应用整合到一个统一的页面中。它具有独立性、解耦性和可复用性等特点,可以将不同的前端应用打包成独立的子应用,再通过qiankun的主应用进行管理和展示。 将vue-element-admin与qiankun相结合,可以实现在一个页面中同时展示多个vue-element-admin的实例。这样做的好处是可以将不同模块的前端开发团队独立进行开发和维护,提高开发效率和代码的复用性,同时能够实现整体页面的动态切换和加载,提升用户体验。在使用过程中,qiankun提供了一些API和生命周期钩子函数,方便我们进行子应用之间的通信和数据共享。 总之,vue-element-admin qiankun是将两个优秀的前端框架相结合,能够提供更强大的前端开发和管理能力,可以应对更加复杂的项目需求,提升开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值