說到組件化開發,網上可以看到很多資料,如蘑菇街、滴滴、淘寶、攜程、豆瓣 、京東的組件化架構。但里面介紹比較多的是在現有app如何拆分,組件間如何通信。沒有說組件該如何去搭建,像網絡請求,json解析這些每個組件都需要用到的共用工具該如何處理。
找了好多資料,大部分都說使用cocoapods創建私有庫,但是我的模塊都是業務模塊,也就是我的有些組件的共用性并不高啊!我只是想讓每個業務線的代碼解耦,方便裝卸就可以。像支付寶這樣,可以插件化的。
如果某個業務線停止了,我可以隨時把代碼從項目中拿掉。我還可以根據需求用現有的組件快速搭建出一個新的app。每個模塊的邏輯都是相對獨立,可能對應的服務都是不同團隊提供,每個組件可以由不同的團隊開發。cocoapods這個私有庫雖然也可以實現,但是我覺的cocoapods大部分的用法都是在一些通用組件上,想我這樣把一個大業務線規為一個組件的好像不是很合適。
cocoapods都做了些什么?pod進來的庫是什么加載到主工程呢?
每個pod項目都會有一個.xcworkspace文件這個其實是蘋果自帶的功能,用來管理組合多個項目。還有一個Pods項目,這個項目里面就是放著一個個我們pod進來的第三方庫和私有“組件”。這個Pods項目里面的代碼和資源是什么引用到主項目里面的?
沒錯,一個個組件都被編譯成靜態庫了,只要在主項目里面引用就可以。我們再找下到底是在哪里引用的?在主項目的Build Phases里面可以看到多了個Embed Pods Frameworks和Copy Pods Resources實行的就是2個.sh文件,這個2個腳本是干嘛的?ssell語言我不懂,但是我猜一個是合并靜態庫,一個是合并資源文件。為什么這么說,因為我看到主項目只引用了Pods.framework,那其它的庫呢?合并到了Pods.framework里面了。
Pods只有一個工程什么可以編譯出那么多個靜態庫?
我想這應該就是你在添加一個組件的時候腳本就會幫你添加一個TARGETS,看下項目:
果然是這樣的。這些pods 插件都幫你做了,所以你都不需要自己去操作。如果不用pods的話這些就都需要你自己手動去做了,其實也是比較麻煩的事情,所以我覺的cocoapods和模塊組件化可以搭配使用。我demo里面還不算完整,并沒有把cocoapods加進去。網絡上組件框架有些有提到cocoapods,有些并沒用cocoapods,也許是項目組件化的比較早,cocoapods還不成熟還是別的原因,這個就不深究了。但是基本可以確定他們每個組件的格式都是靜態庫。早期我也是想每個組件是個獨立的app,然后通過某種技術合并成一個app。但是最后找到的資料都是打成靜態庫(如果有別的方案希望可以分享下)
下面介紹下我的demo吧!
竟然要把我的業務模塊打包成靜態庫,那每個模塊用到一個通用的庫該什么處理?如網絡請求,json解析等,這些基本每個模塊都是需要的,難道都要重復編譯到每個組件里面?不不不,且不說會不會沖突,就是安裝包也該大了不少吧?那如何共用這些通用組件呢?還有我既然是同一個app那我的界面風格應該也是差不多的,所以可能每個模塊都需要繼承同一個基類。所以我的做法就是把這些每個組建都必須用的都抽出來打成一個通用的組件,給每個業務組件依賴。至于資源文件的處理我覺的可以參考cocoapods的原理。
就寫到這里吧!更多的坑等著我們去踩!一起加油