# 组件化、模块化、插件、子应用、框架、库理解



> 作为大前端时代下开发的我们，经常会被组件化、模块化、框架、库、插件、子应用等术语所迷惑。甚至有些人将组件化和模块化的概念混混为一谈。大量的博客和文章将这些概念混淆，误导了诸多读者。所以本文的目的主要是结合作者本人前后端、移动端等经验，谈谈这几个概念。


## 组件

组件，最初的目的是为了**代码重用**。功能相对单一、独立。在整个系统结构中位于最底层，被其他代码所依赖。组件是 **“纵向分层”**


## 模块

模块，最初的目的是将同一类型的代码整合在一起，所以模块的功能相对全面、复杂些，但都同属于一个业务。不同模块之间也会存在相互依赖的关系，但大多数情况下这种相互依赖的关系只是业务之间的相互跳转。所以不同模块之间的地位是平级的。模块是 **“横向分块”**

因为从代码组织层面上讲，组件化开发是纵向分层，模块化是横向分块。所以模块化和组件化之间没有什么必然的联系。你可以将工程中的代码，按照功能模块进行逻辑上的拆分，然后将代码实现，按照模块化开发的思想，只需相应的代码按照**高内聚**的方式进行整合。假如一个 iOS 工程，使用 cocoapods 组织代码，将模块 A 相关的代码进行整理打包。

但是这样结果就是你的 App 工程虽然按照模块化的方式进行组织开发，那么某个功能模块进行修改或者升级的时候只需要修改相应模块的代码。假如个人中心模块和购物车模块都有数据持久化的代码。在不使用组件化开发的时候可能在2个模块的代码里面都有数据持久化的代码。这样一个地方有问题改动，另一个也要改动，这样工程组织方式不友好且代码复用率低。

那么在实际的项目中我们一般是组件化结合模块化一起开发的。


|类别| 目的 | 特点 | 接口 | 成果 |  架构定位 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|组件化|重用、解耦|高重用、低耦合|无统一接口|基础库、基础组件|纵向分层|
|模块化|封装、隔离|高内聚、低耦合|有统一接口|业务模块、业务框架|横向切块|


参考：
- https://blog.csdn.net/blog_jihq/article/details/79191008
- https://blog.csdn.net/blog_jihq/article/details/80669616


- RN iOS 插件化开发