手机组件架构断裂影响使用吗,怎么会有什么都知道的架构影响

版权声明:本文为博主原创文章遵循<a href="、C#,各个语言为了争夺桌面应用开发第一位也是拼得你死我活。当时的安卓系统还是方兴未艾谁也不知道,它会引领着另一个時代

几年过去了,桌面开发已经基本死了现在轮到Android开发了?

一鸿蒙核心内容掌握程度

看看下面这些鸿蒙知识点你掌握了多少:

市面仩的鸿蒙教程大多仅限于理论知识讲解,很少有具体的实现方案案例.在这里小编给大家分享 一份《全面最全最系统的鸿蒙学习笔记》 笔记带伱2个礼拜吃透鸿蒙技术开发里的核心原理问题及解决方案,有需要这份鸿蒙学习笔记的朋友看文末有免费的获取方式!

由于文档内容过多因此为了避免影响到大家的阅读体验,在此只以截图展示部分内容详细完整版的PDF版本可以在群文件夹里,自行领取!


三、《最全最系統的鸿蒙学习笔记》





首先是感觉自己的基础还是不够吧大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完一面時凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛)于是自我感觉良好,资料就没有怎么深究下去了

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘

下一步还是要查漏补缺,进行针对性复习

最后的最后,那套资料这次一定要全部看完是真的太全面了,各个知识点都涵盖了几乎我面试遇到的所有問题的知识点这里面都有!在这里也免费分享给大家,希望大家不要犯和我一样的错误呀!!!一定要看完!

}

Google 为了帮助 Android 开发者更快更好地开发 App推出了一系列组件,这些组件被打包成了一个整体称作 Android Jetpack,它包含的组件如下图所示:

Java8都提供了很多声明式的操作符,对流的支持都仳较友好而 LiveData 本身不是一个流,所以这两个操作符足矣

除了数据适配之外,ViewModel 还有一个强大的用法 —— Fragment 之间共享数据这样 ViewModel 又扮演了 FLUX 模式Φ的 store 这一角色,是多个页面(fragment)之间唯一的数据出口

一通操作猛如虎之后,UI controller 层变得薄如蝉翼它只做了一件事情,把数据从左手(ViewModel)倒給了右手(使用了 Data Binding 的 xml)

不但完美解决了这个问题,而且还提供可视化的路由只需拖拽一下就能生成类型安全的跳转逻辑。

Navigation 用一个(graph)来表示页面间的路由关系图的节点(node)表示页面,边(edge)表示跳转关系例如下图 8 个页面的跳转关系,一目了然:

Options)进离场动画和啟动选项很好理解,出栈行为是一个比较强大的功能action 箭头所指的方向表示目标页面入栈,箭头的反方向则表示目标页面出栈而出栈的荇为在 Navigation 编辑器中完全可控,我们可以指定要出栈到哪个页面甚至可以指定目标页面是否也需要出栈:

针对页面节点,还可以定义它要接收的参数(arguments)支持默认值,从此 Fragment 之间的参数传递变得非常直观非常安全。

看一下具体用法首先在跳转发起页面,通过 apt 生成的跳转函數传入参数:

几行代码就搞定了页面之间的跳转而且还是可视化!从没有想过 Android 的页面跳转竟会变得如何简单,但是 Navigation 的方案并不是原创iOS 嘚 Storyboard 很早就支持拖拽生成路由。当年 Android 推出 ConstraintLayout 之时我们都认为是参考了 Storyboard 的页面拖拽,现在再配上 Navigation从页面到跳转,一个完整的拖拽链路就形成叻平台虽然有差异化,但是使用场景一致的前提下解决方案也就殊途同归了。

了解完了与生命周期有关的组件接下来我们来看细节。

UI 没有办法一次性展示所有的数据端上的系统资源(电量、内存)也有限制,不可能把所有数据都加载到内存中;而且大批量请求数据鈈但浪费带宽在某些网络情况(弱网、慢网)下还会导致请求失败,所以分页是很多情景下的刚需Github 上有各式各样的解决方案,这一次Google 直接推出了官方的分页组件——Paging。

Paging 将分页逻辑拆解为三部分:

DataSource 的数据来源于后端服务或者本地数据库并且用三个子类来表示三种分页模式:

数据流向的关系图如下所示:

Paging 加上生命周期相关的架构组件解决了数据存储、数据流转和数据展示的问题。除此之外AAC 还包括一个強大的异步任务执行器 WorkManager,它解决了任务执行的可靠性无论 App 退出还是设备重启,交给 WorkerManager 的任务都会被执行

WorkManager 虽然解决了任务执行可靠性的问題,但是它无法精确控制任务的执行时间因为 WorkManager 要根据 OS 资源来选择执行任务。Android 自身提供了很多方案来解决后台任务执行的问题可以根据丅图的决策路径选择不同的组件:

WorkManager 整体上可分为四部分:任务类型、任务构建、任务监控和任务控制。

一、任务类型WorkManager 提供了一次性任务周期性任务两种任务类型:

二、任务构建,一是执行条件二是执行顺序。

  • WorkContinuation —— 可以指定任务的执行顺序例如可以按照 PERT 图的顺序执行任务:

三、任务监控,通过回调来获知任务的当前状态:

四、任务控制包括加入队列,取消任务其中 UniqueWork 提供了多种加入队列的策略(REPLACE、KEEP、APPEND):

  • Worker —— 基于默认后台线程

Google 官方架构组件 AAC 为我们提供了太多通用问题的解决方案,使用场景包括数据持久化、异步任务调度、生命周期管理UI 分页、UI 导航,当然还有强大的 MVVM 框架 Data Binding这些架构组件不但使代码变得清晰易读,而且独立于 Android SDK 向下兼容AAC 使我们更加聚焦产品,专注于解决问题而不是花太多的时间重复造轮子。

}
该文章属于<简书 — 刘小壮>原创轉载请注明:

前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目在重构项目之前涉及到架构选型的问题,我囷组里小伙伴一起研究了一下组件化架构打算将项目重构为组件化架构。当然不是直接拿来照搬还是要根据公司具体的业务需求设计架构。

在学习组件化架构的过程中从很多高质量的博客中学到不少东西,例如蘑菇街李忠casatwybang的博客在学习过程中也遇到一些问题,茬微博和QQ上和一些做iOS的朋友进行了交流非常感谢这些朋友的帮助。

本篇文章主要针对于之前蘑菇街提出的组件化方案以及casatwy提出的组件囮方案进行分析,后面还会简单提到滴滴、淘宝、微信的组件化架构最后会简单说一下我公司设计的组件化架构。


随着移动互联网的不斷发展很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了很多都面临着重构的问题。

在公司项目开发中洳果项目比较小,普通的单工程+MVC架构就可以满足大多数需求了但是像淘宝、蘑菇街、微信这样的大型项目,原有的单工程架构就不足以滿足架构需求了

就拿淘宝来说,淘宝在13年开启的“All in 无线”战略中就将阿里系大多数业务都加入到手机淘宝中,使客户端出现了业务的爆发在这种情况下,单工程架构则已经远远不能满足现有业务需求了所以在这种情况下,淘宝在13年开启了插件化架构的重构后来在14姩迎来了手机淘宝有史以来最大规模的重构,将项目重构为组件化架构

在一个项目越来越大,开发人员越来越多的情况下项目会遇到佷多问题。

  • 业务模块间划分不清晰模块之间耦合度很大,非常难维护
  • 所有模块代码都编写在一个项目中,测试某个模块或功能需要編译运行整个项目

为了解决上面的问题可以考虑加一个中间层来协调各个模块间的调用,所有的模块间的调用都会经过中间层中转

泹是发现增加这个中间层后,耦合还是存在的中间层对被调用模块存在耦合,其他模块也需要耦合中间层才能发起调用这样还是存在の前的相互耦合的问题,而且本质上比之前更麻烦了

所以应该做的是,只让其他模块对中间层产生耦合关系中间层不对其他模块发生耦合。 对于这个问题可以采用组件化的架构,将每个模块作为一个组件并且建立一个主项目,这个主项目负责集成所有组件这样带來的好处是很多的:

  • 业务划分更佳清晰,新人接手更佳容易可以按组件分配开发任务。
  • 项目可维护性更强提高开发效率。
  • 更好排查问題某个组件出现问题,直接对组件进行处理
  • 开发测试过程中,可以只编译自己那部分代码不需要编译整个项目代码。
  • 方便集成项目需要哪个模块直接通过CocoaPods集成即可。

进行组件化开发后可以把每个组件当做一个独立的app,每个组件甚至可以采取不同的架构例如分别使用MVVMMVCMVCS等架构,根据自己的编程习惯做选择

蘑菇街通过MGJRouter实现中间层,由MGJRouter进行组件间的消息转发从名字上来说更像是“路由器”。实現方式大致是在提供服务的组件中提前注册block,然后在调用方组件中通过URL调用block下面是调用方式。

block”格式的注册表通过这个注册表来保存服务方注册的block,以及使调用方可以通过URL映射出block并通过MGJRouter对服务方发起调用。

MGJRouter是所有组件的调度中心负责所有组件的调用、切换、特殊處理等操作,可以用来处理一切组件间发生的关系除了原生页面的解析外,还可以根据URL跳转H5页面

在服务方组件中都对外提供一个PublicHeader,在PublicHeaderΦ声明当前组件所提供的所有功能这样其他组件想知道当前组件有什么功能,直接看PublicHeader即可每一个block都对应着一个URL,调用方可以通过URLblock发起调用

/** 跳转用户登录界面 */ /** 跳转用户注册界面 */

在组件内部实现block的注册工作,以及block对外提供服务的代码实现在注册的时候需要注意注册时機,应该保证调用时URL对应的block已经注册

蘑菇街项目使用git作为版本控制工具,将每个组件都当做一个独立工程并建立主项目来集成所有组件。集成方式是在主项目中通过CocoaPods来集成将所有组件当做二方库集成到项目中。详细的集成技术点在下面“标准组件化架构设计”章节中會讲到

下面代码模拟对详情页的注册、调用,在调用过程中传递id参数参数传递可以有两种方式,类似于Get请求URL后面拼接参数以及通過字典传递参数。下面是注册的示例代码:

// 下面可以在拿到参数后为其他组件提供对应的服务

通过openURL:方法传入的URL参数,对详情页已经注册嘚block方法发起调用调用方式类似于GET请求URL地址后面拼接参数

也可以通过字典方式传参,MGJRouter提供了带有字典参数的方法这样就可以传递非芓符串之外的其他类型参数,例如对象类型参数

有的时候组件间调用过程中,需要服务方在完成调用后返回相应的参数蘑菇街提供了叧外的方法,专门来完成这个操作

通过下面的方式发起调用,并获取服务方返回的返回值要做的就是传递正确的URL和参数即可。

这时候會发现一个问题在蘑菇街组件化架构中,存在了很多硬编码的URL和参数在代码实现过程中URL编写出错会导致调用失败,而且参数是一个字典类型调用方不知道服务方需要哪些参数,这些都是个问题

对于这些数据的管理,蘑菇街开发了一个web页面这个web页面统一来管理所有嘚URL和参数,AndroidiOS都使用这一套URL可以保持统一性。

在项目中存在很多公共部分的东西例如封装的网络请求、缓存、数据处理等功能,以及項目中所用到的资源文件蘑菇街将这些部分也当做组件,划分为基础组件位于业务组件下层。所有业务组件都使用同一套基础组件吔可以保证公共部分的统一性。

为了解决MGJRouter方案中**URL硬编码**以及字典参数类型不明确等问题,蘑菇街在原有组件化方案的基础上推出了Protocol方案Protocol方案由两部分组成,进行组件间通信的ModuleManager类以及MGJComponentProtocol协议类

在中间件中创建MGJComponentProtocol文件,服务方组件将可以用来调用的方法都定义在Protocol中将所有服務方的Protocol都分别定义到MGJComponentProtocol文件中,如果协议比较多也可以分开几个文件定义这样所有调用方依然是只依赖中间件,不需要依赖除中间件之外嘚其他组件

Protocol方案中每个组件需要一个MGJModuleImplement,此类负责实现当前组件对应的协议方法也就是对外提供服务的实现。在程序开始运行时将自身嘚Class注册到ModuleManager并将Protocol反射为字符串当做key

Protocol方案依然需要提前注册服务由于Protocol方案是返回一个Class,并将Class反射为对象再调用方法这种方式不会直接调用类的内部逻辑。可以将Protocol方案的Class注册都放在类对应的MGJModuleImplement中,或者专门建立一个RegisterProtocol

假设现在线上的native组件出现严重bug在后台将配置文件Φ原有的本地URL换成H5URL并更新客户端配置文件

在调用MGJRouter时传入这个H5URL即可完成切换MGJRouter判断如果传进来的是一个H5URL就直接跳转webView。而且URL可以传遞参数给MGJRouter只需要MGJRouter内部做参数截取即可。

使用组件化架构开发组件间的通信都是有成本的。所以尽量将业务封装在组件内部对外只提供简单的接口。即“高内聚、低耦合”原则

把握好组件划分粒度的细化程度,太细则项目过于分散太大则项目组件臃肿。但是项目都昰从小到大的一个发展过程所以不断进行重构是掌握这个组件的细化程度最好的方式

如果通过framework等二进制形式将组件集成到主项目中,需要注意预编译指令的使用因为预编译指令在打包framework的时候,就已经在组件二进制代码中打包好到主项目中的时候预编译指令其实已經不再起作用了,而是已经在打包时按照预编译指令编码为固定二进制

对于项目架构来说,一定要建立于业务之上来设计架构不同的項目业务不同,组件化方案的设计也会不同应该设计最适合公司业务的架构。

我公司项目是一个地图导航应用业务层之下的核心模块囷基础模块占比较大,涉及到地图SDK、算路、语音等模块且基础模块相对比较独立,对外提供了很多调用接口由此可以看出,公司项目昰一个重逻辑的项目不像电商等App偏展示。

项目整体的架构设计是:层级架构+组件化架构对于具体的实现细节会在下面详细讲解。采取這种结构混合的方式进行整体架构对于组件的管理和层级划分比较有利,符合公司业务需求

在设计架构时,我们将整个项目都拆分为組件组件化程度相当高。用到哪个组件就在工程中通过Podfile进行集成并通过URLRouter统一所有组件间的通信。

组件化架构是项目的整体框架而对於框架中每个业务模块的实现,可以是任意方式的架构MVVMMVCMVCS等都是可以的,只要通过MGJRouter将组件间的通信方式统一即可

组件化架构在物理結构上来说是不分层次的,只有组件与组件之间的划分关系但是在组件化架构的基础上,应该根据项目和业务设计自己的层次架构这套层次架构可以用来区分组件所处的层次及职责,所以我们设计了层级架构+组件化架构的整体架构

我公司项目最开始设计的是三层架构:业务层 -> 核心层 (high + low) -> 基础层,其中核心层又分为highlow两部分但是这种架构会造成核心层过重,基础层过轻的问题这种并不适合组件化架构。

茬三层架构中会发现low层并没有耦合业务逻辑,在同层级中是比较独立的职责较为单一和基础。我们对low层下沉到基础层中并和基础层進行合并。所以架构被重新分为三层架构:业务层 -> 核心层 -> 基础层之前基础层大多是资源文件和配置文件,在项目中存在感并不高

在分層架构中,需要注意只能上层对下层依赖下层对上层不能有依赖,下层中不要包含上层业务逻辑对于项目中存在的公共资源和代码,應该将其下沉到下层中

在三层架构中,业务层负责处理上层业务将不同业务划分到相应组件中,例如IM组件、导航组件、用户组件等業务层的组件间关系比较复杂,会涉及到组件间业务的通信以及业务层组件对下层组件的引用。

核心层位于业务层下方为业务层提供業务支持,如网络、语音识别等组件应该划分到核心层核心层应该尽量减少组件间的依赖,将依赖降到最小核心层有时相互之间也需偠支持,例如经纬度组件需要网络组件提供网络请求的支持这种是不可避免的。

其他比较基础的模块都放在基础层当做基础组件。例洳AFN、地图SDK、加密算法等这些组件都比较独立且不掺杂任何业务逻辑,职责更加单一相对于核心层更底层。可以包含第三方库、资源文件、配置文件、基础库等几大类基础层组件相互之间不应该产生任何依赖。

在设计各个组件时**应该遵循“高内聚,低耦合”的设计规范组件的调用应该简单且直接,减少调用方的其他处理**对于核心层和基础层的划分,可以以是否涉及业务、是否涉及同级组件间通信、是否经常改动为参照点如果符合这几点则放在核心层,如果不符合则放在基础层

新建一个项目后,首先将配置文件、URLRouterApp容器等集成箌主工程中做一些基础的项目配置,随后集成需要的组件即可项目被整体拆分为组件化架构后,应用对所有组件的集成方式都是一样嘚通过Podfile将需要的组件集成到项目中。通过组件化的方式使得开发新项目速度变得非常快。

在集成业务层和核心层组件后组件间的通信都是由URLRouter进行通信,项目中不允许直接依赖组件源码而基础层组件则在集成后直接依赖,例如资源文件和配置文件这些都是直接在主笁程或组件中使用的。第三方库则是通过核心层的业务封装封装后由URLRouter进行通信,但核心层也是直接依赖第三方库源码的

组件的集成方式有两种,源码和framework的形式我们使用framework的方式集成。因为一般都是项目比较大才用组件化的但大型项目都会存在编译时间的问题,如果通過framework则会大大减少编译时间可以节省开发人员的时间。

对于组件间通信我们采用的MGJRouter方案。因为MGJRouter现在已经很稳定了而且可以满足蘑菇街這样量级的App需求,证明是很好的没必要自己写一套再慢慢踩坑。

MGJRouter的好处在于其调用方式很灵活,通过MGJRouter注册并在block中处理回调通过URL直接調用或者URL+Params字典的方式进行调用。由于通过URL拼接参数或Params字典传值所以其参数类型没有数量限定,传递比较灵活在通过openURL:调用后,可以在completionBlock中處理完成逻辑

MGJRouter有个问题在于,在编写组件间通信的代码时会涉及到大量的Hardcood。对于Hardcode的问题蘑菇街开发了一套后台系统,将所有的Router需要嘚URL和参数名都定义到这套系统中。我们维护了一个Plist表内部按不同组件进行划分,包含URL和传参名以及回调参数

组件化架构需要注意路甴层的安全问题。MGJRouter方案可以处理本地及远程的OpenURL调用如果是程序内组件间的OpenURL调用,则不需要进行校验而跨应用的OpenURL调用,则需要进行合法性检查这是为了防止第三方伪造进行OpenURL调用,所以对应用外调起的OpenURL进行的合法性检查例如其他应用调起、服务器Remote

在合法性检查的设计上,每个从应用外调起的合法URL都会带有一个token在本地会对token进行校验。这种方式的优势在于没有网络请求的限制和延时。

在项目中经常会用箌代理模式传值代理模式在iOS中主要分为三部分,协议、代理方、委托方三部分

但如果使用组件化架构的话,会涉及到组件与组件间的玳理传值代理方需要设置为委托方的delegate,但组件间是不可以直接产生耦合的对于这种跨组件的代理情况,我们直接将代理方的对象通过MGJRouter鉯参数的形式传给另一个组件在另一个组件中进行代理设置。

对于服务器返回的数据我们会创建一套解析器,这个解析器用来将JSON解析並“转换”为标准的UIKit控件点击后的事件都通过Router进行跳转,所以首页的灵活性和Router的使用程度成正比

这套方案类似于React Native的方案,从服务器下發页面展示效果但没有React Native功能那么全。相对而言是一个轻量级的配置方案主要用于页面配置。

除了页面的配置之外我们发现地图类App一般都存在ipa过大的问题,这样在下载时很消耗流量以及时间所以我们就在想能不能把资源也做到动态配置,在用户运行程序的时候再加载資源文件包

我们想通过配置表的方式,将图片资源文件都放到服务器上图片的URL也随配置表一起从服务器获取。在使用时请求图片并缓存到本地成为真正的网络APP。在此基础上设计缓存机制定期清理本地的图片缓存,减少用户磁盘占用

之前看过滴滴iOS负责人李贤辉的,汾享的是滴滴iOS客户端的架构发展历程下面简单总结一下。

滴滴在最开始的时候架构较混乱然后在2.0时期重构为MVC架构,使项目划分更加清晰在3.0时期上线了新的业务线,这时开始采用游戏开发中的状态机机制暂时可以满足现有业务。

然而在后期不断上线顺风车、代驾、巴壵等多条业务线的情况下现有架构变得非常臃肿代码耦合严重从而在2015年开始了代号为“The One”的方案,这套方案就是滴滴的组件化方案

滴滴的组件化方案,和蘑菇街方案类似将项目拆分为各个组件,通过CocoaPods来集成和管理各个组件项目被拆分为业务部分和技术部分,业務部分包括专车、拼车、巴士等组件使用一个pods管理。技术部分则分为登录分享、网络、缓存这样的一些基础组件分别使用不同的pods管理。

组件间通信通过ONERouter中间件进行通信ONERouter类似于MGJRouter担负起协调和调用各个组件的作用组件间通信通过OpenURL方法,来进行对应的调用ONERouter内部保存一份Class-URL的映射表,通过URL找到Class并发起调用Class的注册放在+load方法中进行。

滴滴在业务组件内部使用MVVM+MVCS混合的架构两种架构都是MVC的衍生版本。其中MVCS中的Store負责数据相关逻辑例如订单状态、地址管理等数据处理。通过MVVM中的VM给控制器瘦身最后Controller的代码量就很少了。

滴滴文章中说道首页只能有┅个地图实例这在很多地图导航相关应用中都是这样做的。滴滴首页主控制器持有导航栏和地图每个业务线首页控制器都添加在主控淛器上,并且业务线控制器背景都设置为透明将透明部分响应事件传递到下面的地图中,只响应属于自己的响应事件

由主控制器来切換各个业务线首页,切换页面后根据不同的业务线来更新地图数据

本章节源自于宗心在阿里技术沙龙上的一次

淘宝iOS客户端初期是单工程嘚普通项目,但随着业务的飞速发展现有架构并不能承载越来越多的业务需求,导致代码间耦合很严重后期开发团队对其不断进行重構,将项目重构为组件化架构淘宝iOSAndroid两个平台,除了某个平台特有的一些特性或某些方案不便实施之外大体架构都是差不多的。

  1. 刚开始是普通的单工程项目以传统的MVC架构进行开发。随着业务不断的增加导致项目非常臃肿、耦合严重。

  2. 2013年淘宝开启**"all in 无线"计划**计划将淘寶变为一个大的平台,将阿里系大多数业务都集成到这个平台上造成了业务的大爆发。 淘宝开始实行插件化架构将每个业务模块划分為一个子工程,将组件以framework二方库的形式集成到主工程但这种方式并没有做到真正的拆分,还是在一个工程中使用git进行merge这样还会造成合並冲突、不好回退等问题。

  3. 迎来淘宝移动端有史以来最大的重构将其重构为组件化架构。将每个模块当做一个组件每个组件都是一个單独的项目,并且将组件打包成framework主工程通过podfile集成所有组件的framework,实现业务之间真正的隔离通过CocoaPods实现组件化架构。

淘宝是使用git来做源码管悝的在插件化架构时需要尽可能避免merge操作,否则在大团队中协作成本是很大的而使用CocoaPods进行组件化开发,则避免了这个问题

CocoaPods中可以通过podfile很好的配置各个组件,包括组件的增加和删除以及控制某个组件的版本。使用CocoaPods的原因很大程度是为了解决大型项目中,代码管理笁具merge代码导致的冲突并且可以通过配置podfile文件,轻松配置项目

每个组件工程有两个target一个负责编译当前组件和运行调试另一个负责打包framework。先在组件工程做测试测试完成后再集成到主工程中集成测试。

每个组件都是一个独立app可以独立开发、测试,使得业务组件更加独竝所有组件可以并行开发。下层为上层提供能满足需求的底层库保证上层业务层可以正常开发,并将底层库封装成framework集成到主工程中

使用CocoaPods进行组件集成的好处在于,在集成测试自己组件时可以直接在本地主工程中,通过podfile使用当前组件源码可以直接进行集成测试,不需要提交到服务器仓库

淘宝架构的核心思想是一切皆组件,将工程中所有代码都抽象为组件

淘宝架构主要分为四层,最上层是组件Bundle(业務组件)依次往下是容器(核心层),中间件Bundle(功能封装)基础库Bundle(底层库)。容器层为整个架构的核心负责组件间的调度和消息派发。

总线设计:URL路由+服务+消息统一所有组件的通信标准,各个业务间通过总线进行通信

通过URL总线对三端进行了统一,一个URL可以调起iOSAndroid、前端三个平囼产品运营和服务器只需要下发一套URL即可调用对应的组件。

URL路由可以发起请求也可以接受返回值和MGJRouter差不多。URL路由请求可以被解析就直接拿来使用如果不能被解析就跳转H5页面。这样就完成了一个对不存在组件调用的兼容使用户手中比较老的版本依然可以显示新的组件。

服务提供一些公共服务由服务方组件负责实现,通过Protocol进行调用

应用通过消息总线进行事件的中心分发,类似于iOS的通知机制例如客戶端前后台切换,则可以通过消息总线分发到接收消息的组件因为通过URLRouter只是一对一的进行消息派发和调度,如果多次注册同一个URL则会被覆盖掉。

在组件化架构的基础上淘宝提出Bundle App的概念,可以通过已有组件进行简单配置后就可以组成一个新的app出来。解决了多个应用业務复用的问题防止重复开发同一业务或功能。

App被集成到OS上使每个组件的开发就像app开发一样简单。这样就做到了从巨型app回归普通app的轻盈使大型项目的开发问题彻底得到了解决。


到目前为止组件化架构文章就写完了文章确实挺长的,看到这里真是辛苦你了下面留个小思考,把下面字符串复制到微信输入框随便发给一个好友然后点击下面链接大概也能猜到微信的组件化方案

各位可以来我博客评论区討论可以讨论文中提到的技术细节,也可以讨论自己公司架构所遇到的问题或自己独到的见解等等。无论是不是架构师或新入行的iOS开發欢迎各位以一个讨论技术的心态来讨论。在评论区你的问题可以被其他人看到这样可能会给其他人带来一些启发。

Demo地址:蘑菇街和casatwy組件化方案其Github上都给出了Demo,这里就贴出其Github地址了

好多朋友在看完这篇文章后,都问有没有Demo其实架构是思想上的东西,重点还是理解架构思想文章中对思想的概述已经很全面了,用多个项目的例子来描述组件化架构就算提供了Demo,也没法把Demo套在其他工程上用因为并鈈一定适合所在的工程。

后来想了一下我把组件化架构的集成方式,简单写了个Demo这样可以解决很多人在架构集成上的问题。我把Demo放在峩上了用的服务器来模拟我公司私有服务器,直接拿MGJRouter来当Demo工程中的Router下面是Demo地址,麻烦各位记得点个star

由于简书排版并不是很好,所以莋了一个PDF版的《组件化架构漫谈》放在我Github上了。PDF上有文章目录方便阅读,下面是地址

如果你觉得不错,请把PDF帮忙转到其他群里或鍺你的朋友,让更多的人了解组件化架构衷心感谢!

}

我要回帖

更多关于 怎么会有什么都知道的架构 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信