一盛杰、什么是組件化:
組件化就是將單一工程的項(xiàng)目按照功能職責(zé)或者業(yè)務(wù)職責(zé)劃分成一個(gè)一個(gè)模塊,模塊間解耦調(diào)用.
二、組件化想解決的問(wèn)題:
當(dāng)一個(gè)項(xiàng)目開(kāi)發(fā)初期的時(shí)候藐石,開(kāi)發(fā)人員較少即供,業(yè)務(wù)較為簡(jiǎn)單,此時(shí)采用單一工程開(kāi)發(fā)的模式,能保證開(kāi)發(fā)效率贯钩。
當(dāng)項(xiàng)目越來(lái)越大募狂,開(kāi)發(fā)人員越來(lái)越多办素,單一工程開(kāi)發(fā)就會(huì)有一些弊端角雷,諸如
- 代碼耦合嚴(yán)重
- 提交容易出現(xiàn)沖突
- 編譯時(shí)間太長(zhǎng)導(dǎo)致開(kāi)發(fā)效率低
- 代碼冗余嚴(yán)重(相同功能代碼可能反復(fù)被實(shí)現(xiàn))
- 而組件化就是為了解決這些問(wèn)題而出現(xiàn)的
那么它的好處如下:
- 加快編譯速度,不需要編譯整個(gè)項(xiàng)目(每個(gè)組件都有一個(gè)殼工程)
- 方便做針對(duì)性測(cè)試
- 代碼解耦后更利率開(kāi)發(fā)職責(zé)的劃分
- 不容易出現(xiàn)代碼提交沖突
三、組件化帶來(lái)的問(wèn)題:
組件化看起來(lái)十分的棒性穿,解決了很多問(wèn)題勺三,但不是所有APP都適合走組件化的路子,盲目的為了組件化而組件化反而會(huì)因?yàn)楦鞣N原因?qū)е麻_(kāi)發(fā)效率變低需曾。例如一個(gè)兩三個(gè)人維護(hù)業(yè)務(wù)簡(jiǎn)單的項(xiàng)目吗坚,組件化的解耦調(diào)用可能會(huì)導(dǎo)致代碼邏輯變復(fù)雜。組件化粒度過(guò)細(xì)也會(huì)一個(gè)業(yè)務(wù)需求需要修改多個(gè)組件也容易讓代碼追蹤變得困難呆万,與對(duì)應(yīng)組件負(fù)責(zé)人的溝通也會(huì)拖慢開(kāi)發(fā)的進(jìn)度商源。我覺(jué)得只有項(xiàng)目到達(dá)一定規(guī)模后,開(kāi)始出現(xiàn)相對(duì)獨(dú)立的業(yè)務(wù)谋减,團(tuán)隊(duì)人員開(kāi)始增加牡彻,單一項(xiàng)目的開(kāi)發(fā)模式成為了開(kāi)發(fā)效率的掣肘,這個(gè)時(shí)候才是應(yīng)該開(kāi)始做組件化的時(shí)候出爹。
四庄吼、常見(jiàn)的組件化方案:
基于target-action的方式(CTMediator)
- 基于target-action的方式,通過(guò)類擴(kuò)展生成對(duì)應(yīng)模塊入口類的類對(duì)象調(diào)用對(duì)應(yīng)的action方法缎除。
基于router的方式(MGJRouter,HHRouter)
- 基于注冊(cè)router的方式总寻,在項(xiàng)目啟動(dòng)的時(shí)候去注冊(cè)組件和對(duì)應(yīng)的route器罐,調(diào)用組件通過(guò)類openURL的方式,并傳遞復(fù)雜參數(shù)。
不管是基于target-action還是基于router其實(shí)都是通過(guò)OC的反射機(jī)制(runtime)去獲取對(duì)應(yīng)的組件入口類調(diào)用對(duì)應(yīng)的方法渐行,從而達(dá)到解耦的目的轰坊。
五、如何創(chuàng)建私有庫(kù)(本人以碼云為例子):
1祟印、遠(yuǎn)程私有索引倉(cāng)庫(kù)創(chuàng)建
<1>衰倦、創(chuàng)建遠(yuǎn)程私有索引庫(kù)
和創(chuàng)建遠(yuǎn)程工程一樣,名稱我這里就叫TTSpec了旁理,是否開(kāi)源我們選擇私有樊零,至于下邊的語(yǔ)言和初始文件什么的我們選擇勾選readme工程使用說(shuō)明文件(最好是勾選),當(dāng)然也可以選擇不勾線孽文,然后點(diǎn)擊創(chuàng)建驻襟。
創(chuàng)建完成后,碼云做的是相當(dāng)?shù)牟诲e(cuò)芋哭,各個(gè)平臺(tái)下載鏈接和git命令行寫法常用的都給寫出來(lái)了沉衣,我們使用就很方便了,而且以后遇到git命令問(wèn)題也可以來(lái)此處搜索查看减牺。
<2>豌习、倉(cāng)庫(kù)已有,接下來(lái)我們復(fù)制倉(cāng)庫(kù)地址
復(fù)制/克隆倉(cāng)庫(kù)地址我就不多講了拔疚,跟github上一樣(例如:https://gitee.com/tiantengyx/TTTools.git)
<3>肥隆、打開(kāi)終端,將遠(yuǎn)程私有倉(cāng)庫(kù)關(guān)聯(lián)到本地
這里我們將私有庫(kù)關(guān)聯(lián)地址與cocoapods的放在一起稚失。
地址在:找到電腦的資源文件并打開(kāi)栋艳,然后點(diǎn)擊command+shift+.將隱藏的文件展示,就可以看到.cocoapods文件夾下的repos句各,也就是本地統(tǒng)一管理遠(yuǎn)程私有庫(kù)的地方吸占。
在終端打cd+空格,然后將repos文件拖拽到終端凿宾,也就是指到repos的文件目錄下矾屯。
cd /Users/用戶/.cocoapods/repos
然后終端執(zhí)行(此鏈接即上面點(diǎn)克隆/下載復(fù)制的鏈接)
pod repo add TTSpec https://gitee.com/tiantengyx/TTSpec.git
成功后,我們的repos目錄下會(huì)展示我們的私有索引庫(kù)初厚,如圖
至此我們遠(yuǎn)程私有倉(cāng)庫(kù)的創(chuàng)建并與本地關(guān)聯(lián)已成功完成件蚕,感興趣的可以點(diǎn)開(kāi)自己電腦上repos目錄下master下文件,master是git的遠(yuǎn)程索引庫(kù),每次安裝cocoapods最慢的步驟就是將遠(yuǎn)端索引庫(kù)拉到本地骤坐,以后為了快也可以拷貝其他同事的放在同樣目錄下绪杏。
1、私有代碼倉(cāng)庫(kù)(分為本地和遠(yuǎn)端)
<1>纽绍、創(chuàng)建本地私有代碼倉(cāng)庫(kù)
創(chuàng)建一個(gè)文件夾蕾久,用來(lái)存放本地私有代碼,我這里為了方便展示拌夏,就直接在桌面創(chuàng)建了僧著,名稱叫做TTTools。然后終端cd /Users/用戶/Desktop/TTTools障簿。然后終端執(zhí)行以下命令
cd /Users/用戶/Desktop/TTTools
pod lib create TTTools
會(huì)出以下問(wèn)題盹愚,下圖是我的答案
創(chuàng)建結(jié)束后會(huì)自動(dòng)彈出一個(gè)工程,我們將我們組件化的代碼copy到工程的Classes 目錄下(圖片資源可以拷貝到Assets目錄下),如圖
<2>站故、修改新創(chuàng)建工程的.podSpec文件皆怕,如圖
至此本地私有代碼庫(kù)就已經(jīng)做好了。
<3>西篓、創(chuàng)建遠(yuǎn)程私有代碼庫(kù)
1)愈腾、創(chuàng)建遠(yuǎn)程代碼庫(kù),與剛開(kāi)始一樣岂津,我們同樣在碼云上操作虱黄,名字叫做TTTools。
2)吮成、把本地的代碼提交到遠(yuǎn)程倉(cāng)庫(kù)(切記要先cd到工程目錄下)
cd /Users/tianteng/Desktop/TTTools/TTTools
git remote add origin https://gitee.com/tiantengyx/TTTools
git push -u origin master -f
git add .
git commit -am "提交代碼"
git push -u origin master -f
git tag 0.0.1#(注意橱乱,這里的tag必須和.podSpec文件的版本一致)
git push --tags
3)、對(duì)文件進(jìn)行本地驗(yàn)證和遠(yuǎn)端驗(yàn)證
pod lib lint --allow-warnings #本地驗(yàn)證
成功則如圖:
pod spec lint --use-libraries --allow-warnings #遠(yuǎn)端驗(yàn)證
成功則如圖:
4)粱甫、將本地.podspec文件推送到本地索引庫(kù)(注意工程名稱一定要對(duì)應(yīng)上)
pod repo push TTSpec TTTools.podspec --use-libraries --allow-warnings #(如果前面一步加了--use-libraries --allow-warnings 此時(shí)務(wù)必加上,不加這報(bào)錯(cuò))
成功則如圖:
此時(shí)TTSpec下面多出的文件和內(nèi)容如圖:
至此我們的組件化模塊算是已經(jīng)完成泳叠,下面我們?nèi)ヲ?yàn)證是否可使用。
接下來(lái)見(jiàn)證奇跡的時(shí)刻到了:新建一個(gè)工程測(cè)試魔种,切記podfile文件頭部加上倉(cāng)庫(kù)的source源(例如我的就是:source 'https://gitee.com/tiantengyx/TTSpec.git')析二,成功如下圖:
如果想更新庫(kù)的版本并且推送上去粉洼,則需要重新修改版本號(hào)并提交
流程如下:
#A节预、工程中修改你要修改的代碼等。
#B属韧、.podSpec文件中修改版本號(hào)安拟,設(shè)置成你此次修改的版本,然后打tag宵喂,推送到遠(yuǎn)端糠赦。
cd /Users/tianteng/Desktop/TTTools/TTTools
git push -u origin master
git add .
git commit -am "提交0.0.2版本"
git push -u origin master
git tag 0.0.2
git push --tags
pod repo push TTSpec TTTools.podspec --use-libraries --allow-warnings
感謝以下博主提供的參考:
<1>iOS組件化思考,什么是組件化,組件化想解決的問(wèn)題是什么?http://www.reibang.com/p/9fe2e96c097a
<2>ios 組件化整理
http://www.reibang.com/p/2030de45055e