微前端——使用qiankun构建多技术栈微前端架构
ccwgpt 2024-10-12 02:46 29 浏览 0 评论
前言
随着微服务的兴起,后端在这一方面有了很好的解决方案。前端目前流行的就是使用qiankun去构建微前端架构。
什么是qiankun
Qiankun:基于Single-Spa,阿里系开源微前端框架。具有以下特点:
简单——任意 js 框架均可使用。微应用接入像使用接入一个 iframe 系统一样简单,但实际不是 iframe。
完备——几乎包含所有构建微前端系统时所需要的基本能力,如 样式隔离、js 沙箱、预加载等。
生产可用——已在蚂蚁内外经受过足够大量的线上系统的考验及打磨,健壮性值得信赖。
构建基础应用
今天我们将会使用Vue项目作为基座,来联合Vue和React的两个子应用来构建一个微前端架构体系。为方便大家理解,下面我整理了架构图:
需要构建的三个应用分别是Vue主应用(qk-base)、Vue子应用(qk-vue)、React子应用(qk-react)。
// Vue主应用(基座)
vue create qk-base
// Vue子应用
vue create qk-vue
// react子应用
npx create react-app qk-react
创建完成后文件夹中就会有以下三个项目:
主应用(基座)配置
菜单和样式配置
为更方便展示应用的切换我们对主应用的首页进行配置,使用element-ui的菜单对其进行优化展示。使其可以通过切换来显示不同的应用信息。
安装elementUi
npm i element-ui -S
// main.js
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
App.vue
<el-menu :router="true" class="el-menu-demo" mode="horizontal" >
<el-menu-item index="/">主应用页面</el-menu-item>
<el-menu-item index="/vue">Vue应用</el-menu-item>
<el-menu-item index="/react">react应用</el-menu-item>
</el-menu>
<router-view></router-view>
<!-- 加载VUE子应用 -->
<div id="vue"></div>
<!-- 加载React子应用 -->
<div id="react"></div>
在这里,我们设定Vue子引用的路径开头为'/vue',React子应用的开头为'/react'。并使用id="vue"和id="react"两个div来接收他们。
值得一提的是,主应用的路由也可以通过router-view来进行路由切换。
主应用qiankun配置
安装qiankun
yarn add qiankun # 或者 npm i qiankun -S
引入qiankun
main.js
import { registerMicroApps, start } from 'qiankun';
// ...
let apps = [
{
name: 'vue faxian', // 子应用名称
entry: '//localhost:10000', // 默认会加载这个html解析里面的js动态的执行,因为请求了资源子应用需要支持跨域
container: '#vue', // 挂在到那个节点上
activeRule: '/vue', // 访问某个URL的时候将这个端口号挂在到这个上去
},
{
name: 'react exam',
entry: '//localhost:20000',
container: '#react',
activeRule: '/react',
},
];
registerMicroApps(apps); // 注册应用
start({
prefetch: false // 取消预加载
}); // 开启
我们分别使用 10000和 20000端口去分别监听Vue和React两个子应用。
子应用Vue配置
在子应用中必须要三个函数(必须是promise的):bootstrap()、mount()、unmount()。我们这里使用async函数将其导出。
main.js
// 子组件协议
/**
* 启动时
*
*/
export async function bootstrap(){}
/**
* 创建时
* @param {*} props 父应用传过来的数据
*/
export async function mount(props){
render(props)
}
/**
* 卸载时
*/
export async function unmount(){
instance.$destroy();
instance.$el.innerHTML = "";
instance = null;
}
我们需要更新子应用路由的一些配置,包括设置根目录和调为history模式:
router/index.js
// your router config ...
const router = new VueRouter({
mode: 'history', // 设置路由模式为history
base:'/vue', // 设置根目录为 /vue
routes
})
export default router;
设置创建vue实例的方法 render(),这里是挂载到自己的html中,基座会拿到这个挂载后的html将其插入进去。
main.js
function render(){
instance = new Vue({
router,
// store // 也可以传递父应用的vuex
render: h => h(App),
}).$mount('#app') // 这里是挂载到自己的html中,.基座会拿到这个挂载后的html将其插入进去
}
当然我们需要独立运行时也能正常运行,qiankun提供一个参数__POWERED_BY_QIANKUN__来判断是不是在独立运行:
main.js
// 使用 webpack 运行时 publicPath 配置
if(window.__POWERED_BY_QIANKUN__){ // 动态添加public_path
// eslint-disable-next-line no-undef
__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
// 独立运行微应用
if (!window.__POWERED_BY_QIANKUN__) { // 默认独立运行
render();
}
最后我们配置上打包就可以了。
vue.config.js
module.exports = {
devServer:{
port:10000, // 启用10000端口来监听
headers:{
'Access-Control-Allow-origin':'*' // 配置本地运行时允许跨域
}
},
configureWebpack:{
output:{
library: 'vueApp',
libraryTarget: 'umd'
}
}
}
运行后的结果:
子应用React配置
想要配置React项目,我们首先要重写配置文件。这边我们借助react-app-rewired将我们的React配置进行变线(注意是把线路改变不是变现)。
yarn add react-app-rewired
更改我们的启动项,将原来的react-scripts改为react-app-rewired:
package.json
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-app-rewired eject"
}
在根目录中建立配置文件config-overrides.js
config-overrides.js
module.exports = {
webpack:(config)=> {
config.output.library = 'reactApp'; // 打包的类库,项目名称
config.output.libraryTarget = 'umd';
config.output.publicPath = 'http://localhost:20000/'; // 端口
return config;
},
devServer:(configFunction)=>{
return function(proxy,allowedHost){
const config = configFunction(proxy,allowedHost);
config.headers = {
'Access-Control-Allow-origin':'*' // 配置都允许跨域
}
return config;
}
}
}
建立配置文件.env配置完成端口号
.env
PORT = 20000
WDS_SOCKET_PORT= 20000
和上面的项目一样我们需要导出固定名称的三个方法:bootstrap()、mount()、unmount()。
src/index.js
// 子组件协议
/**
* 启动时
*
*/
export async function bootstrap(){}
/**
* 创建时
* @param {*} props
*/
export async function mount(props){
render(props)
}
/**
* 卸载时
* @param {*} props
*/
export async function unmount(){
ReactDOM.unmountComponentAtNode(document.getElementById('root'));
}
封装一个render(),本地运行时候进行判断,使其可以独立运行。
src/index.js
function render(){
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
}
// 独立运行微应用
if (!window.__POWERED_BY_QIANKUN__) { // 默认独立运行
render();
}
然后我们配置ReactRouter
安装router
yarn add react-router-dom
这边简单的配置router和页面
function App() {
return (
<BrowserRouter basename='/react'>
<Link to='/'>首页</Link>
<Link to='/about'>关于页面</Link>
<Route path='/' exact render={() => <div className="App">首页</div>}></Route>
<Route path='/about' exact render={() => <div className="App">关于页面</div>}></Route>
</BrowserRouter>
);
}
export default App;
yarn start 后就发现开始运行读取我们自己的配置文件了
最终效果:
数据通信
比方说我们现在需要将主应用的用户信息同步到子应用中。
我们可以通过配置主应用的main.js来传递参数,当然这里可以以是vuex或者redux
在子应用的mount方法中去接收这个参数
qk-vue main.js
export async function mount(props){
if(props?.userInfo){
console.log(props.userInfo)
// 设置主应用过来的参数
window.sessionStorage.setItem('userInfo',props.userInfo);
}
render(props)
}
- 上一篇:大型项目前端架构浅谈(8000字原创)
- 下一篇:前端负责人列的一份前端知识架构图
相关推荐
- 详解DNFSB2毒王的各种改动以及大概的加点框架
-
首先附上改动部分,然后逐项分析第一个,毒攻掌握技能意思是力量智力差距超过15%的话差距会被强行缩小到15%,差距不到15%则无效。举例:2000力量,1650智力,2000*0.85=1700,则智力...
- 通篇干货!纵观 PolarDB-X 并行计算框架
-
作者:玄弟七锋PolarDB-X面向HTAP的混合执行器一文详细说明了PolarDB-X执行器设计的初衷,其初衷一直是致力于为PolarDB-X注入并行计算的能力,兼顾TP和AP场景,逐渐...
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
-
梦晨发自凹非寺量子位|公众号QbitAI字节最新深度思考模型,在数学、代码等多项推理任务中超过DeepSeek-R1了?而且参数规模更小。同样是MoE架构,字节新模型Seed-Thinkin...
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
-
作者|赵骁勇阿里巴巴智能引擎事业部审校|刘侃,KittyRTP-LLM是阿里巴巴大模型预测团队开发的高性能LLM推理加速引擎。它在阿里巴巴集团内广泛应用,支撑着淘宝、天猫、高德、饿...
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
-
校园系统通常是为学校、学生和教职工提供便捷的数字化管理工具。综合性社交大学校园小程序源码:同城校园小程序-大学校园圈子创业分享,校园趣事,同校跑腿交友综合性论坛。小程序系统基于TP6+Uni-app...
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
-
婚恋交友系统-打造您的专属婚恋交友平台系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包...
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
-
COMET团队投稿量子位|公众号QbitAI字节对MoE模型训练成本再砍一刀,成本可节省40%!刚刚,豆包大模型团队在GitHub上开源了叫做COMET的MoE优化技术。COMET已应用于字节...
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
-
2025年2月19日,美国通用电气航空航天公司(隶属于通用电气公司)宣布,已经完成了“下一代自适应推进系统”(NGAP)计划下提供的XA102自适应变循环发动机的详细设计审查阶段。XA102是通用电气...
- tpxm-19双相钢材质(双相钢f60材质)
-
TPXM-19双相钢是一种特殊的钢材,其独特的化学成分、机械性能以及广泛的应用场景使其在各行业中占有独特的地位。以下是对TPXM-19双相钢的详细介绍。**化学成分**TPXM-19双相钢的主要化学成...
- thinkphp6里怎么给layui数据表格输送数据接口
-
layui官网已经下架了,但是产品还是可以使用。今天一个朋友问我怎么给layui数据表格发送数据接口,当然他是学前端的,后端不怎么懂,自学了tp框架问我怎么调用。其实官方文档上就有相应的数据格式,js...
- 完美可用的全媒体广告精准营销服务平台PHP源码
-
今天测试了一套php开发的企业网站展示平台,还是非常不错的,下面来给大家说一下这套系统。1、系统架构这是一套基于ThinkPHP框架开发的HTML5响应式全媒体广告精准营销服务平台PHP源码。现在基于...
- 一对一源码开发,九大方面完善基础架构
-
以往的直播大多数都是一对多进行直播社交,弊端在于不能满足到每个用户的需求,会降低软件的体验感。伴随着用户需求量的增加,一对一直播源码开始出现。一个完整的一对一直播流程即主播发起直播→观看进入房间观看→...
- Int J Biol Macromol .|交联酶聚集体在分级共价有机骨架上的固定化:用于卤代醇不对称合成的高稳定酶纳米反应器
-
大家好,今天推送的文章发表在InternationalJournalofBiologicalMacromolecules上的“Immobilizationofcross-linkeden...
- 【推荐】一款开源免费的 ChatGPT 聊天管理系统,支持PC、H5等多端
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍GPTCMS是一款开源且免费(基于GPL-3.0协议开源)的ChatGPT聊天管理系统,它基于先进的GPT...
- 高性能计算(HPC)分布式训练:训练框架、混合精度、计算图优化
-
在深度学习模型愈发庞大的今天,分布式训练、高效计算和资源优化已成为AI开发者的必修课。本文将从数据并行vs模型并行、主流训练框架(如PyTorchDDP、DeepSpeed)、混合精度训练(...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 详解DNFSB2毒王的各种改动以及大概的加点框架
- 通篇干货!纵观 PolarDB-X 并行计算框架
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
- tpxm-19双相钢材质(双相钢f60材质)
- thinkphp6里怎么给layui数据表格输送数据接口
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)