iOS项目组件化

简介: 随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

前言

随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

组件化

  • 为什么我们需要组件化 项目模块间的解耦、模块实现可重用、提升团队成员之间团队之间的协作开发效率、更方便单元测试。
  • 并不是所有的项目都适合组件化 如果你的项目较小,模块之间交互简单,耦合很少;模块没有被外部模块引用,只是一个单独的小模块;模块不需要重用,代码也很少被修改;团队规模很小。那么,你对项目就没有必要做组件化。

如果你的项目有以下三个特征以上,就要考虑下进行组件化了:

  1. 模块逻辑复杂,多个模块之间频繁互相引用
  2. 项目规模逐渐变大修改代码变的越来越困难(这里可以理解为:修改一处代码,需要同时修改其他多个地方);
  3. 团队人数变多,提交的代码经常和其他成员冲突
  4. 项目编译耗时较长
  5. 模块的单元测试经常由于其他模块的修改失败
  • 组件化的8条指标

一个项目经过组件化后如何来评判项目组件化是否彻底或者说是否优秀,可以通过以下几个方面:

  1. 模块之间没有耦合,模块内部的修改不影响其他模块;
  2. 模块可以单独编译
  3. 模块间数据传递明确
  4. 模块可以随时被另一个提供了相同功能的模块替换
  5. 模块对外接口清晰且易维护;
  6. 模块接口改变时,此模块的外部代码能够被高效重构
  7. 尽量用最少的修改和代码,让现有的项目实现模块化;
  8. 支持OC和Swift,以及混编。

前4条主要用于衡量一个模块是否真正解耦后4条主要用于衡量在项目实践中的易用程度

组件化分层

一般一个项目主要分为三层:业务层、通用层、基础层

image-20221010183722274.png

组件化封层之后,需要遵循一下原则:

  1. 只能 上层对下层 依赖, 不能 下层对上层 依赖(下层是对上层的抽象);
  2. 项目公共代码资源下沉;
  3. 横向的依赖尽量少有,最好下称到通用模块或者基础模块。

cocoapods组件化

1.创建远程私仓

  • 从git等代码托管平台或者公司的git仓库创建远程代码仓库
  • 本地仓库和远程仓库关联,并作为组件化工程目录。
    建议使用公司的git仓库,可以公开给需要的人员使用,也避免代码泄露问题。
    具体操作参考git的使用

2.创建组件模块工程

打开终端,cd到工程目录下执行命令:pod lib creat 组件名

如我的组件名称为:component-test, 命令:pod lib create component-test

image-20221010195132961.png

创建完成工程的目录如下:

image-20221010203703371.png

编译成功之后,就可以把自己整理的组件化相关的代码拖入到对应的目录Classes下

路径如下:

image-20221010204241595.png

测试组件化代码如下

IWComponent.h文件如下#ifndef IWComponent_h#define IWComponent_h#import "IWNStringRegex.h"#endif /* IWComponent_h */IWNStringRegex.h文件如下#import NS_ASSUME_NONNULL_BEGIN@interfaceIWNStringRegex : NSObject+ (BOOL)isValidEmail:(NSString*)email;
@endNS_ASSUME_NONNULL_ENDIWNStringRegex.m文件如下#import "IWNStringRegex.h"@implementationIWNStringRegex+ (BOOL)isValidEmail:(NSString*)email{
NSString*emailRegex=@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate*emailTest= [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTestevaluateWithObject:email];
}
@end

3.使用示例应用程序测试组件功能

  • Classes 中的文件修改后,打开终端cd到Example下进行 pod install (刚才添加到 Classes 中的文件夹 pod 进来)

image-20221010201904673.png

  • 引入头文件,使用相应的功能
#import "IWViewController.h"#import "IWComponent.h"@interfaceIWViewController ()
@end@implementationIWViewController- (void)viewDidLoad{
    [superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.NSString*email=@"fan@iw.com";
BOOLisEmail= [IWNStringRegexisValidEmail:email];
NSLog(@"是否是邮箱:%d", isEmail);
}
- (void)didReceiveMemoryWarning{
    [superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.}
  • 测试结果:
2022-10-1020:50:29.628168+0800component-test_Example[1448:25782] 是否是邮箱:1

4.修改 podspec 文件

  • 编译示例应用工程,测试组件通过,开始修改 podspec 文件。

一般修改一下几个内容:

  1. 修改版本号
  2. 修改项目的简单概述和详细概述
  3. 修改 homepage 和 source 地址
  4. 添加依赖库

podspec常用字段含义和修改如下

## Be sure to run `pod lib lint component-test.podspec' to ensure this is a# valid spec before submitting.## Any lines starting with a # are optional, but their use is encouraged# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html#Pod::Spec.newdo |s|
s.name='component-test's.version='0.1.0's.summary='组件的简介'# This description is used to generate tags and improve search results.#   * Think: What does it do? Why did you write it? What is the focus?#   * Try to keep it short, snappy and to the point.#   * Write the description between the DESC delimiters below.#   * Finally, don't worry about the indent, CocoaPods strips it!s.description=<<-DESC  组件的详细描述                       DESC# s.homepage 作者主页地址  s.homepage         = 'https://gitee.com/taijuios'  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  #license 开源协议  s.license          = { :type => 'MIT', :file => 'LICENSE' }  # author 作者信息  s.author           = { 'wangtaiju' => 'wang.taiju@iwhalecloud.com' }  # source 组件地址,需要组件的git远程仓库地址一致  s.source           = { :git => 'git@gitee.com:taijuios/component-test.git', :tag => s.version.to_s }  # s.social_media_url = 'https://twitter.com/'  # ios.deployment_target 平台和运行最低系统  s.ios.deployment_target = '10.0'  # source_files 组件源代码路径  s.source_files = 'component-test/Classes/**/*'  # resource_bundles 组件所需资源路径,如图片  # s.resource_bundles = {  #   'component-test' => ['component-test/Assets/*.png']  # }  # public_header_files 对外公开的头文件   s.public_header_files = 'Pod/Classes/IWComponent.h'  # s.frameworks = 'UIKit', 'MapKit'  # dependency 依赖的第三方库  # s.dependency 'AFNetworking', '~> 2.3'end

具体语法参考pod官方:https://guides.cocoapods.org/syntax/podspec.html

5.验证podspec文件

编译通过后,终端cd到组件应用根目录, 提交代码到远程仓库,并打tag

git add .
git commit -m"description"git push origin master
git tag 版本号 (注:这里的版本号必须和 podspec 里写的版本号一致)
git push --tags

执行一下命令:

pod spec lint --verbose --allow-warnings --use-libraries

备注:如果远程仓库和podspec文件中的source地址不一致会报错,远程仓库先打tag,tag需要和podspec文件version一致,否则也会报错不通过。

编译常用的一些命令如下:可以根据需求来选择

--use-libraries 开启库编译

--allow-warnings 允许告警

--sources=3rdlib 第三方依赖

--skip-import-validation 跳过验证

--skip-tests 跳过测试

--verbose 输出日志,

终端显示:component-test.podspec passed validation. 表示成功。

6.提交podspec文件索引

  • 添加pod repo
    pod repo add 'repo名称' 远程仓库地址
pod repo add gitee git@gitee.com:taijuios/component-test.git
  • 验证并提交podspec到远程仓库
pod repo push gitee component-test.podspec --verbose --allow-warnings --use-libraries
  • 备注:pod repo 都远程仓库和podspec文件source需要一致。
    完成后可以在本地cocoapods中看到版本索引了
    image-20221011114036776.png

7.测试

  • 新建一个pod管理应用工程
  • Podfile指定组件源和tag
pod'component-test', :git=>'git@gitee.com:taijuios/component-test.git', :tag=>'0.1.0'
  • pod install,并正常使用则成功。


相关文章
|
8月前
|
移动开发 前端开发 测试技术
【Flutter前端技术开发专栏】Flutter中的组件化开发基础
【4月更文挑战第30天】Flutter作为热门的UI框架,以其声明式编程和高效性能深受开发者喜爱。本文聚焦Flutter的组件化开发,阐述组件化开发的代码复用、模块化、团队协作和测试便利等优势。在Flutter中,所有元素几乎都是组件,包括简单按钮到复杂布局。通过继承`StatelessWidget`或`StatefulWidget`创建自定义组件,如示例中的`CustomButton`。组件通过`build`方法构建,并可在其他组件中嵌套使用。理解并掌握组件的样式、布局及使用,对于提升Flutter开发技能至关重要。
159 0
【Flutter前端技术开发专栏】Flutter中的组件化开发基础
|
缓存 前端开发 JavaScript
模块化开发与前端打包工具
模块化开发与前端打包工具
191 0
|
缓存 移动开发 前端开发
iOS项目组件化历程
随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多。 如果所有业务都在同一个App中,并且同时开发人数较少时,抛开代码健壮性不谈,实际的开发体验可能并没有那么糟糕,毕竟作为一个开发,什么地方用什么控件,就跟在HashMap中通过Key获取Value那么简单。 那么当业务成长到需要分化到多个App的时候,组件化的重要性开始体现了。
94 0
|
测试技术 开发工具 Swift
iOS项目组件化
随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。
30249 12
iOS项目组件化
|
开发框架 数据可视化 JavaScript
一套.NetCore+Vue+Uniapp前后端分离的低代码快速开发框架
一个基于.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、表格、图表等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。
1093 0
一套.NetCore+Vue+Uniapp前后端分离的低代码快速开发框架
|
存储 监控 JavaScript
基于vue + electron创造一个随心开发组件的跨端桌面应用(持续更新~)(二)
下面我会从这个应用的一些功能的实现细节讲起,包括初始化,托盘菜单,开机自启,存储用户数据,GitHub信息健康,翻页时钟,打包配置除此之外还有还有项目的使用方式与功能介绍,希望可以给掘友带来帮助。
339 0
基于vue + electron创造一个随心开发组件的跨端桌面应用(持续更新~)(二)
|
存储 缓存 监控
基于vue + electron创造一个随心开发组件的跨端桌面应用(持续更新~)(一)
下面我会从这个应用的一些功能的实现细节讲起,包括初始化,托盘菜单,开机自启,存储用户数据,GitHub信息健康,翻页时钟,打包配置除此之外还有还有项目的使用方式与功能介绍,希望可以给掘友带来帮助。
243 0
|
ARouter Java Android开发
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
558 0
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
|
存储 运维 开发工具
iOS组件化:从零开始搭设私有库
本文主要介绍了iOS私有库的管理方式。在有多个产品线的情况下,其中业务层、自定义的控件、自定义的工具类,如日期处理类、日历、加密类等等,甚至包括App的基础框架都是可以考虑复用,这样一来有效的提高了编码的效率,让开发人员专注主业务的开发,不在为基础的框架、基础的类重复的“造轮子”。
285 0
iOS组件化:从零开始搭设私有库
|
JavaScript 前端开发 索引
《Vue入门到精通系列之二》--- 组件化开发与前端模块化(一)
《Vue入门到精通系列之二》--- 组件化开发与前端模块化
155 0
《Vue入门到精通系列之二》--- 组件化开发与前端模块化(一)