微前端初探索

Author Avatar
Peipei Wong 11月 03, 2019
  • 在其它设备中阅读本文章

前几年的spa将前端推入热潮,但是当spa越来越大怎么办?整个团队都需要维护一个repo,碰上改文案的需求,整个项目需要全部更新,看起来真的好笨重。

现在项目的现状,是有两个项目的spa组合起来,虽然一定程度上减少了项目的耦合性,但是导致的问题就是,两个spa跳转时,整个页面刷新;两个项目中有一些重复的逻辑代码。因为页面是左右结构,左边是导航栏,我如果要改导航,我要改两个项目的代码,如果逻辑相同还好,逻辑不相同的话,就是double工作量。

微前端的概念提出来后,终于是有了解决方案的曙光。虽然还很年轻,但是值得探索。结合现在的项目,它能解决现在项目的痛点,真的非常适合。

现在的github上的解决方案很多。对于解决方案,我需要考虑些什么?

如何匹配的路由

一个容器中包含多个子项目,每个项目有对应的路由。访问不同路由时,容器如何分发?

  1. 每个子项目在window上挂载对象,但这样做和按需加载时一个相悖的过程?
  2. 那就写一个adapter收集每个项目中路由,如何收集路由?假如子项目使用的技术栈不同,难道容器要穷举每种技术栈吗?
  3. 子项目主动在容器暴露的方法中挂载路由

匹配到路由后,执行相应的js,容器中需要存在一个路由指向状态,如果当前指向状态和需要跳转的状态相同,这个跳转就交给子项目的spa去做,不相同,就挂载并执行路由对应的js。

多个项目如何通信

想把多个子项目用的的base数据放在容器中,问题是子项目如何从容易中拿数据?

之前看的文章说避免因为数据导致项目的耦合,但如果不将相同的数据放在一起,子项目中还是会存在相同的代码。容器负责维护base数据。

又出了一个问题,容器维护base数据,子项目加入使用不同的技术栈的话,是不是考虑一种最兼容的方式去维护数据?

打包时,如何将多个子项目相同包合并

  1. 打包的时候,容器遍历每个项目的package,抽出相同的,打包子项目的时候,不重复打包,但这个方法带来的问题是,我仅仅更新子项目的时候,如何知道哪些是重复的?这个pass
  2. 这个问题留给使用者,暴露接口让用户自行配置,打包的时候,还是照常打包package中的包。

另外可以出一个dev和pro的不同配置

// conf
const devPackges = {
 key: value
}

const prodPackges = {
 key: value
}

// html
Object.keys(devPackges/prodPackges).map(key => (
  <script src={packages[key]} />
))

11.4 新增–根据路由执行对应js,会导致内存泄漏吗?

忽然想到如果single-spa没做出来,做一个兜底方案。受turbolinks启发,拦截两个项目之间所有的跳转链接,将跳转页面的请求转换成ajax请求,收到返回后,替换html中的js和css,这样就实现了无感知跳转。但这样,每次js标签的替换,都会导致js运行一遍(这个暂时这么想,我需要验证一下),来回跳转十次,内存不就炸了吗?照这个套路想,现在项目的spa,每个页面都是一个chunk,但是是一个累加的过程,react是如何做到匹配的路由执行对应的js,这个“执行”,是匹配到路由后,就执行对应的chunk,重复执行50次相同的js,内存不就满了吗?react是如何处理这的呢?

参考链接

https://martinfowler.com/articles/micro-frontends.html