从零搭建一个qiankun微前端demo #97
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
了解微前端的起因是因为我公司的大多数页面都是手机h5,分散且基本毫无关联,每次新页面都开一个二级域名,很难管理,所以研究了微前端,虽然很久以前就听过,拖延让我直到有需要才去自己学习
本文初探
qiankun
,并且搭建一个可以跑的基础demo
,仓库地址前言
微前端是什么呢?按照
qiankun
文档中的一段摘录我的理解是,微前端可以将多个关联性不强,不同项目的子应用合体在一个项目里,并且与技术栈无关,在同一个页面可以同时显示
React
、Vue
、jQuery
的项目那么
qiankun
是什么呢?qiankun
是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统由于是国内开源的项目,文档也是中文,自然学习
qiankun
也是最友好的qiankun使用的两种方式
qiankun
后使用umijs
的plugin-qiankun
第一种方式,对主应用和子应用都没有要求,只要安装了
qiankun
并且照着文档配置好,就能跑通,但是需要配置的东西要多一点第二种方式,主应用需要为
umijs
的项目,子应用如果也为umijs
的项目,则配置非常简单,并且有额外的功能,比如跨应用的React hook
来共享数据所以,这两种方式,都探索一番
在普通项目中使用qiankun
普通项目并不需要是框架项目,仅仅一个
js
,一个html
都可以的主应用
主应用安装qiankun
在主应用的
html
里增加一个id为root
的div主应用的
js
文件中写上qiankun
的配置子应用
这里的子应用使用
create-react-app
的项目修改
webpack
配置由于要修改
webpack
的配置,在不eject
的情况下需要安装react-app-rewired
来修改配置修改
pageage.json
中的scripts
增加react-app-rewired配置文件
根目录增加
react-app-rewired
的配置文件config-overrides.js
修改挂载元素id
修改页面挂载元素
id
,因为主应用占用了root
这个id
public/index.html
修改子应用入口文件
src/index.jsx
增加
render
函数添加
qiankun
生命周期钩子访问主应用地址
localhost:8080
,是主应用,访问localhost:8080/app2
是create-react-app
的子应用,如果子应用有路由也可以直接访问,如localhost:8000/app2/page1
在umijs中使用qiankun
umijs
中,只需要主应用添加对应的插件plugin-qiankun
主应用
安装 plugin-qiankun
新增 document.ejs
新建
src/pages/document.ejs
,umi 约定如果这个文件存在,会作为默认模板这一步主要是需要增加一个额外的
div
元素来放置子应用,在plugin-qiankun
中默认子应用挂载在root-subapp
,如果没有这个元素会报错修改配置 .umirc.ts
子应用
umijs
子应用就非常简单了,只需要修改.umirc.ts
就行了全局共享数据
在普通
qiankun
和umijs
中又不相同了普通qiankun项目
普通
qiankun
可以通过initGlobalState
方法来定义主应用
子应用
umijs
的子应用钩子函数需要定义在src/app.js
由于方法和事件只在钩子函数里有,我觉得可以在
mount
的时候注册一个像event bus
这样的方法来供全局调用修改函数umijs的qiankun项目
plugin-umi
提供了一个比较方便的React hook
来全局调用主应用
约定主应用中在
src/rootExports.js
里export
内容子应用
需要注意的是,如果这里子应用单独运行或者是主应用的
qiankun
不基于umijs
,这个钩子会报错的,需要自己做好判断直接通过配置传递
子应用在生命周期钩子函数中的参数可以拿到
props
的内容在
qiankun
中这个配置是可以动态加载的,本文只探索了固定配置本文完整demo仓库地址
Beta Was this translation helpful? Give feedback.
All reactions