2019微前端最佳实践

1,564 阅读5分钟

微前端开发示意图,图片来自Micro Frontends

微前端是什么?

从“微服务架构”说起

想要了解微前端,我们先要了解一下"微服务(Microservices)",因为微前端的概念是借鉴后端"微服务(Microservices)"的设计衍生而来。

如果你了解微服务是什么,那么你很容易就能理解什么是微前端。

微服务架构的思路就是将巨大的单体应用进行分解成小的、可相互连接的微服务,每个微服务可以实现独立的开发、部署。微服务的优势是:

  • 解耦整体架构,降低复杂性。微服务解决了大型单体应用复杂性问题。
  • 小单元分治,更易维护。微服务架构中,每个微服务实现独立开发部署、互不干扰。
  • 易于扩展。微服务架构使得每个服务都可独立扩展。

接着,我们来看看“微前端”是什么

微前端的定义

最早,微前端的提出来自“Micro Frontends - Cam Jackson”这篇文章,里面对“微前端”的定义是:

微前端是一种架构设计风格,在微前端架构中多个独立、可交付的前端应用被组装成一个更大的应用。原文: "An architectural style where independently deliverable frontend applications are composed into a greater whole"

微前端架构的一些好处:

  • 解耦,自治团队的可扩展组织
  • 较小,更紧密和可维护的代码库
  • 能够以比以前更多的增量方式升级,更新甚至重写前端的功能

通过对比,你就会发现“微前端”和“微服务”的设计风格是一样的。

微前端的适用场景

SPA/MPA是前端最常见的开发方式,能够满足大多数的场景。但是随着业务发展,会出现下列情况:

  • 项目越来越大、越来越复杂
  • 需要更多人力参与到项目协作
  • 新项目越来越多。新业务的不断拓展需要增加新项目。
  • 老项目需要合并、整合。伴随业务整合,旧项目也需要整合。

于是,微前端顺势而生。微前端方案的优势:

  • 更好地多人协作开发
  • 便于整合多个应用

微前端最佳实践

single-spa类框架的局限性

微前端架构示意图,来自: Micro frontends—a microservice approach to front-end web development

自从微前端的概念被提出来之后,市面上出现了不少“微前端框架”。最广为人知的是single-spa,国内举个典型是阿里飞冰。这里,将这类框架通称为“single-spa类框架”。

single-spa类框架一般会提供下列能力:

  • 框架自由采用。可以在项目中多个框架(Angular、React或者Vue)可以和谐共处。这个更加适合于整合多个不同技术栈的老旧系统
  • 延迟加载子应用。不同的子应用只有在访问到的时候,才会加载。
  • 实现子应用独立开发部署。多个小团队共同开发一个大型项目的时候,可以实现子应用的独立技术选型和开发部署。

single-spa类框架的实现原理:拦截路由,根据不同路由规则渲染对应的子应用

single-spa类框架的局限性:

  • 很多新项目并不需要同时采用多个框架。
  • single-spa类框架本身有学习、维护成本。

微前端真正的使用场景很少

截至2019年12月06日,single-spa的GitHub项目数据,来自:CanopyTax/single-spa: Microfrontends made easy

从上图可以看到,single-spa才被617个项目用到。而国内阿里开源的项目alibaba/ice为0采用,蚂蚁金服开源的umijs/qiankun才被35个使用。

说明一点:single-spa类框架真正的使用场景,很少

为何会这样呢?我的观点是:

  • 新项目一般不会特地采用多框架进行开发。
  • 老项目整合一般直接使用iframe方案。

总结一句:新项目采用single-spa显得“过度设计”,老项目采用single-spa改造成本很大

所以,微前端框架真正的使用场景很少。

最好的微前端方案——单项目模块化SPA

模块化SPA

单项目模块化SPA示意图

两年以上的前端团队,基本都会有不少老项目存在,各个项目间技术栈参差不齐。越老的前端团队,其项目间的差异越大,因为近十年是前端技术百花齐放的十年。出现无数的框架、打包工具、UI库等等,2017年之后才有所缓和,因为前端进入新的阶段——工程化阶段。

假设所有的项目都采用同一套技术选型(例如:React+Ant),会有以下优势:

  • 多个项目在需要合并时,可以较轻松合并。
  • 学习、维护成本低,因为技术栈统一。

我认为,最简单的微前端解决方案就是——单项目模块化SPA

“单项目模块化SPA”的具体方案如下:

  • 统一技术栈(工具层、组件库等)。
  • 通过不同打包命令分模块打包项目,每个模块是MPA或者SPA。
  • 模块化部署。

这时候,轻松实现了“微前端架构”,同时也避免引入single-spa这类框架增加项目的复杂度。

iframe仍是最好的方案

为什么iframe仍是最好的方案?因为操作简单、维护成本也低

我认为,最简单的整合旧系统的档案——通过iframe嵌入旧服务,因为:

  • 使用简单,一个标签就能引入。
  • 天然的“安全沙箱”隔离父子页面。

同时,iframe也是有天然的劣势的:

  • 性能问题。页面需要加载。
  • 页面间通信问题较为麻烦。iframe是一个“页面沙箱”,通常使用postMessage与外界进行通信。

总结

以上是我对微前端的若干思考。总结就一句话——“微前端的设计风格值得了解,一些微前端框架暂不建议使用。”

参考资料