一. 组件化能够解决什么问题
- 解耦,方便快速迭代。
- 提高编译速度,提高开发效率。
- 方便针对性测试
二. 常见方案及优缺点(路由)
1. url-block
概述:通过维护一个url-block的映射实现已知url就可以调用注册的block。
优点:
- 使用简单。
缺点:
- 影响启动时间。
- 硬编码,需要专门的文档或者系统来管理URL,方便调用者使用。
- URL散乱,且维护成本很高(使用宏定义会好一些)。
- 无法传递非常规类型参数,如
UIImage- 映射的内存占用
2. protocol-class
概述:维护一个protocol-class映射,各个组件暴露protocol,主工程通过protocol获取对应的实例,实现交互。
优点:
- 相比
url-block方案,可以传递非常规类型参数。- 没有硬编码
缺点:
- 主工程依赖
protocol,且组件也依赖protocol- 影响启动速度。
- 映射的内存占用
3. target-action
概述:中间件使用硬编码和runtime调用各个组件。
优点:
- 解耦相对上面两种方案更好一些。
- 不需要注册,启动速度和维护成本会少一些。
缺点:
- 需要单独维护一个分类repo,且主工程依赖这个repo。
- 依然有硬编码存在分类中,但相对
url-block来说可维护性好很多。
三. cocoapods+私有库实现
在git平台创建代码仓库zyspec作为远程私有仓库,并添加到本地。
# 本地pod库目录
cd /Users/daniel/.cocoapods/repos
# 配置git账户信息
sudo git config --system --unset credential.helper
# 添加本地私有仓库
pod repo add zyspec https://e.coding.net/Yanyinghenmei/componentization/zyspec.git
创建私有库,编辑.spec文件,打tag并验证。
# 创建私有库
pod lib create Route
# 关联远程仓库
git remote rm origin
git remote add origin https://e.coding.net/Yanyinghenmei/componentization/ZYRoute.git
git push -u origin master
# 打tag
git tag '0.0.1'
git push --tag
# 查看tag
git tag -l
# 删除本地tag
git tag -d '0.0.1'
# 删除远程tag
git push origin --delete '0.0.1'
# 推送tag到远程仓库
git push --tag
# 推送多个tag到远程仓库
git push --tags
# 验证spec文件
pod lib lint [--private] [--sources='https://e.coding.net/Yanyinghenmei/componentization/zyspec.git'] [--use-libraries]
pod spec lint [--private] [--sources='https://e.coding.net/Yanyinghenmei/componentization/zyspec.git'] [--use-libraries]
>注意,此处的命令仅仅作为笔记,并非严格按照此顺序。
将验证过的.spec文件放在zyspec文件夹下,git push之后执行如下命令
# 更新私有仓库
pod repo push zyspec Route.podspec [--use-libraries]
四. demo
https://yanyinghenmei.coding.net/p/componentization/repos
参考链接:
蘑菇街 App 的组件化之路
iOS应用架构谈 组件化方案
大话大前端时代(一) —— Vue 与 iOS 的组件化
iOS 组件化 —— 路由设计思路分析
BeeHive —— 一个优雅但还在完善中的解耦框架