组件化方案分析
蘑菇街
https://limboy.me/tech/2016/03/10/mgj-components.html https://limboy.me/tech/2016/03/14/mgj-components-continued.html
Casa
https://casatwy.com/iOS-Modulization.html
bang
http://blog.cnbang.net/tech/3080/
美团
https://tech.meituan.com/2018/12/06/waimai-ios-optimizing-startup.html
阿里巴巴
https://github.com/alibaba/BeeHive https://halfrost.com/beehive/
其他
https://nixwang.com/2017/05/06/ios-modulization/ http://blog.pengqi.me/2016/03/22/ios-routing/ https://github.com/wequick/Small
什么是路由
叫路由也罢、总线也罢、中间人也好,说白了,就是一层胶水,把两个互不认识的组件粘到了一起。
openURL方式
用来处理推送、H5跳转、支付回调、分享等。
优点
- 可以灵活配置,甚至从服务器下发配置项,达到动态修改行为的目的
- Android 和 iOS 可以统一
- 自动降级 老版本解析不了URL,走老的逻辑依旧可用。新版本可以解析URL,走新的逻辑。
缺点:
- 提供的服务信息无法从代码层面获取,需要通过其他渠道(后台系统、文档)治理。
- 无法传递复杂参数(如 UIImage)
注意点:
- 外部调用无法传递复杂参数(如 UIImage)
- 外部调用应该基于内部调用暴露出去
- 可能会有安全隐患,可能存在通过外部调用到无权限服务的情况
Protocol + Wrapper方式
优点
- Protocol支持一对多,任何对象都可以实现某个
Protocol
- 同一套
Protocol
可以对应不同业务,满足能力相同但输出不同的业务场景 - 可以满足换肤或换主题的需要,相同能力,UI不同。实现方案有多种,其中一种是基于同一个
Protocol
更换UI Wrapper - 结构清晰,可读性高
缺点
- 写起来有点绕,麻烦
- 组件多了,内存会上升
- 要严格根据public协议维护组件生命周期
Mediator方式
- 定义对外提供的能力
- 需要Wrapper(Category)
从这两点看,和Protocol
对比,在表现方式
上没有本质区别
优点
- 采用runtime,灵活
- 轻量
缺点
- runtime比较灵活,编译阶段无法及时暴露问题,组件漫天开花后,容易引起爆炸,无论是APP Crash还是业务服务
NOT FOUND
- 存在一些硬编码,类名修改后,改动起来有一定工作量
- Target命名,要尽量抽象,比较考验程序员经验
题外话
说是争论,可能就是想说,有我没你。
技术方案、工具,本无高低,唯合适而。
做应用工程的没什么所谓的技术,挑选合适的工具即可。
大道至简,回归原始
用Flutter框架的定义,万物皆Widget,我们也可以说万物皆组件,颗粒度的区别。
举个粗点的例子:
APP = A组件 + B组件 + C组件 + …
A组件 = A1 + A2 + A3 + …
A1组件 = A11 + A12 + A13 + …