微前端——使用qiankun构建多技术栈微前端架构
ccwgpt 2024-10-12 02:46 40 浏览 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字原创)
- 下一篇:前端负责人列的一份前端知识架构图
相关推荐
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
-
Epic商店很香,但也有不少抱怨,其中一条是启动游戏太慢。那么,如果让Steam启动Epic游戏,会不会速度更快?众所周知,Steam可以启动非Steam游戏,方法是在客户端左下方点击“添加游戏”,然...
- Docker看这一篇入门就够了(dockerl)
-
安装DockerLinux:$curl-fsSLhttps://get.docker.com-oget-docker.sh$sudoshget-docker.sh注意:如果安装了旧版...
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
-
2016年6月15日,我AY对外发布AYUI(WPF4.0开发)的UI框架,开发时候,你可以无任何影响的去开发PC电脑上的软件exe程序。AYUI兼容XP操作系统,在Win7/8/8.1/10上都顺利...
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
-
浏览器套壳方案,C#和C++有更多,你说的没错,从数量和历史积淀来看,C#和C++确实有不少方式来套壳浏览器,让Web内容在桌面应用里跑起来。但咱们得把这套壳二字掰扯清楚,因为这里面学问可大了!不同的...
- OneCode 核心概念解析——Page(页面)
-
在接触到OneCode最先接触到的就是,Page页面,在低代码引擎中,页面(Page)设计的灵活性是平衡“快速开发”与“复杂需求适配”的关键。以下从架构设计、组件系统、配置能力等维度,解析确...
- React是最后的前端框架吗,为什么这么说的?
-
油管上有一位叫Theo的博主说,React是终极前端框架,为什么这么说呢?让我们来看看其逻辑:这个标题看起来像假的,对吧?React之后明明有无数新框架诞生,凭什么说它是最后一个?我说的“最后一个”不...
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
-
面试官放下简历,手指在桌上敲了三下:"你上次解决的技术难题,现在回头看有什么不足?"眼前的候选人瞬间僵住——这是上周真实发生在蚂蚁金服终面的场景。2025年的前端战场早已不是框架熟练...
- 前端新星崛起!Astro框架能否终结React的霸主地位?
-
引言:当"背着背包的全能选手"遇上"轻装上阵的短跑冠军"如果你是一名前端开发者,2024年的框架之争绝对让你眼花缭乱——一边是React这位"背着全家桶的全能选...
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
-
什么是BFFBFF全称是BackendsForFrontends(服务于前端的后端),起源于2015年SamNewman一篇博客文章《Pattern:BackendsFor...
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
-
在AI技术飞速发展的当下,如何更高效地与大语言模型(LLM)沟通,以获取更准确、更有价值的输出,成为了一个备受关注的问题。谷歌最新发布的《PromptEngineering》白皮书,为这一问题提供了...
- 光的艺术:灯具创意设计(灯光艺术作品展示)
-
本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...
- MoE模型已成新风口,AI基础设施竞速升级
-
机器之心报道编辑:Panda因为基准测试成绩与实际表现相差较大,近期开源的Llama4系列模型正陷入争议的漩涡之中,但有一点却毫无疑问:MoE(混合专家)定然是未来AI大模型的主流范式之一。...
- Meta Spatial SDK重大改进:重塑Horizon OS应用开发格局
-
由文心大模型生成的文章摘要Meta持续深耕SpatialSDK技术生态,提供开自去年9月正式推出以来,Meta持续深耕其SpatialSDK技术生态,通过一系列重大迭代与功能增强,不断革新H...
- "上云"到底是个啥?用"租房"给你讲明白IaaS/PaaS/SaaS的区别
-
半夜三点被机房报警电话惊醒,顶着黑眼圈排查服务器故障——这是十年前互联网公司运维的日常。而现在,程序员小王正敷着面膜刷剧,因为公司的系统全"搬"到了云上。"部署到云上"...
- php宝塔搭建部署thinkphp机械设备响应式企业网站php源码
-
大家好啊,欢迎来到web测评。本期给大家带来一套php开发的机械设备响应式企业网站php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
- Docker看这一篇入门就够了(dockerl)
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
- OneCode 核心概念解析——Page(页面)
- React是最后的前端框架吗,为什么这么说的?
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
- 前端新星崛起!Astro框架能否终结React的霸主地位?
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)