微前端(qiankun)
什么是微前端
微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。、
微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。这类问题在企业级 Web 应用中尤其常见。
微前端架构具备以下几个核心价值:
- 技术栈无关
主框架不限制接入应用的技术栈,微应用具备完全自主权 - 独立开发、独立部署
微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新 - 增量升级
在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略 - 独立运行时
每个微应用之间状态隔离,运行时状态不共享
qiankun - 一套完整的微前端解决方案
- 基于 single-spa 封装,提供了更加开箱即用的 API。
- 技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架。
- HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单。
- 样式隔离,确保微应用之间样式互相不干扰。
- JS 沙箱,确保微应用之间 全局变量/事件 不冲突。
- 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度。
搭建微前端项目
主应用
主应用与技术栈无关,我们可以使用Vue、React、Angular、JQuery甚至ES5语法进行搭建。主应用的目的如下:
- 注册微应用;
- 为每个微应用提供dom容器;
- 启动主应用;
下面我是以vue为主应用一步一步进行讲解,先使用vue-cli3构建项目。
1.安装qiankun
$ npm install qiankun
2.注册微应用
在入口文件main.js中添加如下代码:
import { registerMicroApps, start, setDefaultMountApp } from 'qiankun'
//注册应用
registerMicroApps([{name: "vue2App",props: { age: 10 }, //给子应用传数据entry: "//localhost:3001", //默认会加载这个html,解析里面的js,动态执行(子应用必须支持跨域)里面,是用fetch去请求的数据container: "#out-main", //挂载到主应用的哪个元素下activeRule: "/vue2", //当我劫持到路由地址为/vue2时,我就把http://localhost:3000这个应用挂载到#app-main的元素下},{name: "vue3App",entry: "//localhost:3002",// entry: { scripts: ["//localhost:7100/main.js"] },container: "#out-main",activeRule: "/vue3",},
]);//step3 设置默认进入微应用
//setDefaultMountApp('/vue3')//开启
start();
微应用
微应用不用额外安装qiankun即可接入主应用,大致分为下面几个步骤:
- 入口js文件平级目录下增加public-path.js文件;
- 入口js文件中引入public-path.js,修改并导出qiankun定义的三个钩子函数:bootstrap、mount、unmount;
- 使用history路由,并且路由base值要和activeRule匹配规则保持一致;
- 修改webpack配置,允许开发环境跨域及umd打包;
下面我们以vue cli3作为技术栈构建微应用
在src下增加public-path.js
qiankun 将会在微应用 bootstrap 之前注入一个运行时的 publicPath 变量,你需要做的是在微应用的 entry js 的顶部添加如下代码
if (window.__POWERED_BY_QIANKUN__) {__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
关于运行时 publicPath 的技术细节,可以参考 webpack 文档。
runtime publicPath 主要解决的是微应用动态载入的 脚本、样式、图片 等地址不正确的问题。
修改入口文件main.js
let instance = null;
function render(props = {}) {const { container } = props;window.props = props;//会把这个应用(也就是这个界面),插入到主应用的container的元素中去instance = new Vue({router,render: (h) => h(App),}).$mount(container ? container.querySelector("#app") : "#app"); //这里是挂载到自己的html中,主应用会拿到这个挂载的html,将其插入到主应用中
}// 独立运行时
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;
}
路由配置
import Vue from "vue";
import VueRouter from "vue-router";Vue.use(VueRouter);/* Layout */export const routes = [{path: "/",redirect: "/list",},{path: "/list",component: () => import("@/views/protocol/index"),},
];
const router = new VueRouter({base: "vue2",mode: "history",routes,
});
export default router;
配置webpack 在vue.config.js
module.exports = {lintOnSave: false,devServer: {port: "3001",headers: {"Access-Control-Allow-Origin": "*", //所有人都可以访问我的服务器},},configureWebpack: {output: {// library: `${name}-[name]`,library: `vue2App`,libraryTarget: "umd", // 把微应用打包成 umd 库格式// jsonpFunction: `webpackJsonp_${name}`,},},
};
下面我们以vue3作为技术栈构建微应用
在src下增加public-path.js
if (window.__POWERED_BY_QIANKUN__) {__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
修改入口文件main.js
let instance = null;
function render(props = {}) {if (instance) return;const { container } = props;instance = createApp(App).use(store).use(router).mount(container ? container.querySelector("#app") : "#app");
}// 独立运行时
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 = null;
}
路由配置
import { createRouter, createWebHistory } from "vue-router";const routes = [{path: "/",redirect: "/home",},{path: "/home",component: () => import("../views/Home.vue"),},
];const router = createRouter({history: createWebHistory("/vue3"),routes,
});export default router;
配置webpack 在vue.config.js
// const { name } = require("./package");
module.exports = {lintOnSave: false,devServer: {port: "3002",headers: {"Access-Control-Allow-Origin": "*", //所有人都可以访问我的服务器},},configureWebpack: {output: {// library: `${name}-[name]`,library: `vue3App`,libraryTarget: "umd", // 把微应用打包成 umd 库格式// jsonpFunction: `webpackJsonp_${name}`,},},
};
微前端(qiankun)相关推荐
- qiankun 传统项目配置_微前端 qiankun 项目实践
原标题:微前端 qiankun 项目实践 作者:zxh1307 https://juejin.im/post/5ea55417e51d4546e347fda9 导语 最近在做微前端的项目 , 过程中真 ...
- 基于微前端qiankun的多页签缓存方案实践
作者:vivo 互联网前端团队- Tang Xiao 本文梳理了基于阿里开源微前端框架qiankun,实现多页签及子应用缓存的方案,同时还类比了多个不同方案之间的区别及优劣势,为使用微前端进行多页签开 ...
- 微前端qiankun 问题
微前端qiankun 遇到问题,连接子应用之后报错 We're sorry but micro-front-web3 doesn't work properly without JavaScript ...
- py获取前端的参数_微前端 qiankun 项目实践
(给前端大全加星标,提升前端技能) 作者:zxh1307 https://juejin.im/post/5ea55417e51d4546e347fda9 导语 最近在做微前端的项目 , 过程中真是踩了 ...
- 微前端 - qiankun
前言 qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单.无痛的构建一个生产可用微前端架构系统. 本文主要记录下如何接入 qiankun 微前端.主应用使用 vue ...
- 微前端qiankun从搭建到部署的实践
最近负责的新项目用到了qiankun,写篇文章分享下实战中遇到的一些问题和思考. 示例代码: github.com/fengxianqi/-. 在线demo:qiankun.fengxianqi.co ...
- 微前端qiankun使用+踩坑
背景 项目使用qiankun 改造的背景: 项目A.项目B.项目C: 项目A和项目B具有清晰的服务边界,从服务类型的角度能够分为两个项目. 在公司项目一体化的背景下,所有的项目又应该是一个项目. 项目 ...
- 微前端 - qiankun 应用间通信
前言 上篇主要记录了如果使用 qiankun,本文记录下 qiankun 应用间如何通信. 一.如何划分子应用 在微前端架构中,我们应该按业务划分出对应的子应用,而不是通过功能模块划分子应用.主要原因 ...
- 微前端-qiankun
概念 使用框架:qiankun 介绍: qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单.无痛的构建一个生产可用微前端架构系统. qiankun官网:Go 当使用 ...
- 微前端qiankun 子应用使用阿里字体图标不显示
微前端打包部署后,子应用的iconfont的字体图标显示报错, 原因:打包后请求字体的路径是获取主应用下面的文件 解决方案:将字体图标打包成base64显示 // 打包成base64config.mo ...
最新文章
- 添加Net4CollectionTypeFactory的原因
- Dapper 中使用sql in 关键字查询
- FastDFS+Nginx实现文件服务器
- Keras TensorFlow 混编中 trainable=False设置无效
- 15.分布式文档系统-document id的手动指定与自动生成两种方式解析
- 2021-08-13servlet 原理及注意事项
- 第十一届蓝桥杯物联网设计与开发实验(合集)STM32学习
- 车载一体机凯立德导航升级
- 腾讯通信云服务端使用心得,腾讯云IM
- Windows server 2012修改输入法
- Netstat -tln 命令是Linux查看端口使用情况
- foxmail远程主机强迫关闭了一个现有的连接
- MacOS英文版Google浏览器添加印象笔记剪藏插件
- 大数据学习路线(完整详细版)
- MyBatis中的resultMap两个association
- Linux命令学习笔记(一)目录操作
- ios swift UIActivityIndicatorView 菊花 加载中...
- 普度网络营销策划_普度网络营销策划:中小企业线上营销沙龙成功举办
- 把一个表格里的数据添加到另一个表格并且去重
- 《偶像练习生》、《创造101》现象级的爆发还能在中国出现吗?【文末有彩蛋】...
热门文章
- 【前沿技术RPA】 一文了解UiPath的代码审查工具Workflow Analyzer
- 直播预告 | 北京大学、北京航空航天大学、阿里巴巴、小米的四位讲者来啦!...
- 查看静态库、动态库使用的gcc版本
- 力扣 827. 最大人工岛
- 「Kafka核心源码剖析系列」4. 走进Kafka服务端(下)
- 【c语言】判断一个字符串是否包含另一个字符串
- Towards Robust Deep Hiding Under Non-Differentiable Distortions for Practical Blind Watermarking论文阅读
- 虾米音乐与MQA公司达成国内首家合作 将提供MQA音质音源
- linux下x86和arm架构区别
- 坝上草原及闪电湖两日游流水帐:)