前言
業(yè)界已經(jīng)有許多技術(shù)文章進(jìn)行了組件化的指導(dǎo)了横漏,這里就不再贅述穴吹。
本文主要講的是小型團(tuán)隊(duì)和小型項(xiàng)目對(duì)于「本地組件化」的實(shí)踐氢惋。
為什么要提出組件化本地化的概念呢桶良?對(duì)于小型項(xiàng)目和小型團(tuán)隊(duì)來(lái)說座舍,可能自身的項(xiàng)目不需要用到組件化,但是又想學(xué)習(xí)和利用組件化的技術(shù)陨帆,組件化的本地化恰好可以滿足這個(gè)需求曲秉。
那么何為本地化的組件化呢?對(duì)于常規(guī)的組件化來(lái)說疲牵,每一個(gè)模塊或者說組件都需要?jiǎng)?chuàng)建為一個(gè)遠(yuǎn)端的組件庫(kù)承二,別的模塊從遠(yuǎn)端加載這個(gè)組件來(lái)使用,這樣就需要管理非常多的庫(kù)纲爸。而本地化的組件化只需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)端的代碼庫(kù)亥鸠,存放所有的代碼,進(jìn)行版本管理识啦,跟平常的代碼管理一樣负蚊,所有的組件也是放在這個(gè)庫(kù)中,無(wú)需創(chuàng)建多個(gè)組件庫(kù)颓哮,所以叫做本地化的組件化家妆。
技術(shù)思路
本地化的組件化的技術(shù)思路是這樣的,項(xiàng)目使用 workspace 來(lái)管理所有的 Project冕茅,其中的一個(gè) Project 為主項(xiàng)目伤极,其他的為不同的組件,新增組件就在這個(gè) workspace 中新建一個(gè) Project姨伤。
運(yùn)行主項(xiàng)目就選用主項(xiàng)目 Project哨坪,運(yùn)行單一組件就選擇這個(gè)組件 Project 進(jìn)行運(yùn)行。
而跨模塊的通信使用的是基于反射的遠(yuǎn)程接口調(diào)用封裝姜挺,基于 CTMediator 開源庫(kù)齿税。
Demo實(shí)踐
比如現(xiàn)在要開發(fā)一款記錄類型的APP彼硫,可以記錄身體信息炊豪,比如身高體重等凌箕,基本的業(yè)務(wù)邏輯是,先進(jìn)行登錄词渤,然后進(jìn)入主功能界面牵舱,提供首頁(yè)記錄功能和我的頁(yè)面兩個(gè) Tab。
以下是具體的實(shí)踐過程:
創(chuàng)建 workspace
如圖方式創(chuàng)建一個(gè)名為 Records.xcworkspace 的 workspace
創(chuàng)建 Project
- 首頁(yè)
- 我的
- 登錄
- 身體信息組件
- 公共組件
按照功能缺虐,劃分為這幾個(gè)組件芜壁,分別創(chuàng)建4個(gè) project,其中首頁(yè)和我的放在主 project中高氮,身體信息慧妄、登錄和公共組件為單一組件,公共組件放一下功能分類剪芍,公共類塞淹,宏定義,后臺(tái)接口文檔之類的罪裹。
command + shift + N 創(chuàng)建 Project
注意要放在 Records 這個(gè) workspace 中
創(chuàng)建完成如圖
構(gòu)造組件
舉個(gè)例子饱普,先完成登錄組件,把項(xiàng)目切換到 登錄
完成登錄的基本業(yè)務(wù)邏輯状共,運(yùn)行沒有錯(cuò)誤之后套耕,進(jìn)行組件化的工作
podspec 文件
在終端創(chuàng)建 podspec 文件
pod spec create 文件名
使用這種方法創(chuàng)建的 podspec 文件會(huì)帶有大量的注釋
touch xx.podspec
使用這種方法會(huì)創(chuàng)建出一個(gè)空白的 podspec 文件
我們創(chuàng)建跟組件同名的 Login.podspec 文件, 詳細(xì)語(yǔ)法參考 Podspec語(yǔ)法參考
Pod::Spec.new do |s|
s.name = 'Login'
s.version = '0.0.1'
s.summary = '登錄組件'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://gitee.com/xxx'
# s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xxx' => 'xxxxxxxxx@qq.com' }
s.source = { :git => 'https://gitee.com/xxx/Login.git', :tag => s.version.to_s }
s.ios.deployment_target = '9.0'
s.source_files = 'Login/Login/*.{h,m}'
s.subspec 'Controller' do |ss|
ss.source_files = 'Login/Login/Controller/*.{h,m}'
end
s.subspec 'Router' do |ss|
ss.source_files = 'Login/Login/Router/*.{h,m}'
end
s.subspec 'View' do |ss|
ss.source_files = 'Login/Login/View/*.{h,m}'
end
s.dependency 'CTMediator'
s.prefix_header_contents = <<-EOS
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif
EOS
end
CTMediator
這是其他組件調(diào)用本組件的入口,通過創(chuàng)建 CTMediator 的分類峡继,獲取該組件入口控制器冯袍,比如當(dāng)前登錄組件就是通過 CTMediator+Login 分類中的方法獲取登錄控制器。
至此碾牌,登錄組件已經(jīng)完成颠猴,按照上訴步驟,完成其他組件的構(gòu)建
組件的調(diào)用
構(gòu)造 Podfile 文件
在 workspace 的根目錄下創(chuàng)建 Podfile 文件小染,并完成構(gòu)建
source 'https://github.com/CocoaPods/Specs.git'
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
workspace 'Records.xcworkspace'
target 'Record' do
project 'Record/Record.xcodeproj'
pod 'CTMediator'
#調(diào)用登錄組件
pod 'Login', :path => '../Record/Login/'
inhibit_all_warnings!
end
#登錄組件
target 'Login' do
project 'Login/Login.xcodeproj'
inhibit_all_warnings!
end
在終端使用以下命令完成本地組件的加載
pod update --no-repo-update
加載完成后翘瓮,可以在 Pods 中的 Development Pods 看到加載的組件
切換到主工程 Record,進(jìn)行登錄組件的調(diào)用
在需要用到組件的地方裤翩,導(dǎo)入組件中的CTMediator分類文件(CTMediator+Login.h)资盅,調(diào)用分類方法,獲取控制器踊赠,進(jìn)行控制器的使用跳轉(zhuǎn)呵扛,demo 是在 AppDelegate 中調(diào)用
#import <Login/CTMediator+Login.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *loginVc = [[CTMediator sharedInstance] loginVc];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVc];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
至此,本地化組件化的基本實(shí)踐流程已完成筐带,具體請(qǐng)參考Demo今穿。