返回

有赞 iOS 组件化漫谈

IOS

背景

近年来,业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,一直是业界积极探索和实践的方向。有赞移动团队自16年起也在不断尝试各种组件化方案,在有赞微信商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出 iOS 相关框架 BiComponent。这篇文章会为大家带来我们的组件化实践思路,方案选型、实践落地、痛点应对,以及我们沉淀的组件化框架 BiComponent。

方案

我们调研了业界主流的组件化方案,比如 Facebook 的开源组件化框架 Buck、美团组件化框架 Magnus 等,还调研了一些提供组件化解决方案的第三方的服务,例如阿里巴巴的 Polaris、腾讯的 OneSDK。我们在对比和分析了这些方案后,选择了 Buck 作为我们的组件化基础框架,并对部分不足之处做了改造和升级。主要体现在以下几个方面:

  1. 新增动态化组件,使依赖于 Buck 框架的组件具备动态加载的能力。
  2. 新增组件依赖管理模块,引入流水线持续构建优化组件打包,引入组件类型定义,基于声明式语法配置组件。
  3. 对现有协议组件的声明式使用做了重构,使得各个业务组件的声明式可以脱离组件协议而独立存在。
  4. 对 Buck 框架编译生成的 Fat Framework 做了优化,主要是去除了依赖的静态库等多余的文件,以减小组件 size。

收益

有赞移动在落地组件化改造后,收益十分明显。

  1. 开发效率提升: 每个独立组件就是一个小的单元,拥有独立的功能,便于功能拆分和团队协作。
  2. 代码管理方便: 代码结构变得更加清晰,便于代码维护,也减少了冲突和版本管理问题。
  3. 可复用性增强: 组件之间可以复用,避免重复开发,提高代码利用率。
  4. 测试难度降低: 测试独立的组件比测试整个应用更加容易。
  5. 可扩展性增强: 组件化架构可以很容易地扩展和升级,便于业务发展和功能迭代。

痛点

在组件化落地过程中,我们也遇到了许多问题和挑战,主要是以下几个方面:

  1. 组件粒度划分困难: 如何合理划分组件的粒度是一个比较困难的问题,粒度太大会导致组件过于庞大,不利于维护和管理。粒度太小会导致组件过于分散,不利于功能协作和开发效率的提高。
  2. 组件通信复杂: 组件化架构下,组件之间通常需要相互通信,这可能会导致组件之间的依赖关系变得复杂。
  3. 组件的管理和维护困难: 组件化架构下,组件的数量和复杂度都会增加,这可能会导致组件的管理和维护变得困难。
  4. 组件的测试复杂: 组件化架构下,组件之间通常需要相互依赖,这可能会导致组件的测试变得复杂。
  5. 组件的复用困难: 组件化架构下,组件之间通常具有不同的功能和特性,这可能会导致组件的复用变得困难。

BiComponent 组件化框架

为了解决上述问题,我们开发了 iOS 组件化框架 BiComponent。该框架包括以下几个主要模块:

  1. 组件类型定义模块: 用于定义组件的类型,包括组件的名称、功能、依赖关系等。
  2. 组件依赖管理模块: 用于管理组件之间的依赖关系,并根据依赖关系自动生成组件的构建顺序。
  3. 组件协议模块: 用于定义组件之间通信的协议。
  4. 组件声明式模块: 用于定义组件的声明式使用方式。
  5. 组件编译模块: 用于将组件编译成 Fat Framework。

总结

组件化架构是一种比较流行的移动应用开发架构,可以提高开发效率、代码管理方便、可复用性增强、测试难度降低、可扩展性增强。但是,组件化架构也存在一些问题,如组件粒度划分困难、组件通信复杂、组件的管理和维护困难、组件的测试复杂、组件的复用困难等。有赞移动在组件化落地过程中也遇到了这些问题,并通过开发 iOS 组件化框架 BiComponent 来解决这些问题。BiComponent 组件化框架包括以下几个主要模块:组件类型定义模块、组件依赖管理模块、组件协议模块、组件声明式模块、组件编译模块。该框架可以有效地解决组件化落地过程中遇到的问题,并提高组件化改造的效率和质量。