对于中大型移动端APP开发来讲,组件化是一种常用的项目架构方式。个人最近几年在工作项目中也一直使用组件化的方式来开发,在这过程中也积累了一些经验和思考。主要是来自在日常开发中使用组件化开发遇到的问题以及和其他开发同学的交流探讨。
本文通过以下问题来介绍组件化这种开发架构的思想和常见的一些问题:
为什么需要组件化组件化过程中会遇到的挑战和选择如何维护一个高质量的组件化项目提示:本文说的组件化工程是指Multipo使用独立的git仓库来管理组件。
组件化可以带来什么单一工程架构遇到的问题在组件化架构之前,传统使用的工程架构主要是以Monolithic方式的单一工程架构,也就是将所有代码放在单个代码仓库里管理。单一工程架构使用了这么多年为什么突然遇到了问题,这也引入了APP项目开发的一个大背景,现有中大型APP项目变的越来越复杂:
多APP项目并存-集团内部存在多个APP项目,不同APP希望可以复用现有组件能力快速搭建出新的APP。功能增多-随着项目功能越来越多,代码量增多。同时需要更多的开发人员参与到项目中,这会增加开发团队之间协作的成本。多语言/多技术栈-引入了更多的新技术,例如使用一种以上的跨平台UI技术用于快速交付业务,不同的编程语言、音视频、跨平台框架,增加了整个工程的复杂度。以上这些业务发展的诉求就给传统单一工程架构方式带来了很多新的技术要求:
工程效率工程代码量过大会导致编译速度缓慢。单git工程提交同时可能带来更多的git提交冲突和编译错误。质量问题如何将git提交关联到对应的功能模块需求。发版时进行合规检查避免带入不规范的代码,对整个功能模块回滚的诉求。如何在单仓库中管控这么多开发人员的代码权限,尽可能避免不安全的提交并且限制改动范围。更大范围的组件复用基础组件从支持单个APP复用到支持多个APP复用。不只是基础能力组件,对于业务能力组件也需要支持复用。(例如一个页面组件同时在多个APP使用)跨平台容器需要复用底层组件能力避免重复开发,同时不同跨平台容器API需要尽量保持统一,底层基础设施向容器化发展支持业务跨APP复用。跨技术栈通信由于页面导航多技术栈混合共存,页面路由需要支持跨技术栈。跨组件通信需要支持跨语言/跨技术栈通信。更好的解耦页面解耦。由于页面导航栈混合共存,页面自身不再清晰的知道上游和下游页面由什么技术栈搭建,所以页面路由需要做到完全解耦隔离技术栈的具体实现。业务组件间维持松耦合关系,可以灵活添加/移除,基于现有组件能力快速搭建出不同的APP。对于同一个服务或页面可以插件化方式灵活提供多种不同的实现,不同的APP宿主也可以提供不同的实现并且提供A/B能力。由于包体积限制和不同组件包含相同符号导致的符号冲突问题,在复用组件的时候需要尽可能引入最小依赖原则降低接入成本。组件化架构的优势基于以上这些问题,现在的组件化架构希望可以解决这些问题提升整个交付效率和交付质量。
组件化架构通常具备以下优点:
代码复用-功能封装成组件更容易复用到不同的项目中,直接复用可以提高开发效率。并且每个组件职责单一使用时会带入最小的依赖。降低理解复杂度-工程拆分为小组件以后,对于组件使用方我们只需要通过组件对外暴露的公开API去使用组件的功能,不需要理解它内部的具体实现。这样可以帮助我们更容易理解整个大的项目工程。更好的解耦-在传统单一工程项目中,虽然我们可以使用设计模式或者编码规范来约束模块间的依赖关系,但是由于都存放在单一工程目录中缺少清晰的模块边界依然无法避免不健康的依赖关系。组件化以后可以明确定义需要对外暴露的能力,对于模块间的依赖关系我们可以进行强约束限制依赖,更好的做到解耦。对一个模块的添加和移除都会更容易,并且模块间的依赖关系更加清晰。隔离技术栈-不同的组件可以使用不同的编程语言/技术栈,并且不用担心会影响到其他组件或主工程。例如在不同的组件内可以自由选择使用Kotlin或Swift,可以使用不同的跨平台框架,只需要通过规范的方式暴露出页面路由或者服务方法即可。独立开发/维护/发布-大型项目通常有很多团队。在传统单一项目集成打包时可能会遇到代码提交/分支合并的冲突问题。组件化以后每个团队负责自己的组件,组件可以独立开发/维护/发布提升开发效率。提高编译/构建速度-由于组件会提前编译发布成二进制库进行依赖使用,相比编译全部源代码可以节省大量的编译耗时。同时在日常组件开发时只需要编译少量依赖组件,相比单一工程可以减少大量的编译耗时和编译错误。管控代码权限-通过组件化将代码拆分到不同组件git仓库中,我们可以更好的管控代码权限和限制代码变更范围。管理版本变更-我们通常会使用CocoaPods/Gradl这类依赖管理工具来管理项目中所有的组件依赖。因为每一个组件都有一个明确的版本,这样我们可以通过对比APP不同版本打包时的组件依赖表很清晰的识别组件版本特性的变更,避免带入不合规的组件版本特性。并且在出现问题时也很方便通过配置表进行回滚撤回。提示:组件化架构是为了解决单一工程架构开发中的问题。如果你的项目中也会遇到这些痛点,那可能就需要做组件化。
组件化遇到的挑战虽然组件化架构可以带来这么多收益,但不是只要使用组件化架构就可以解决所有问题。通常来讲当我们使用一种新的技术方案解决现有问题的时候也会带来一些新的问题,组件化架构能带来多少收益主要取决于整个工程组件化的质量。那在组件化架构中我们如何去评估项目工程的组件化架构质量,我们需要