qiankun 微前端,基座为vue2,完整配置流程
创作时间:
作者:
@小白创作中心
qiankun 微前端,基座为vue2,完整配置流程
引用
CSDN
1.
https://blog.csdn.net/weixin_45970289/article/details/143000337
本文详细介绍了qiankun微前端框架的配置流程,包括基座和子应用的配置步骤。文章内容详细,包含了具体的代码示例,适合有一定前端开发基础的读者学习参考。
基座配置
创建 Vue 项目
vue create qiankun-main
路由模式要使用 history
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const Index = resolve => require(['@/views/index'], resolve)
const routes = [
{
path: '/',
name: '主页',
component: Index
}
]
const router = new Router({
base: "/", //配合nginx生产发布,https://xxx.com//qiankun-main,具体根据部署动态修改
mode: 'history',//路由模式使用history
routes
})
export default router
添加 qiankun 的插件
npm install qiankun
新建配置文件
在 src 下 创建 micros 文件夹,里面添加两个文件 apps.js和index.js
apps.js 里面
每次添加一个子应用,只需要在 apps 的数组里配置即可
const apps = [
/**
* name: 微应用名称 - 具有唯一性,子应用中 package.json 中的name 唯一值
* entry: 微应用入口 - 通过该地址加载微应用
* container: 微应用挂载节点 - 微应用加载完成后将挂载在该节点上
* activeRule: 微应用触发的路由规则 - 触发路由规则后将加载该微应用
*/
{
name: "qiankun-app1",
entry: "//localhost:8001/qiankun-app1",
container: "#qiankun",
activeRule: "/qiankun-app1"
},
{
name: "qiankun-app2",
entry: "//localhost:8002/qiankun-app2",
container: "#qiankun",
activeRule: "/qiankun-app2"
},
];
export default apps;
index.js里面
import { registerMicroApps, addGlobalUncaughtErrorHandler, start } from "qiankun";
import apps from "./apps";
/**
* @description: 注册微应用
* 第一个参数 - 微应用的注册信息
* 第二个参数 - 全局生命周期钩子
*/
registerMicroApps(apps,
{
beforeLoad: [
app => {
console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);
},
],
beforeMount: [
app => {
console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);
},
],
afterUnmount: [
app => {
console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);
location.reload(true)
},
],
}
);
addGlobalUncaughtErrorHandler((event) => {
const { msg } = event;
if (msg && msg.includes('died in status LOADING_SOURCE_CODE')) {
console.log('加载失败');
}
});
/**
* @description: 导出启动函数
*/
export default start;
main.js 里面配置 最下方
//引入qiankun
import startQiankun from "./micros";
//启动微应用
startQiankun();
vue.config.js里面配置
const { name } = require('./package');
module.exports = {
....,//其他配置
publicPath: `/${name}`,
lintOnSave: false,
devServer: {
port: 8000,
// 关闭主机检查,使微应用可以被 fetch,否则会提示生命周期未注册
// disableHostCheck: true,
// 配置跨域请求头,解决开发环境的跨域问题
headers: {
'Access-Control-Allow-Origin': '*',
},
},
configureWebpack: {
resolve: {
alias: {
'@': resolve('src'),
},
},
output: {
library: `${name}-[name]`,
libraryTarget: 'umd', // 把微应用打包成 umd 库格式
// jsonpFunction: `webpackJsonp_${name}`, //webpack5废弃jsonpFunction
chunkLoadingGlobal: `webpackJsonp_${name}`,
},
},
}
在 App.vue 中
<template>
<div id="app">
<router-link to="/qiankun-app1">qiankunapp1</router-link><br>
<router-link to="/qiankun-app2">qiankunapp2</router-link><br>
<!-- 用来显示子应用的页面 -->
<div id="qiankun"></div>
</div>
</template>
子应用配置
创建项目
vue create qiankun-app
路由 router 设置
const router = new Router({
base: '/qiankun-app1', // 如果作为乾坤的子应用则使用主应用中配置的路由前缀,如果是独立运行则使用根目录
mode: 'history',
routes //路由列表
})
添加配置文件 public-path.js
在 src 目录下 和main.js 同级
里面内容
// 1.修改运行时的public-path 主要解决的是微应用动态载入的 脚本、样式、图片 等地址不正确的问题。
if (window.__POWERED_BY_QIANKUN__) {
//2.读取 package.json中的 name 属性
const { name } = require('../package.json');
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + name+'/';
console.log('__webpack_public_path__', __webpack_public_path__)
}
main .js修改
import Vue from 'vue'
import App from './App.vue'
import router from "./router";
Vue.config.productionTip = false
let instance = null;
// 重新包装render方法
function render(props = {}) {
const { container } = props;
const renderContainer = container ? container.querySelector('#app') : '#app'; // 如果是作为子应用渲染,则渲染到主应用中配置的DOM节点中
console.log('renderContainer', renderContainer)
instance = new Vue({
router,
render: h => h(App)
}).$mount(renderContainer);
}
//引入乾坤加载路径
import './public-path';
// 独立运行时直接渲染
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;
}
配置 vue.config.js文件
const { name } = require('./package');
module.exports ={
...,//其他配置
publicPath: `/${name}`,
lintOnSave: false,
devServer: {
port: 8001,
// 关闭主机检查,使微应用可以被 fetch,否则会提示生命周期未注册
// disableHostCheck: true,
// 配置跨域请求头,解决开发环境的跨域问题
headers: {
'Access-Control-Allow-Origin': '*',
},
},
configureWebpack: {
resolve: {
alias: {
'@': resolve('src'),
},
},
output: {
library: `${name}-[name]`,
libraryTarget: 'umd', // 把微应用打包成 umd 库格式
// jsonpFunction: `webpackJsonp_${name}`, //webpack5废弃jsonpFunction
chunkLoadingGlobal: `webpackJsonp_${name}`,
},
},
}
热门推荐
揭开AI处理器的神秘面纱:CPU、GPU和NPU谁主沉浮?
雪茄焦油含量比烟多吗
商业贷款利率哪个银行低:法律视角下的比较与分析
DR、CT、MRI影像检查的区别与应用场景
“追光”而行 竞逐“硬科技”赛道——陕西布局光子产业链加快发展新质生产力
在0租金的“富人区桥洞”摆摊,每月可以赚多少钱?
你是怎么被糖尿病盯上的?2个关键指标要警惕
考驾照C1与C2,自动挡和都能开的,该如何抉择?到底是考哪个好?
色彩搭配指南:如何运用颜色创造和谐视觉效果
合同履约保证金退还程序解析
履约保证金什么时候可以退回?法律依据、退还条件与风险防范
新能源汽车充电费用详解:构成、影响因素与省钱攻略
在熊市中幸存的四条策略
大麦网抢票教程(附步骤图解)
加油站允许用桶加油的条件是什么?满足这些条件的方法有哪些?
艾灸机器人在改善睡眠质量方面的研究进展
配网行波故障预警与定位装置的优化措施
手动挡如何避免行驶中的顿挫感?怎样判断和解决顿挫问题?
香港注册公司条例:全面解读香港公司注册的法律规定
想种三叶草草坪?先看利弊!
换身份证旧身份证要回收吗?解答身份证更换相关问题
时机管理:提升个人与团队执行力的策略
初三化学怎么学好 初中化学有效的学习方法
华为研发大牛加盟上海交大,担任助理教授、博导
缤纷色彩:一个充满创意的室内装修案例
北京幼儿园食堂厨房设备布局优化:营造温馨就餐环境
一切從秀吉的死開始:考察一戰定天下的「關原之戰」(上)
网络诈骗举报平台:构建防范与打击网络诈骗的重要法治工具
中国“民参军”企业现状深度剖析
社情民意|省部共管,提升红碱淖湿地生态环境质量