手写 qiankun 微前端框架
手写 qiankun 微前端框架_哔哩哔哩_bilibili
why微前端?
为什么要使用微前端架构?
多人协同开发,解决巨石应用。
把庞大应用分块处理,划分为多个子应用,子应用技术栈无关,独立部署。多个子应用聚合在一起,看起来就是一个完整的应用,用户无感知。
在开发层面来说,不限制技术栈,可以多团队采用不同的技术栈开发,也适合进行渐进式重构升级。
微前端原理
核心逻辑
规则匹配 ⇒ 获取资源 ⇒ 渲染到容器
1 | // 注册子应用,微前端运行原理和 SPA单页应用非常相似,SPA注册路由与注册子应用概念类似。 |
主子应用出口
主子应用有不同的接入口
子应用如何接入主应用?
导出三个必要的生命周期钩子函数
bootstrap
渲染之前,做一些初始化mount
渲染函数, 一般挂载到 子应用入口 => #app 节点上unmount
卸载函数,清理工作;注意:生命周期函数必须返回 Promise
1 |
|
子应用也可以独立运行
通过qiankun提供的全局变量判断,此时挂载到的节点是 body ⇒ #app
子应用的配置
子应用应允许跨域,允许 CORS 跨域
1
2
3
4
5
6// vue.config.js
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
},
},
2. 子应用必须打包出一个库文件,文件格式必须是umd
主应用需要加载子应用资源,子应用js要在主应用运行,必须要得兼容模块格式为umd
<aside>
💡 [*UMD](https://link.zhihu.com/?target=https%3A//github.com/umdjs/umd) — 另外一个模块化系统,建议作为通用的模块化系统,它与 AMD 和 CommonJS 都是兼容的。*
</aside>
1
2
3
4
5
6
7
8
configureWebpack: {
output: {
// 把子应用打包成 umd 库格式
library: `${name}-[name]`,
libraryTarget: 'umd',
jsonpFunction: `webpackJsonp_${name}`, // jsonp的方式加载子应用资源
},
},
![**umd.js 兼容CommonJs、ADM模块规范,如果都不匹配,挂载到window全局对象上**](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/9b75797a-173f-46c1-b247-dc678c488932/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220624%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220624T064536Z&X-Amz-Expires=86400&X-Amz-Signature=8695db39a224f753eab5f1e657bc93851c9761d1c3532c8e0df909f0e826af76&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject)
**umd.js 兼容CommonJs、ADM模块规范,如果都不匹配,挂载到window全局对象上**
![**通过window对象可以获取到子应用的生命周期方法;**](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/314da44f-fbe7-465f-8f99-2abff8ecb44a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220624%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220624T064517Z&X-Amz-Expires=86400&X-Amz-Signature=a577f36c99bde81f446626783cb713979af5710ae0357753f2a33401dd77e411&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject)
**通过window对象可以获取到子应用的生命周期方法;**
手写qiankun源码
https://github.com/lyctea/qiankun-demo
css沙箱
- showdom
- 样式范围前缀
javascript 沙箱
微前端部署
微前端通信原理
了解微前端基本基础运作机制及实现原理
1、注册子应用
2、监听路由变化
3、匹配子应用
4、加载子应用
5、渲染子应用
实现基本的子应用渲染 待完成 css沙箱。js沙箱,数据监听
一、注册子路由
1、注册子应用的入口路由,容器、及匹配路由来获取
1 | interface app { |
二、监听路由变化
1、hash路由:window.onhashchage
2、history路由: history.go history.back history.forward 使用window.onpopstate,
pushState, replaceState 使用函数重写来进行,监听劫持
1 | import { handleRouter } from './handle-router'; |
三、匹配子应用
1、获取当前路由路径 window.location.pathname,获取注册应用
1 | import { getApp } from '.'; |
四 、加载子应用资源
1 | const htmlEntry = async (url) => { |
五 、渲染子应用
1、子应用打包模式为umd,在执行完后将结果挂载到window上
2、更灵活的获取子应用对象 手动构造一个common js环境让子应用挂载
1 | async function execScript() { |