前端架构成长之路——微前端系列(二)之qiankun框架实战

简介: 用微前端架构去对某个古老项目进行框架升级

背景


之前有写过专门一篇关于微前端架构的基础知识——《前端架构成长之路——微前端架构理论篇》,但是里面主要讲几个点:

  • 微前端是什么,具体能做些什么
  • 微前端的一些主流框架
  • 微前端拆分项目的一些原则


那么其实对于微前端应用还是有些不太清楚,下面就用微前端架构去对某个古老项目进行框架升级,这其实也是微前端架构主要特性之一,对项目升级的方案之一。


在使用 qiankun  框架之前,脑子里有几个疑问:

  • qiankun 是怎么做到将不同框架的项目放在一起,是通过打包,还是其他方式:
  • qiankun 是有1个主基座 + N 个微应用
  • qiankun 利用路由控制,去加载不同的微应用,微应用与主应用之间消除跨域问题
  • qiankun 需要在子应用里加入生命周期钩子函数提供给主应用调用


搞明白后,我们就可以开始进行项目实战,

项目实战


由于本次是将老项目升级到新版本框架中,因此将采用 Monorepo 架构对新老项目进行统一管理。项目结构大概 如下所示:

qiankun-demo
├── apps # 应用层
|  ├── main #  基座项目
|  |  ├── ...
|  ├── old #  老版项目
|  |  ├── ...
|  └── new #  新版项目
|     ├── ...
├── README.md
├── nx.json #  nx.js 管理Monorepo
├── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml

main-基座项目


qiankun 的基座项目和普通 web 项目初始化没有什么区别,你可以基于 React  或  Vue 作为基座项目框架都可以,但是需要入口文件需要做一下调整,下面我以 Vue+Vite 项目为例:

步骤一: 初始化项目

npm create vite@latest main-vue -- --template vue
# 添加 qiankun
npm i qiankun -S

步骤二:在main.ts准备好基座项目以及注册微应用

import { createApp } from 'vue'
import { registerMicroApps, start , runAfterFirstMounted, setDefaultMountApp} from 'qiankun';
import './style.css'
import App from './App.vue'
/**
 * Step1 初始化应用
 */
createApp(App).mount('#app')
/**
 * Step2 注册子应用
 */
registerMicroApps(
    [
        {
            name: 'old-web', // 注册后子应用的名字 老项目启动端口为8080
            entry: '//localhost:8080', // 这里可以根据环境变量配置
            container: '#subapp-viewport',
            activeRule: '/old',
        },
        {
            name: 'new-web', // 注册后子应用的名字 新项目启动端口为8090
            entry: '//localhost:8090',
            container: '#subapp-viewport',
            activeRule: '/new',
        },
    ],
    {
        // qiankun 生命周期钩子 - 加载前
        beforeLoad: [
            (app) => {
                console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);
            },
        ],
        beforeMount: [
            (app) => {
                console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);
            },
        ],
        afterMount: [
            (app) => {
                console.log('[LifeCycle] after mount %c%s', 'color: green;', app.name);
            },
        ],
        beforeUnmount: (app) => {
            console.log('[LifeCycle] before Unmount %c%s', 'color: green;', app.name);
        },
        afterUnmount: [
            (app) => {
                console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);
            },
        ],
    },);
/**
 * Step3 设置默认进入的子应用
 */
// setDefaultMountApp('/old');
/**
 * Step4 启动应用
 */
start();
runAfterFirstMounted(() => {
  console.log('[MainApp] first app mounted');
});

microapp-微应用


微应用其实改动代码不多,只是需要将qiankun 所需要的接口(bootstrap, mountunmount) 暴露出来即可

步骤一: 新建 public-path.js 代码如下:

// 主要用来区分 qiankun 加载资源路径
if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

步骤二: 在 app.js 加入qiankun的接口,将 render 函数

var React = require('react')
var ReactDom = require('react-dom')
var ReactRouter2 = require('react-router')
var RouteConfig = require('./config/RouteConfig')
var Utils = require('radmin').Utils
import { createHistory } from 'history'
import './public-path.js'
import ReactRouter, { Router, Route, useRouterHistory } from 'react-router'
var appHistory = useRouterHistory(createHistory)({ queryKey: false });
require('../less/index.less')
/**
 * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap() {
  console.log('[react15] react app bootstraped');
}
export async function mount(props = {}) {
  console.log('[react15] props from main framework', props);
  const { container } = props;
  // 这里判断 container 是否qiankun 携带进来的
  ReactDom.render(<ReactRouter2.Router routes={Utils.combineConfig(RouteConfig)} history={appHistory} />, container ? container.querySelector('#react15Root') : document.getElementById('react15Root'))
}
export async function unmount(props) {
  const { container } = props;
  ReactDOM.unmountComponentAtNode(
    container ? container.querySelector('#react15Root') : document.getElementById('react15Root'),
  );
}
// 独立的时候可自主运行
if (!window.__POWERED_BY_QIANKUN__) {
  bootstrap().then(mount);
}else{
  window.bootstrap = bootstrap;
  window.mount = mount;
}

步骤三: 在webpack.config.js调整打包配置,将 app.js暴露到window中:

var path = require('path')
module.exports = {
    entry: [
        path.resolve(__dirname, './src/js/app')
    ],
    output: {
        path: path.resolve(__dirname, 'hot'),
        filename: 'app.js',
        library: `${packageName}-[name]`,
        libraryTarget: 'umd',
        globalObject: 'window',
        jsonpFunction: `webpackJsonp_${packageName}`,
    }
}

到了这里,基本上就可以完成项目改造工作了,但是后续还需要其他一些改动点,如:

1.基座项目需要切换为真实域名,可以按照构建环境变量去切换

2.微应用需要注意资源使用相对路径

3.针对不同打包工具,都需要将bootstrapmount 函数进行暴露到 window 对象中,因为 qiankun 会拦截代理 window去运行微应用

4.需要解决不同应用之间的登录态等问题

qiankun 的缺陷


虽然 qiankun 使用起来很简单,但是在实际应用还是存在一些缺陷,但是在将其引入到项目中的时候,需要考虑这些点:

  • 对于 jQuery 老项目支持度不够,即使有解决方案,但是需要对 qiankun 整个框架原理深入了解才能明白如何解决
  • 沙箱隔离机制并不完美,如:写 css 代码挂载到 document.body,会导致样式污染
  • 通讯机制较简单,基于一个全局的 globalState 对象,去提供给到各个微应用去使用

参考资料


目录
相关文章
|
10月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
965 1
|
5月前
|
人工智能 JavaScript 前端开发
GenSX (不一样的AI应用框架)架构学习指南
GenSX 是一个基于 TypeScript 的函数式 AI 工作流框架,以“函数组合替代图编排”为核心理念。它通过纯函数组件、自动追踪与断点恢复等特性,让开发者用自然代码构建可追溯、易测试的 LLM 应用。支持多模型集成与插件化扩展,兼具灵活性与工程化优势。
398 6
|
9月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
1245 80
|
11月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
11月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
631 70
|
7月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
650 0
|
11月前
|
JavaScript 前端开发 API
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
2498 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
10月前
|
Java 开发者 Spring
Spring框架 - 深度揭秘Spring框架的基础架构与工作原理
所以,当你进入这个Spring的世界,看似一片混乱,但细看之下,你会发现这里有个牢固的结构支撑,一切皆有可能。不论你要建设的是一座宏大的城堡,还是个小巧的花园,只要你的工具箱里有Spring,你就能轻松搞定。
398 9
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
637 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线

热门文章

最新文章