本文做者:yanxin1563git
本文做者:github
GuoJin-基础小程序
组件化是一个老生常谈的涉及面很广的话题,即不是作好一件事而是作好一系列的事情才能达成;其中包含组件化框架在内的各架构层级、构建系统、依赖管理系统、以及配套的防劣化机制与规则规范。浏览器
本文主要基于百度App背景、目标和组件化历程来说述保障并行开发和组件复用的手段,尽可能避免过多发散到构建系统、依赖管理系统,以及组件化框架这样的具体子方向。组件化的重要性取决于应用规模、团队规模、产品技术目标;所述内容虽然是从iOS平台出发,但方法论与实现路径适用于大部分平台。微信
另外启动速度、体积等准入流程的约束;以及目标的多样性也是大型App复杂度来源因素;由背景产生的目标是天生的技术需求,除此以外,百度App在不一样阶段有不一样的产品技术目标。架构
这一时期,百度App浏览器角色较重,你们都在一个工程里开发,各业务和基础逻辑交错,没有边界,你中有我、我中有你;UI架构比较复杂,每一个RD都要从App主入口开始看懂主流程代码,当心翼翼的开发。框架
这一时期的架构是这样:工具
这一时期的主要问题有:组件化
虽然当时团队规模只有几十人,但已经意识到了组件化的重要性;接入业务逐步变多,同时也有部分技术组件对外输出的需求;这一阶段:性能
这一时期的架构是这样:
这一时期的主要问题有:
这一时期重点建设了组件化框架(Pyramid、SchemeRouter)与分发框架(RemoteConfig、PMS、预取分发),及数据拆分框架(CocoaSetting);进一步保障了各组件能作到逻辑、数据各有归属;
这一时期的架构是这样:
随着百度App组件化程度的提升,主工程逐步壳化,沉淀了大批通用服务;这一时期团队高速发展,加入了多仓库和构建系统的支撑(EasyBox)。
这一时期的架构是这样:
这一时期,组件化框架相对完善,各组件已能作到逻辑、资源、数据各有归属。主工程进一步被弱化;
层级更加明确清晰,游离与基础库层和业务组件层间的通用服务有了归属;组件能够自下而上的对外输出;
整个App经过中央仓库的组件列表(Central Repo Specs),通过EasyBox组装整个工程;
框架容器加载及系统事件分发统一到轻量级的AppLauncher;
对接入SDK,按架构层级属性归属;如仅被某一个业务组件引用,则有这个业务组件负责管理,下降对外的复杂度;
服务层可共享服务相对完善。
中台化的大潮滚滚而来,除云端一体化复用外,对组件化也提出了其余的更高要求。共享组件库+构建系统(EasyBox)协力,已能达到矩阵产品组合输出能力。
自下而上的组件化建设
1.没有防修改机制,业务侵入成本低;
2.交叉依赖问题:同一基础依赖的逻辑归属到同一组件里
基础库要在无业务侵入的状况下通过必定程度的抽象到架构底层,二进制化实行组件负责人制度,并进行体系化建设避免上述问题。
2.三方库主要存在如下问题:
1.没有防修改机制,业务侵入成本低;
2.三方库在必定用户规模或业务规模下,确实存在bug,而github的push request不及时或无响应;
全部三方库更新到最新发布版并二进制化避免业务侵入;差别部分明确修改点,经过运行时单独打补丁;对外输出时,明确这一点。
为避免各组件对共有逻辑、共有数据集中式处理,创建容器及分发机制来分发事件、数据、以及逻辑调用。
1.Pyramid组件化框架:
1.这里主要讲Pyramid框架的分发做用,Pyramid将系统事件分发给各子组件;
2.除此以外,组件化框架还有另外两个做用:
1)Pyramid框架组件间通讯:adapter一对一方式解耦升级为一对多解耦;
2)它将组件间的强依赖转变为弱依赖,这让技术组件对外输出时,被依赖的组件具备某种程度的可替代性;
2.端能力:
1.分离SchemeRouter与SchemeHandler逻辑,SchemeRouter归属服务层组件化框架,SchemeHandler归属各组件;
2.因为Scheme参数不够明确清晰,在百度App中Scheme主要用于和H5的通讯,较少用于页面路由;
3.配置分发服务:将集中解析并调用各业务处理逻辑改造为分发机制,并最终升级为云控服务;
4.数据拆分服务:配合配置分发服务,将数据拆分到各组件内部管理;
5.资源/预取分发服务:创建资源/预取分发服务;
6.框架容器:经过Tab导航容器、栈式导航容器将各控制器UI数据拆分到各子控制器、事件分发传递给各子控制器;
分发与隔离机制、容器机制是并行开发的重要保障。
多业务调用的低依赖组件去业务化抽象成通用服务:帐号、分享、云控、统计、性能、AI等
创建组件模型,各业务模块快速组件化。
按照组件模型,肯定业务的功能范围、逻辑与接口边界,快速组件化。
组件接口变动、依赖变动、Warning数变化都会记录通知相关负责人,这些在Tekes平台管理;敬请继续关注后续公众号文章;没有防劣化机制,填坑速度永远比不上挖坑速度;一人填坑的速度也永远比不上多人挖坑速度。
吴军博士在《文明之光》一书中评价希腊人对世界文明的贡献这样写到:近代天然科学的不少体系都是在古希腊时代奠基的,希腊人在学术研究上有别于东方文明之处不在于一两项科学发明和发现,而在于他们将天然科学各学科分门别类,对每个学科都创建起一整套系统的体系,在此基础上,演绎或概括出广泛规律性,即定理或定律,继而成为天然科学各个学科的基石和支柱。
虽然没有这样的高度,但对软件开发来说,也有殊途同归的做用。
"本身"得来终觉浅,引用一段话做为结语,节选自《每一个架构师都应该研究下康威定律》
架构的目标是用于管理复杂性、易变性和不肯定性,以确保在长期的系统演化过程当中,一部分架构的变化不会对架构的其它部分产生没必要要的负面影响。这样作能够确保业务和研发效率的敏捷,让应用的易变部分可以频繁地变化,对应用的其它部分的影响尽量的小。
---------------------------------
在微信-搜索页面中输入“百度App技术”,便可关注微信官方帐号。