date
Jan 19, 2024 02:24 AM
type
status
slug
summary
tags
category
updated
Mar 22, 2024 09:10 AM
icon
password
前言
在前端的开发中,经常会遇到这样的需求。A项目中的某个页面或者新增一个模块,需要嵌入B项目。然后B项目有可能需要C项目这种套娃式的项目嵌套。如果你是新开始做项目,那么我推荐你使用乾坤或者其他的微前端框架。但是如果你像我一样,项目以及成型,而且有很多公司自己的配置和域名不一样的各种各样的因素,导致你不能很好的使用微乾坤框架。那么通常大家使用的就是iframe。
需求
这里说一下我的需求是要开发一个类似于移动应用的框架,框架的一侧需要加入每个项目的按钮,点击按钮打开对应的项目在右侧显示。由于种种因素的限制,我只能采用iframe来开发。还有负责每个项目的身份认证。这样该项目可以使用于多个环境下,例如PC的浏览器端,移动的web端。
总结下开发的需求
- 一个类似于移动软件的应用外壳
- 负责用户的验证,然后将用户信息告知各个子应用
- 子应用告知主应用自己有哪几个模块,这样主应用可以渲染成tab,切换子应用的页面
项目构建思路
需求1实际上很好实现,主要是需求2比较麻烦。为了让主应用(外壳应用)能和子应用进行通信,这里就用到了iframe的方法postMessage。下面是postMessage的一个实例。
其实到这里感觉也就结束了。但是实际开发过程中遇到了很多麻烦的事情。
- iframe网页什么时候才加载完成,主应用可发送用户信息
- 子应用的用户凭证过期了,需要告诉主应用,主应用获取用户信息再次发送给子应用。
- 子应用合适向主应用发送信息,并且主应用得能接收到。
上面的难点就使得项目需要一个流程和交互的协议。
为此我设计了一个信息的类型:
并构建一个通信的流程
如果只有
主页面-->子页面
2层结构的话是比较简单的,但是还有一种情况是多层的,就是主页面-->子页面-->子页面的子页面
那就比较麻烦。
所以我们需要做一个操作,就是扁平化iframe页面的传递通信流程。注意的是这里不能跨域。那么就需要子能找到对应的父页面,因为孙子页面嵌套了多层,它的父页面不是真正的外壳页面。这里我就在外壳页面中定义了一个对象,做一个标识符。
获取到之后就可以通过这个platformParent对象发送信息,在发送信息的时候将子页面自己的页面标识发出去,这样外壳页面就能向对应的子页面发送信息了。
但是我在项目的多层交互中遇到一个问题就是,父页面不知道发送信息的子页面是处于哪一层。这样会导致一个问题,至少是在我的项目中会出现。因为我需要子项目的模块路由,由于无法知道当前信息中的路由是否是子项目的还是孙子项目的。导致渲染不正常也导致了url的调转中断了孙子页面的加载。
所以我在传递的信息中又加入了页面的层次标识
这样获取到信息的时候外壳页面可以根据传递的值来判断是哪一层的页面发出的信息,从而阻断一些操作。
优化
这里主要说的是我认为的一些优化操作,因为监听信息使用的是
window.addEventListener
函数,而且还有个回调函数。有时候会多次的绑定函数,我认为只需绑定一个而且多次绑定解绑浪费性能。所以可以使用代理的方式来做一个绑定函数我这里就做了一个封装来完成函数的回调和绑定解绑。外壳应用的代码和子应用的代码,除了对接受信息的判断操作不一样之外。流程是一样。