随着产品的迭代,我们的一级菜单高达20项 ,一级菜单下的二级、三级目录更是多达半百。这种TOB
产品在其实在公司核心产线很常见的。

那么如果这个时候我们还用vue
单页面应用开发会面临什么问题呢?
-
- 体积过大 :打包体积可能经过一系列优化,但是由于一个项目太大了引入好多的插件,还是会存在很大的体积问题。
-
- 风险过大:改一个公共业务组件需要好多个模块去验证,因为可能好多个模块使用到了该组件。
-
- 打包过慢:项目体积过大,也预示着打包会很慢。
-
- 代码维护:项目体积过大,预示着代码量非常大,也预示着代码维护成本会很大。(每次迭代后都进行codereview,避免代码过于乱,维护起来过于麻烦)
-
- 首次加载 : 首次加载问题也是需要时刻关注的点。就是上手段后可能还是不可避免加载过多会影响用户体验。
那么我们该如何解决这个问题呢?
我们能使用iframe
的方式,拆分成多个单页面项目,例如一个一级菜单就是一个项目(拆分成20
或者10
个项目,不包含横向的一级菜单 ),一级菜单部分作为一个单独的容器项目。如下图:

主应用(带一级菜单的容器)嵌套各个子应用(各个单页面项目) ,在一级菜单点击的时候,切换iframe子应用 的URL。并且可以在本次存储一个当前iframe URL 作为刷新浏览器的首次加载地址。
上面这么做解决了我们的代码体积过大等的问题,而且开发体验大大提升,不会说由于代码体积过大,热更新 等都反应不过来了。
这么做算是一个微应用 了吗?好像也能算,我需要一个新模块,只需要启动一个单页面应用,然后挂载在主应用上 就行了。
但是呢会存在几个问题:
-
- url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
-
- 全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名都不同的子应用中实现免登效果。
-
- 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程。
-
- UI展示,弹窗等
问题一其实可以解决:
- 子应用的路由跳转可以简单封装下,如果在
iframe
内,所有的跳转操作都通过postMessage来通知基座应用进行跳转。 - 还有如果产品的要求不高可以把一级横向菜单 作为公共组件引入各个子应用中,每次菜单切换做打开新浏览器tab标签。也就不存在
iframe
嵌套的问题了。(缺点:打开新浏览器tab标签,产品会觉得有些割裂)
问题二、
- 其实如果是一个域名服务器下面的都不存在这种问题,通讯其实也不是高频的可以通过
postMessage
来实现。 - 不是一个域下的,有个问题是你都嵌套别的服务了(对别人代码不做改动的情况下,除非你说把别人的前端包部署在自己服务下),打通鉴权体系不管怎么弄都需要做的吧!
问题三、
- 如果你只是纯
iframe
不做任何处理确实是会切换的时候加载资源,会慢,但是你就是使用qiankun
没有配置预加载也是每次切换都要载资源的啊。iframe
预加载无界
中就有实现,等我后面分享细说。
问题四、
-
UI上确实会遇到些问题,比如弹窗 就只是以你
iframe
区域作为容器。会让用户觉得像不是全局居中 样。如果你把弹出层的遮罩透明度 设置为0
(遮罩层其实对产品体验要不要透明的都大差不差), 且你的布局如我前面样图画的那样常景下,就可以利用css: 一级菜单定位在头部,且子应用iframe
高度默认最小盛满整个屏幕,然后在子应用的容器使用margin-top: ***px;
来往下移动实现。 -
其他的样式问题我觉得还是需要看你嵌套的系统在不做改造 的情况下(比如两系统都有横向菜单等等),是不是真的适合你嵌套。
总结
-
1、如果你们的产品形态不是很大(就几个菜单、或者业务就是个增删改查,再或者就是小h5页面),我觉得不用考虑这些微应用多页应用的考虑了,直接
vue
、react
路由就够用了。 -
2、如果你们是全新系统,项目体积很大,并且没有高级技术 人员去能使用
qiankun
或者无界
,那么我觉得iframe
嵌套也是可以的,毕竟成本很低。 -
3、如果你们有高级前端技术人员 能胜任使用
qiankun
或者无界
(配合webpack打包部署),那么我建议你使用qiankun
或者无界
。毕竟他们有预加载,有全局组件 ,全局方法挂载 等方法,可以让你共享组件、axiox、函数
等等。要比你单纯使用iframe
好很多
我认为可以胜任使用qiankun
前端至少具备:
-
- 熟悉
nginx
,自己部署过多页应用(多个HTML)系统。
- 熟悉
-
- 熟悉
webpack
打包。因为使用微应用你需要调整publicPath
。因为你使用了qiankun
,那么你后续肯定会有子应用的公共组件、以及函数抽离到基座的需求。
- 熟悉