前端组件化

组件化

前端组件化_第1张图片

什么是组件化?

前端组件化开发,就是将页面的某一部分独立出来,将这一部分的数据层(M)、视图层(V)和控制层(C)用黑盒的形式全部封装到一个组件内,暴露出一些开箱即用的函数和属性供外部调用。无论这个组件放到哪里去使用,它都具有一样的功能和样式,从而实现复用(只写一处,处处复用),这种整体化的思想就是组件化。


每个组件都是独立的个体,都只负责一块功能。组件之间互相独立,通过特定的方式进行沟通。外部完全不用考虑组件的内部实现逻辑。一个好的前端组件,必须要把维护性,复用性,扩展性,性能做到极致。

组件化与模块化的区别

从历史发展角度来讲
随着前端开发越来越复杂、对效率要求越来越高,由项目级模块化开发,进一步提升到通用功能组件化开发,模块化是组件化的前提,组件化是模块化的演进


从整体概念来讲

  • 模块化是一种分治的思想,述求是解耦,一般指的是 JavaScript 模块,比如用来格式化时间的模块
  • 组件化是模块化思想的实现手段,述求是复用,包含了 template,style,script,script又可以由各种模块组成


从复用的角度来讲

  • 模块一般是项目范围内按照项目业务内容来划分的,比如一个项目划分为子系统、模块、子模块,代码分开就是模块,位于架构业务框架层,横向分块
  • 组件是按照一些小功能的通用性和可复用性抽象出来的,可以跨项目的,是可复用的模块,通常位于架构底层,被其他层所依赖
    前端组件化_第2张图片


**从划分的角度来讲**
  • 模块是从代码逻辑的角度进行划分,方便代码分层开发,保证每个功能模块的职能单一
  • 组件时从 UI 界面的角度进行划分,前端的组件化,方便 UI 组件的重用

为什么要前端组件化

随着前端项目复杂度的急剧增加,我们很容易遇到以下这些场景:

  • 页面逻辑越来越多,代码越写越庞大,容易牵一发而动全身
  • 同样的逻辑在多个地方重复编写,改一个问题要在多个地方进行同样的修改


以上场景带来的问题就是:

  • 项目复杂度增加
  • 重复性劳动多,效率低
  • 代码质量差,不可控


因此前端组件化可以给我们带来:

  • 增加代码的复用性,灵活性
  • 提高开发效率,降低开发成本
  • 便于各个开发者之间分工协作、同步开发
  • 降低系统各个功能的耦合性,提高了功能内部的聚合性
  • 降低代码的维护成本

应用组件化需要考虑的问题

  1. **如何分成各个模块?**我们可以根据业务来进行划分,对于比较大的功能模块可以作为应用的一个模块来使用,但是也应该注意,划分出来的模块不要过多,否则可能会降低编译的速度并且增加维护的难度。
  2. 如何解决组件之间的隔离?
  3. 各个模块之间如何进行数据共享和数据通信?
  4. **如何防止资源名冲突问题?**遵守命名规约就能规避资源名冲突问题。

组件的划分

划分方法

尽可能抽象和解耦。不断抽象出一个跟业务没有关系的模块,它是可以继承的,这就是组件化设计的思维转换。
划分粒度:需要根据实际情况权衡,太小会提升维护成本,太大又不够灵活。
目前还没有一套原则和方法论来指导组件的划分,我们只能根据前人的经验再结合实际情况来进行组件的划分。
关于组件划分的一些建议:

  • 组件之间的依赖应该尽可能的少。
  • 单个组件代码量最好不要超过1000行。
  • 组件划分的依据通常是业务逻辑、功能,要考虑各组件之间的关系是否明确,以及组件的可复用度。
  • 每一个组件都应该有其独特的划分目的,有的是为了复用实现,有的是为了封装复杂度、清晰业务实现。


我经常的做法是:如果看到有多个页面都出现了这个重复元素,则抽取成一个组件。还有在开发之中发现结构相似的也可以考虑抽取成一个组件。没有必要在一开始就把所有都抽取成一个个组件。

组件分类

基础UI组件

这是最小化的组件,它们不依赖于其他组件。作为页面中最少的元素而存在,比如按钮、下拉菜单、对话框等。其中大部分是对原生 Web 元素的封装,例如: