iOS組件化實(shí)踐之路

iOS組件化實(shí)踐之路

前言

隨著應(yīng)用需求逐步迭代写隶,隨著應(yīng)用逐步龐大慕趴,開發(fā)人員越來越多和繁雜冕房。為了更好的管理項(xiàng)目耙册,項(xiàng)目組件化逐漸走入了iOS開發(fā)者視野详拙,通過組件化方式,理想狀態(tài)是:我們能使模塊之間完全解耦饶辙,讓獨(dú)立模塊和獨(dú)立功能能單獨(dú)運(yùn)行畸悬,這樣做有哪些好處蹋宦?

  1. 模塊完全獨(dú)立和解耦咒锻,方便不同團(tuán)隊(duì)之間進(jìn)行協(xié)作
  2. 龐大的工程拆分為了多個(gè)子工程惑艇,編譯和運(yùn)行時(shí)間大大縮短
  3. 方便實(shí)現(xiàn)模塊的版本控制
  4. 方便實(shí)現(xiàn)動(dòng)態(tài)配置化,由于模塊之間的獨(dú)立性思灌,在業(yè)務(wù)逐漸豐富情況下泰偿,我們可以通過配置中心耗跛,對(duì)APP進(jìn)行配置调塌,控制模塊的動(dòng)態(tài)的添加和移除羔砾。
  5. ……

當(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)圖如下:

整體架構(gòu)圖

工程搭建

我們可以利用CocoaPods私有庫(kù)的方式胁镐,對(duì)不同模塊進(jìn)行集成偎血。

初始化模塊

? pod lib create ZFIndex

通過這條命令,能生成模塊基礎(chǔ)代碼和.podspec文件盯漂,我們需要關(guān)心的如下幾點(diǎn)!

Module文件目錄
  • 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)程工程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末江醇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子黔夭,更是在濱河造成了極大的恐慌杭棵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異懒构,居然都是意外死亡秩霍,警方通過查閱死者的電腦和手機(jī)颠悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門灾票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事莹妒。” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵请毛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我黍翎,道長(zhǎng)霎匈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上氏义,老公的妹妹穿的比我還像新娘筒严。我一直安慰自己晒哄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布喇喉。 她就那樣靜靜地躺著,像睡著了一般毅访。 火紅的嫁衣襯著肌膚如雪型酥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天州弟,我揣著相機(jī)與錄音潭陪,去河邊找鬼醋拧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雀费,可吹牛的內(nèi)容都是我干的垄惧。 我是一名探鬼主播到逊,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼件缸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蚕苇!你這毒婦竟也來了盒件?” 一聲冷哼從身側(cè)響起片吊,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤卷员,失蹤者是張志新(化名)和其女友劉穎盈匾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毕骡,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡削饵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了未巫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窿撬。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叙凡,靈堂內(nèi)的尸體忽然破棺而出劈伴,到底是詐尸還是另有隱情,我是刑警寧澤狭姨,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布宰啦,位于F島的核電站,受9級(jí)特大地震影響饼拍,放射性物質(zhì)發(fā)生泄漏赡模。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一师抄、第九天 我趴在偏房一處隱蔽的房頂上張望漓柑。 院中可真熱鬧,春花似錦叨吮、人聲如沸辆布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锋玲。三九已至,卻和暖如春涵叮,著一層夾襖步出監(jiān)牢的瞬間惭蹂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工割粮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盾碗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓舀瓢,卻偏偏與公主長(zhǎng)得像廷雅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 最近在學(xué)習(xí)vue.js的時(shí)候發(fā)現(xiàn)航缀,vue的組件化的思想對(duì)于編寫代碼是一個(gè)非常有用的事情商架。 首先為什么需要組件化? ...
    拂曉的云閱讀 7,157評(píng)論 6 23
  • 該文章屬于<簡(jiǎn)書 — 劉小壯>原創(chuàng)谬盐,轉(zhuǎn)載請(qǐng)注明: <簡(jiǎn)書 — 劉小壯> http://www.jianshu.co...
    Yiart閱讀 4,585評(píng)論 3 49
  • 前言: 本文轉(zhuǎn)自前同事casa的博文甸私,這篇文章是基于runtime實(shí)現(xiàn)的iOS組件化方案,其實(shí)iOS組件化方案基本...
    monkey01閱讀 1,653評(píng)論 1 2
  • 前言 上一篇中我們對(duì)組件化的準(zhǔn)備工作做了介紹飞傀,這篇文章我們以SXNews為例進(jìn)行組件化皇型,Demo地址在這里,殼工程...
    CodeWeaver閱讀 9,494評(píng)論 26 46
  • 跌落在屋檐下的一元錢 澆透了心/ 電瓶車軋過水洼 濺起女人的尖叫 和泥漿一起碾碎了夢(mèng)/ 張牙舞爪的路燈 在抽著鼻涕...
    VVVV碎碎閱讀 145評(píng)論 0 1