\\\编者按:从去年开始,关于iOS组件化的讨论和分享非常多,也形成了几种比较成熟的方案。组件多了,它们的依赖关系、版本等的管理成为问题,但这方面的分享很少。京东iOS不但实施了组件化,还专门开发了一套组件管理系统。希望京东的实践可以给大家一些参考思路。
\
前言
\\先大概交代下背景:京东的iOS客户端从2011年2月发布至今已历经6年+的时间,研发团队也从最终的几个人变成了N多人,业务的复杂度早已不可想象。
\\我个人认为一个超过了10人的团队做组件化是合适的,也有必要。当然少于10个人也应该去思考一下应用框架该如何演变,组织的这件事。
\\目标
\\对于每家应用还得结合实际业务来考虑,毕竟技术最终也是为了业务而服务。京东iOS组件化的目的从业务层面来讲主要是为了解决:多业务的并行集成,多部门的业务输出。
\\从技术层面来讲我们做组件化的目标是为了可以做到减缓代码腐化过程,加快编译时间,模块分权管理,代码规范,bug减少,独立开发、调试、自动化编译,集成等等工作(好像很厉害的样子)。更近一步的讲,我们需要一套自动化的系统来帮助我们完成所有的组件管理工作,让开发人员能更专注于代码层面,无需关心应用配置,渠道,以及如何集成等问题。
\\组件管理演进之路
\\任何事物都有一个演进的过程,就像罗马不是一天建成的一样。iOS这些年各种技术,花样层出不穷,好多公司,好多大牛在iOS组件化方面分享出了好多宝贵的经验,也让我们少走了许多弯路。关于iOS组件化的做法每家公司都大同小异,真正需要我们去深挖的应该是怎么把组件有序的管理起来,这也是我们想和大家探讨的内容,在讨论组件管理内容之前我们先简单说明下组件化实现的大概思路。
\\- 代码解耦\\t\\t
- Cocoapods管理\\t\
代码解耦
\\首先入手的工作就是代码的解耦,这里其实没有太多的技术含量,只要胆大心细,有计划,一个工程总能被拆成一个个独立的模块。我们把每一个独立的模块就称之为组件,相互之间不能通过硬编码引用的方式进行调用。通信通过自定义的协议进行。
\\组件原则
\\- 组件被定义为两种类型的组件:基础组件,业务组件。\\t\\t
- 基础组件可以被业务组件依赖,基础组件不可依赖业务组件。\\t\\t
- 业务组件不可依赖业务组件。\\t\
自定义协议
\\组件之间通信遵循一套自定义的协议通信,实现的方式网上有些开源的项目,我们综合各家实现考虑,最后定出的一个方案:组件间的通信应该是轻量级的,调用完就走,不留痕迹,不需要维护通信数据。
\\大致实现如下:
\\(点击放大图像)
\\ \\我们实现一个JDRouter的组件,用来实现组件与组件之间的通信。只暴露一个头文件,两个方法:输入,输出(宏规范)。
\\输入(A调用B)
\\\\trouter://JDBClass/getString?name=Steven\\\
输出(B被A调用)
\\+(id)getDataWithString:(NSString *)name {\ NSString *str = [NSString stringWithFormat:@\"HI, %@\