为什么需要组件化
- 模块间解耦
- 模块重用
- 提高团队协作开发效率
- 单元测试
项目需不需要组件化
- 项目较小,模块间交互简单,耦合小
- 模块没有被多个外部模块引用,只是一个单独的小模块
- 模块不需要重用,代码很少被修改
- 团队规模小
如何组件化
组件化分层
- 只能上层对依赖,不能下层对上层的依赖,因为下层是对上层的抽象
- 项目公共代码资源下沉
- 横向的依赖尽量少有,最好下层至通用模块,或者基础模块
组件化方案
常用的组件化方案主要有两种:
- 本地组件化:主要是通过在工程中创建library,利用cocoapods的workspec进行本地管理,不需要将项目上传git,而是直接在本项目中以framework的方法进行调用
- cocoapods组件化:主要是利用cocoapods来进行模块的远程管理,需要将项目上传git(需要注意:这里的组件化模块分为公有库和私有库,对公司而言,一般是私有库)
本地组件化
1、创建主工程
工程结构
集成cocopods,进行本地管理:
$ cd 项目目录
$ pod init
编辑podfile,并执行pod install
2、创建组件
假设有以下几个模块:
主工程:承载主要的表层业务代码
Core:独立存在,应用加密、接口请求等敏感代码
Base:基类封装,拓展,基本的数据处理
Service:服务层,封装业务工具类,例如网络层服务、持久化服务等
Pods:三方依赖
其中,各个模块间的关系如下所示
模块间关系
下面,我们来进行模块的创建,以Core模块为例:
选择new -> project -> iOS -> Framework,新建一个模块
创建library
选择正确的Group 和 WorkSpace(这里需要注意一点:创建的library最好放在主工程根目录下,否则后续podfile执行pod install时会报错)
library与工程关联
将创建的library的Build Settings -> Mach-O Type修改为静态库 Static Library
3、主工程调用library
在CJLCore中新建一个文件,并添加如下代码
//类需要声明为public
public class CJLCoreSetting: NSObject {
//属性需要声明为public
public static let SCRET_KEY = "SCRET_KEY"
}
在Build Phases -> Headers -> Public中将新建的文件添加为public,这样主工程才能访问该文件
修改配置2
在主工程中,选择target -> Linked Frameworks Library中添加CJLCore,只需要build主工程,library能够自动联编
4、使用
首先import CJLCore,然后使用
使用
这里需要注意的是,子library之间的互相调用,与主工程调用library类似,主需要添加依赖、暴露header即可
cocoapods组件化
假设我们需要在CJLCore中封装网络层代码,需要用到三方库Alamofire,在podfile中
platform :ios, '9.0'
inhibit_all_warnings!
use_frameworks!
#配置workspace路径
workspace 'Modularization.xcworkspace'
################# 三方依赖
# 公有
def workspace_pods
pod 'SwiftyJSON'
end
# 主工程
def project_only_pods
pod 'SnapKit'
end
#网络
def network_layer_pods
pod 'Alamofire'
end
################# 模块
target 'CJLCore' do
#配置libray路径
project 'CJLCore/CJLCore.xcodeproj'
workspace_pods
network_layer_pods
end
################# 主工程
target 'Modularization' do
workspace_pods
project_only_pods
network_layer_pods
target 'ModularizationTests' do
inherit! :search_paths
end
target 'ModularizationUITests' do
end
end
除了本地组件化,还可以使用cocoapods,其原理如下图所示