iOS 组件化(一)
2021-07-08 本文已影响0人
木扬音
组件化
组件化就是将模块单独抽离,分层
,通过制定的通讯
方式,实现解耦
组件化优点
- 模块间的解耦
- 模块重用
- 提交团队开发效率
- 单元测试
需要组件化的情况
- 各个模块之间相互引用严重,造成
高耦合
导致项目维护困难 - 项目规模变大,团队人数变多,导致合并代码经常冲突
- 项目编译耗时很长
- 模块需要进行单元测试
不需要组件化的情况
- 项目较小,模块简单,耦合小
- 模块没有被多个外部模块引用,只是一个小模块
- 团队规模小
- 不需要进行单元测试
组件化的标准
- 模块直接没有耦合,修改自己不会改变其他模块
- 模块可以单独编译
- 模块间数据传递明确,对外接口清晰易维护
- 模块随时可以被相同功能的模块代替
- 模块接口改变时,可以高效的重构
组件化分层
项目在进行组件化时,通常分为三层:基础层
、通用层
、业务层
- 只能上层对下层依赖
- 项目公共资源下沉
- 横向依赖下沉至通用层或者基础层
组件化方案
-
本地组件化
:通过创建library
,利用cocoapods
的workspec
进行本地管理,通过framework方式直接调用 -
cocoapods组件化
:将模块上传到私有库,通过cocoapods
远程管理
本地组件化
1、创建主工程
- 创建主工程
- 集成cocoapods
- 编辑Podfile,执行
pod install
image.png
2、创建组件
我们创建一个Base
模块
- 选择
File --> new --> iOS --> Framework
- 选择正确的
WorkSpace
和Group
,最好放在主工程目录下
关联
- 修改创建的
library
为静态库
静态库
3、调用library
-
新建一个文件,并添加外部属性
image.png -
将需要暴露的外部接口文件,移动到
image.pngBuild Phases -> Headers -> Public
-
在主工程下,选择
image.pngtarget --> Build Phases --> Link Binary With Libraries
,添加YPBaseModule
-
在主工程下,选择
image.pngTarget ->Build Setting -> Search Paths -> User Header Search Paths
里面添加${SRCROOT}
4、使用
**子library之间相互调用和主工程调用类似,只需要添加依赖和暴露header *
5、cocoapods管理三方依赖
platform :ios, '10.0'
use_frameworks!
#配置workspace路径
workspace 'YPProject.xcworkspace'
################# 三方依赖
# 公有
def workspace_pods
pod 'YYModel'
end
# 主工程
def project_only_pods
pod 'Masonry'
end
#网络
def network_layer_pods
pod 'AFNetworking'
end
################# 模块
target 'YPBaseModule' do
#配置library路径
project 'YPProject/YPBaseModule.xcodeproj'
workspace_pods
network_layer_pods
end
################# 主工程
target 'YPProject' do
workspace_pods
project_only_pods
network_layer_pods
end
cocoapods组件化
cocoapods组件化流程1、创建私有仓库
-
登录github
-->点击右上角+号
-->选择new repository
-->输入仓库名字
,选择仓库类型为private
,点击创建
- 将私有库添加到本地
~/.cocoapods/repos
目录
pod repo add TestModule https://github.com/Ymuyangyin/TextModule
2、创建工程
- 终端创建
YPServices
模块
pod lib create YPServices
-
根据提示输入
image.png -
将模块代码拷贝到
image.png/YPServices/Classes
目录下
-
执行
image.pngpod install
,Classes目录下的文件就会更新到pods
中
3、配置
通过修改配置文件YPServices.podspec
- 添加第三方库依赖
s.dependency 'AFNetworking'
- 其他模块引用
//1、修改对应的podspec
s.dependency 'YPServices'
//2、修改podfile
pod 'YPServices', :path => '../../YPServices'
-
加载图片、xib、bundle等文件
- 对应模块的
Assets
文件中添加资源文件 -
spec
配置资源文件路径
s.resource_bundles = { 'YPServices' => ['YPServices/Assets/*'] }
- 访问模块的资源文件需要指定资源文件路径
NSString *path = [[NSBundle bundleForClass:[YPServices class]] pathForResource:@"Player_Video_Url" ofType:@"json"]; NSData *data = [NSData dataWithContentsOfFile:path]; YPErrorView *errorView = [[[NSBundle bundleForClass:[YPServices class]]loadNibNamed:NSStringFromClass([YPErrorView class]) owner:nil options:nil] lastObject];
- 对应模块的
4、提交到git
git init
git add .
git commit -am "首次提交"
//模块仓库地址
git remote add origin https://github.com/Ymuyangyin/YPServices
git push origin master
//添加标签 版本号
git tag -m "first release" "0.1.0"
git push --tags
5、验证podspec文件
-
pod lib lint
:验证本地仓库 -
pod spec lint
:验证本地和远程仓库
6、提交到私有仓库
pod repo push [本地 Spec Repo名称] [podspec文件路径]
//------------
pod repo push TestModule YPServices.podspec
7、使用
打开podfile文件,添加下面指令,执行pod install
#私有spec仓库的地址,而不是某个pod仓库的地址
source 'https://github.com/Ymuyangyin/TestModule'
pod 'YPServices'