人猿星球随笔-生活工作点滴

iOS 组件化实践

2019-07-12  本文已影响15人  _Andy_

一、前言

关于为什么组件化,组件化都有哪些好处,我就不细说了,说说我的一点积累,会有很多不足,多多包涵。

  1. 并不是所有工程都适合组件化,如果你的工程规模不大的或单人开发,都不建议组件化,反而降低你的开发效率。工程规模大,团队开发的,组件化确实助力很大。
  2. 组件的拆分,不是所有页面都要做成组件的,一个工程有200多个页面,不可能有这么多的组件,只是某一个大功能会成为一个组件,比如首页组件,个人中心组件,某个功能的二级页面,基础组件(网络请求等 各种封装),如果是购物app,购物车一定是个组件。一个组件内肯定有多个页面和功能的,这个根据自己公司的业务模块来进行合理的划分即可。
  3. 组件是一个单独工程,在没有任何交互的情况下可以独立运行,但这是理想化。一个工程一定会有网络请求,会有一些和其他组件工程共用的类或文件。这些东西不能每个组件都写一遍,所以要有一个基础组件存放网络请求,公共类,图片等。所以组件单独运行实际情况是:组件+基础组件 才能运行
  4. 组件化一般是有一个主工程(壳子)和很多子工程组成,子工程的管理可以使用Workspace ,Workspace是xcode 自带的一种工程方式,多个工程存放在一起,一个Workspace管理多个子工程,这简直就是为组件化而设计的。
  5. 路由或中间件,没接触组件化的同学很多都认为路由或中间件就是组件化 或者是组件化的最重要的,其实路由或中间件只是组件化的一个跳转通信的工具,我觉得相比其他方面路由或中间件的地位很低,很多大神都写过各种思路的路由或中间件,我们选择个上手难度低的 MGJRouter,大家组件化成功后,可以更换其他路由或中间件,试试不同的通信思路。

二、创建Workspace

在github或码云上创建工程 并clone本地工程,或本地创建在上传。组件都是私有库的,不对外暴露,我这个是demo都是公开库了

D3769502-9B50-44B7-B39E-BC028BB87C03.png

TestAppModule 为各组件集合的工程 (Workspace)
TestApp 为主要工程(俗称壳子)最后所有的组件会在这个工程进行联调,并打包。

在桌面的TestAppModule文件夹下创建多个项目工程 例:TestA TestB...


B0776FFF-4B81-4432-A362-5408EFAEC049.png

打开TestAppModule.xcworkspace,点击左下角+号 添加TestA等工程到xcworkspace


16AEE4A1-D442-4D73-81BE-7FD4B1C924FD.png

要选择工程的xcodepro 添加进来


6C647007-B569-4C4D-A8C7-998E5B0078CE.png

最终是这样的


7DE22084-928F-49B4-BE1F-25BF07E4CBF1.png

三、配置组件工程

TestA 等其他工程里如下配置


812CD814-CD20-4A5C-A028-D443B327A98D.png

podspec 配置十分重要,如果我们要集成第三方

重点:Podfile 文件进行配置 ,podspec也要改动

podspec里面的东西比较多 我只截取一部分,更多去工程TestAppModule

![C81AF073-4A7A-4222-8C06-9952C831FD7D.png](https://img.haomeiwen.com/i1830250/d4040636aeaa4128.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Podfile 文件


A9111B8A-3D32-4FB8-8AB6-AACAE27D996D.png

配置好了 我们pod install ,这个步骤可能会有多次的不成功,因为Podfile 文件和 podspec文件 都要写对

再次重申:Podfile 文件进行配置引用第三方 ,podspec也要对应改动

成功后下面打开工程先运行TestA 看看TestBasis与其他工程之间是否关联上
TestA 引用TestBasis 工程里的TestBasisHeader.h类


6BFCB150-0CF2-47B8-A730-807D294D7B79.png

看到log 打印了,证明我们的组件+基础组件的模式成功了

这里要注意一点 我们在配置podspec文件的时候指定了每个组件最后到壳子工程上的文件,只有在Classses文件下的类才能集成进壳子


C81AF073-4A7A-4222-8C06-9952C831FD7D.png

TestA 为例Classses文件 下的类才才能被集成的壳子内,其他的不行,但是每个组件单独运行时没有区别,所以ViewController可以引用TestBasisHeader.h,并使用TestBasis的方法。但无法集成到壳子工程内。


8B7652D7-8C6C-40F5-8262-237E53CB48D5.png
Classses文件 的pch 要解释一下 9279975B-B536-455A-9822-C7A4FDAD9470.png

这个文件用不用都可以。pch文件在这的作用就是解耦,可以看到我把TestBasisHeader.h 文件放到这里,TestA工程内都可以使用了。这是优点,弊端也很明显引用TestBasisHeader.h 相当于大量的头文件和宏定义放到pch里边,导致编译时间过长。到后期壳子编译会很慢。
如果 你的某个组件没有使用pch,在组件里podspec 文件,要把对应的 prefix_header_file 注释掉。否则主工程pods会报错

我先在各工程中简单的布局,并在TestARoute.m中把路由注册上。


9D7F64AA-222B-4E09-9DC6-AF2B9609517B.png

TestBRoute TestCRoute 都一样上
这时候我们可能会添加新的文件,类,或图片,需要git上 save 并push,


32217239-B5C8-42CD-B2F4-A233ABC72938.png

四、主工程的联调

五、最后说下注意事项:

  1. 如在组件内新建文件夹 、类、图片等,确保不出错之后,一定要git提交,这时候运行主工程会报错或加载不到 ,主工程要pod install ,如果是图片等资源文件还要clean,运行成功好也要及时的提交git,因为组件化一般都是多人团队开发,git 操作冲突了,会很伤神。
  2. 加载资源文件,如图片等原来方法都会失效,需要路径加载。
  3. 有的组件未必使用基础组件内的某个功能,我的例子却一起引用了,这个解决很灵活可单独引用,也可在pod中操作单独集成,也可把基础组件再次拆分多个组件,根据业务模块来进行合理的划分即可。

工程地址

TestAppModule 组件工程
TestApp 主工程

上一篇 下一篇

猜你喜欢

热点阅读