iOS組件化實(shí)踐之路
前言
隨著應(yīng)用需求逐步迭代写隶,隨著應(yīng)用逐步龐大慕趴,開發(fā)人員越來越多和繁雜冕房。為了更好的管理項(xiàng)目耙册,項(xiàng)目組件化逐漸走入了iOS開發(fā)者視野详拙,通過組件化方式,理想狀態(tài)是:我們能使模塊之間完全解耦饶辙,讓獨(dú)立模塊和獨(dú)立功能能單獨(dú)運(yùn)行畸悬,這樣做有哪些好處蹋宦?
- 模塊完全獨(dú)立和解耦咒锻,方便不同團(tuán)隊(duì)之間進(jìn)行協(xié)作
- 龐大的工程拆分為了多個(gè)子工程惑艇,編譯和運(yùn)行時(shí)間大大縮短
- 方便實(shí)現(xiàn)模塊的版本控制
- 方便實(shí)現(xiàn)動(dòng)態(tài)配置化,由于模塊之間的獨(dú)立性思灌,在業(yè)務(wù)逐漸豐富情況下泰偿,我們可以通過配置中心耗跛,對(duì)APP進(jìn)行配置调塌,控制模塊的動(dòng)態(tài)的添加和移除羔砾。
- ……
當(dāng)前主流方案
2016.03.10 蘑菇街App的組件化之路(git文檔被刪除姜凄,見此)
2016.03.13 iOS應(yīng)用架構(gòu)談 組件化方案
2016.03.14 蘑菇街App的組件化之路·續(xù)
2016.03.18 iOS組件化方案探索
2016.03.21 圍觀神仙打架檀葛,反革命工程師《iOS應(yīng)用架構(gòu)談 組件化方案》和蘑菇街Limboy的《蘑菇街 App 的組件化之路》的閱讀指導(dǎo)
通過這幾篇撕逼的文章屿聋,我們對(duì)組件化有了初步的認(rèn)識(shí)和了解润讥,對(duì)組件解耦方式有自己的想法楚殿。在這里我的重點(diǎn)不是組件之間是如何調(diào)用的脆粥,不管怎么調(diào)用,這只是組件化的其中一部分规伐,而組件化還有很多工作需要做匣缘。
組件化實(shí)踐
業(yè)務(wù)劃分
看了許多文章培慌,我們當(dāng)然躍躍欲試,下面我便以一個(gè)簡(jiǎn)化的Demo為例柑爸,實(shí)踐組件化吵护。我們以一個(gè)簡(jiǎn)單的淘寶電商Demo作為業(yè)務(wù)場(chǎng)景,這種最基礎(chǔ)的電商場(chǎng)景大家都非常熟悉竖配,我們對(duì)Demo進(jìn)行初略的模塊劃分:
- BaseEnv模塊:登錄何址,網(wǎng)關(guān),數(shù)據(jù)庫(kù)进胯,JSBridge用爪,基礎(chǔ)Catagory,Util等
- Index業(yè)務(wù)模塊:電商首頁(yè)模塊
- Search業(yè)務(wù)模塊:電商搜索模塊
- ProductDetail業(yè)務(wù)模塊: 商品詳情模塊* Cart業(yè)務(wù)模塊:購(gòu)物車模塊
- ……
大致的結(jié)構(gòu)圖如下:
工程搭建
我們可以利用CocoaPods私有庫(kù)的方式胁镐,對(duì)不同模塊進(jìn)行集成偎血。
初始化模塊
? pod lib create ZFIndex
通過這條命令,能生成模塊基礎(chǔ)代碼和.podspec文件盯漂,我們需要關(guān)心的如下幾點(diǎn)!
-
Example
:子工程運(yùn)行工程,以后的模塊開發(fā)調(diào)試都在此進(jìn)行,而不是在主工程 -
ZFIndex
: 該模塊核心邏輯代碼 -
podspec
:該模塊作為spec提供給外部使用的配置文件
下面看下podspec
文件內(nèi)容
#
# Be sure to run `pod lib lint ZFIndex.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 http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'ZFIndex'
s.version = '0.1.0'
s.summary = 'A short description of ZFIndex.'
# 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
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/<GITHUB_USERNAME>/ZFIndex'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'zf' => 'zf@xxx.com' }
s.source = { :git => 'https://github.com/<GITHUB_USERNAME>/ZFIndex.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'ZFIndex/Classes/**/*'
# s.resource_bundles = {
# 'ZFIndex' => ['ZFIndex/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
這部分代碼是ruby
寫的,具體實(shí)現(xiàn)方案后面會(huì)進(jìn)行分析十气,我們先明白幾個(gè)關(guān)鍵點(diǎn):
-
name
: pod名稱 -
version
: pod版本號(hào) -
source
: pod對(duì)應(yīng)的git地址 -
source_files
: pod對(duì)應(yīng)的源碼文件 -
resource_bundles
: pod工程對(duì)應(yīng)的資源文件 -
frameworks
: pod以framework方式提供需要 -
public_header_files
: pod以framework方式提供需要
主工程引入
主工程通過Podfile
的方式引入,因?yàn)楝F(xiàn)在模塊是存在本地的,因此我們使用本地相對(duì)路徑的方式引入:
Podfile
文件:
require 'cocoapods-multithread-installpod'
platform :ios, '8.0'
target 'ZFModuleDemo' do
pod 'ZFIndex', :path=> '../ZFIndex/'
end
最終工程目錄如下圖:
這樣最簡(jiǎn)易的組件化工程環(huán)境已經(jīng)搭建好了理朋,我們可以開始進(jìn)行模塊開發(fā)。
問題
當(dāng)然,在實(shí)踐過程中,我們還會(huì)遇到很多問題吩案,在后面的文章中我會(huì)逐個(gè)進(jìn)行描述崎岂。
問題1: 組件化-Bundle資源圖片讀取
問題2: 組件化-子模塊Example工程環(huán)境初始化
問題3: 組件化-本地工程引入方式改為git遠(yuǎn)程工程