微前端——前端开发新体验
团队在去年使用微前端架构重新构建了一个门户站点。通过引入微前端架构,解决了单体架构下、多团队协作所产生的相互影响,相互依赖的问题,使得团队更大程度的获得了自治权。本文选取业务模型,技术实践,服务资产管理三个视角,通过分析项目迭代开发存在的问题,尝试说明原有单体架构下的痛点,以及引入微前端如何解决痛点问题,从而改善各个团队工作方式。最后,我们将总结分享在对门户站点进行微前端改造过程中所汲取到的经验和教训。
背景早前,团队构建了一个一站式门户站点,需要集成多个系统,包括:订单系统,偏好推荐系统,产品系统等;历时半年,选择React & Redux作为前端开发框架和工具,使用Kotlin作为BFF开发语言,以单体应用的形式,团队将该门户站点发布到AWS中投入使用。此后的几个月,随着交付更迭,随着越来越多团队加入,我们遇到了一些团队协作的问题。业务模型 - 交付计划相互影响和高额的沟通成本以订单,偏好推荐和产品为例,下图描述了该站点上各个团队的业务模型:
业务交付上,微前端作为DDD在前端的扩展,按照与后端领域相同的拆分方法,可以将前端拆分成独立的Micro App。各个Micro App仅与对应的BFF进行通讯,BFF只聚合下游服务,从下游服务获取数据,从而让Micro App在业务层面实现完全拆分。每个Micro App是一个完整的业务领域,拥有独立业务价值,业务变化完全由各个团队自己负责。业务变化几乎不会影响整个站点。
团队工作在基于业务领域划分的端到端项目,这使我们的交付更加稳定和可预测:团队可以更加关注领域内业务价值的实现以及对项目的迭代更新。业务迭代更新取决于团队自身。
能够充分进行自主技术决策,维护小而聚合的代码库及相关基础设施:团队拥有完全自主的决定权,定制更灵活地,符合团队自身和工作内容的技术实践。
独立进行测试与部署:更新、升级的影响范围被控制在每一个Micro App中,各团队只需负责开发、维护自己的Micro App即可。
此外,而上文提到的import-map组件,本质上是一种动态加载JS的机制实现,这种机制为吸引更多人、更多团队、乃至第三方成为所构建平台的贡献者提供了可能。
实践经验与教训微前端架构给团队带来了极大的自治权,团队在领域内、在自己维护的Micro App中获得了极大的自主权,可以更加灵活的选择更合适的方式解决实际的业务问题。在认清这些红利外,微前端并不能解决所有问题,这种架构实践并非没有代价,主要表现在引入的性能问题,要求较高的DevOps以及管理复杂度。对此我们需要引入其他技术手段克服:
性能:引入微前端框架,浏览器加载页面时需要最先加载微前端框架代码,而后加载各个组件和MFA,这无疑加重了浏览器的加载负担。为了减少页面加载时间,一方面需要借助工件最小化,Tree shaking,以及在Cloudfront & 浏览器等层面上的缓存等手段加快每一个JS脚本文件的加载速度;另一方面需要在确保功能完整的情况下,尽可能提高JS脚本并行加载能力。
DevOps:微前端架构实践对团队CD能力也有要求。可以说与CD实践相辅相成。通过流水线保持Micro App引用最新,这需要较高的自动化要求和高度Infrastructure as Code实践。而为了高度的自动化,也需要足够有信心的测试覆盖,如此才能保持业务的持续交付,持续集成。
管理复杂度:多个不同的Micro App组件同时加载,通过命名规范可以解决潜在的CSS/JS冲突问题;由于UI在前端被分割成了一个个边界清晰的Micro App,我们需要一定的设计规范,保持跨Micro App的设计一致性,如统一的配色样式,风格接近的操作方式,行为一致的错误处理等。我们相信,再追求高度自治的情况下,并不能以牺牲流畅统一的用户体验为前提。
- 相关阅读 -
点击【阅读原文】可至洞见网站查看原文&绿色字体部分的相关链接。
本文版权属ThoughtWorks公司所有,如需转载请在后台留言联系。