万象,2024年新鲜滚热辣的微前端方案

演示地址

chjtx.com/wanxiang/ap...

仓库地址

gitee.com/chenjianlon...

前言

  • 如何理解微前端?独立部署,无感加载,环境隔离?

  • 微前端能解决什么问题?不影响老系统前提下开发新业务享受新技术带来的便利?拆分系统分散到各开发小组方便维护?

  • 目前主流微前端框架 qiankun 是否满足上述所有诉求?

在尝试过用 vite 搭建 qiankun 项目后,我发现几个问题:

  • 1、开发环境下主应用访问不到子应用,即使网上有很多方案,但始终还是做不到 js 沙箱和 css 样式绝对隔离

  • 2、微应用切换时依然是加载所有资源,并不会比刷新页面加载的资源少

既然加载的资源不会比刷新页面少,那么我们可不可以直接刷新页面呢?只要首屏资源足够轻量,响应速度足够快,同样可以达到无感切换。我参与过不少用 webpack 搭建的 qiankun 项目,几乎所有项目都是主应用加载菜单,子应用业务内容在右侧主体区域显示的模式。那么换个思路,所以业务应用都优先加载菜单,通过本地缓存记录菜单数据、状态甚至滚动位置,是否就可以达到无感刷新切换应用的效果?而用这种传统的刷新页面方式根本不用考虑 js 、css 被其它应用污染的问题。

对比

方案 乾坤 万象
运行方式 拦截子应用代码,经过转换再挂载到主应用 没有主子应用之分,只有简单的加载公共菜单
沙箱隔离 支持 js、css 沙隔离,但 js 通过 with 限制作用域,css 通过自动添加前缀,转换过程中有性能损耗 天然隔离,无须各种转换,切换应用直接刷新页面,不存在性能损耗
子应用 支持 不支持
更新部署 只有主应用更新时,无须更新子应用 公共菜单更新时,需要更新所有应用
复杂度 主子应用使用相同技术栈比较容易上手,使用不同技术栈样式隔离比较头疼 为了保障菜单加载速度,达到无感刷新效果,使用纯原生技术开发,对维护菜单的开发者技术要求较高
掌控度 遇到bug需要向社区反馈,等待解决方案,自行修改源码难度较高 整体就一个菜单组件的代码量,完全可以自行修改源码
成熟度 蚂蚁内部服务了超过 2000+ 线上应用 新鲜出炉,还没遇到什么坑,理论上应该没什么坑

目录结构

bash 复制代码
--/
  |-- common/  # 公共组件模块
    |-- wanxiang/
  |-- app1/    # 应用1,独立仓库
    |-- package.json
  |-- app2/    # 应用2,独立仓库
    |-- package.json
  |-- package.json
  |-- .gitignore  # 忽略掉 app1 和 app2

如上图目录结构,有3个git仓库,一个公共的,一个 app1,一个 app2

app1 和 app2 都可以通过配置依赖路径别名加载 common 的资源,朴素无华,没有花里胡哨的模块联邦。

多仓库模式能有效解决开发团队的权限问题,同时避免了 git 历史记录洪流。

开始

html 复制代码
<!-- index.html -->
<head></head>
<body>
  <div id="app"></div>
  <!-- 将 main.js 替换为 entry.js -->
  <script src="entry.js"></script>
</body>
js 复制代码
// enrty.js
import { start, setMenus } from 'common/wanxiang/index.js'

start(`#app`, () => {
  // 关键点,显示完主体菜单再加载业务代码
  import('./main.js')

  // 加载菜单数据
  fetch('/menu').then(res => res.json()).then(res => {
    setMenus(res.data)
  })
})

后语

万象不是框架也不是插件,是一种方案,一种管理大规模前端应用的方案,没有具体的标准,根据各自项目需求对公共菜单进行调整,因此每个项目都会有不同的表象,遂取名为"万象"。

相关推荐
开开心心就好2 分钟前
办公软件卸载不干净?专用工具一键清残留
java·前端·人工智能·智能手机·kafka·excel·memcache
静默回滚18 分钟前
图片能显示,画进canvas却空白:像素面积上限
前端
补码缩写18 分钟前
canvas大图内存怎么算:宽×高×4只是第一份
前端
coding漫漫长路22 分钟前
img.decode()报错的图能画,load成功的却是空的
前端
不可能片场25 分钟前
AI视频首尾帧控制 用参考图定住镜头
前端·electron
修炼的dance29 分钟前
canvas最大能开多大:先看面积,再看导出格式
前端
薛一半41 分钟前
React-Redux核心原理与容器组件实战
前端·javascript·react.js
做运维的阿瑞41 分钟前
自连接、交叉连接与复杂 JOIN:一条问题链讲透
前端·数据库·mysql
言乐61 小时前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript
回眸&啤酒鸭1 小时前
DeepSeek V4.1 Flash 批量处理实战指南
服务器·前端·javascript