当前位置: 首页 > Web前端 > HTML

前端组件化——优质高效的协作利器

时间:2023-04-02 20:05:37 HTML

编者寄语在这个“不出门就是为国做贡献”的日子里,技委提前祝大家元宵节快乐,祝我们生活幸福像汤圆一样甜美充实。也请朋友们少出门,勤洗手,戴口罩,保护好自己和家人的健康,携手共克时艰!我们相信,阳光会驱散阴霾,一切都会好起来的!小编今天分享一位家长送给倪思源老师的一篇技术不错的文章《前端组件化-高质高效协作利器》。本文主要介绍笔者对组件化的理解,以及如何在群里实现组件化。希望能对大家有所启发和帮助~前言在项目开发过程中,随着业务的不断迭代,很容易暴露出以下问题:1.代码量会不断增加,代码冗余代码会越来越大;2、业务逻辑的复杂度会不断增加。可扩展性和可维护性越来越脆弱;出现问题的主要原因有:1、功能代码的复用方式简单粗暴的复制粘贴;2、多人协作导致代码耦合度高,后期维护扩展方式不合理;针对以上问题,在前端项目工程化的基础上,引入前端组件化,从复用、通信、多人协作等方面对功能模块进行解耦。预期成果:1、通过组件化编码实现功能的封装和复用,减少冗余2、通过组件化协作,实现功能和服务的解耦,高效协作1、什么是前端组件化?前端组件化之前的流程:面向过程-面向对象-面向模块。随着前端业务复杂度的不断提高,传统的基于HTML+JQ的面向流程的开发方式已经难以满足大型项目的迭代和维护。面向对象的方法(继承、封装、多态、实例化结构)、借助模块化加载器(require、sea等)和后来的工程化工具(wp、gulp等)实现的面向模块的方法都是对于封装、配置、复用、业务解耦、协作解耦等优化,提升质量和效率,本文不再赘述。前端的组件化是指通过将项目从上到下拆分,通过组件和业务逻辑的形式,将项目中(之间)通用和可复用的功能解耦,从而实现代码的高内容聚合,低内容聚合耦合,实现可配置、可重用、可扩展的功能模块,然后将这些组件组合成更复杂的组件/页面,同时实现一种在多人协作过程中依赖解耦的项目设计和实现方式。与面向过程、面向对象、面向模块相比,组件化(component-oriented)不仅具有低耦合、高内聚、可配置、可重用、可扩展等优点,而且提供了类似“搭积木”的方式具有更高的灵活性、可扩展性和可维护性。2、为什么要实现前端组件化?1.编码层面的效率提升通过组件化开发方式实现功能模块的封装通过组件的复用减少代码冗余通过组件化开发方式实现功能与业务逻辑的解耦通过组件的集成扩展对项目迭代的支持,提高可扩展性和可维护性2.在协作层面提高效率通过组件化设计,将项目从上到下拆分由页面分工转变为功能组件分工通过组件化设计接口和配置,实现功能和业务的融合3、符合主流框架设计的初衷Vue-基于组件构建应用(Vue中的一切都是组件)React-主要特性之一3、什么时候实现前端组件化?1.如果项目不是一次性开发,需要长期迭代维护:组件化可以实现功能与业务逻辑的解耦,实现功能模块的复用,便于基于已有功能快速响应,并通过拼接组合快速迭代。2、项目包体积需要优化:组件化可以大大提高代码和功能模块的复用性,减少代码冗余。3、多人协作完成同一个项目:组件化的项目拆分分工,避免不同页面相同/相似功能的开发成本、统一维护和扩展成本;同时可以解耦合作伙伴之间的协作,分工更加明确,代码提交不容易发生冲突。4、如何实现前端组件化?一、项目的组件拆分如何拆分?需要从整体上把握项目需求,将通用功能分离;或从现有功能出发,按功能拆分组件;或者从协作的角度,从分工协调上拆分组件。拆分项目的思路是根据Vue官网的一个图解说明:拆分a的两个维度。项目中可以全局共享的基础组件包括但不限于(下拉、点击切换、弹窗、toast提示、加载、空页、Page布局),实现思路可以参考ElementUI和AntD组件库b.项目中可复用的业务组件可以被多次调用,即在同一个页面或多个页面会用到的功能模块(如内容发布、评论等业务组件)·组件的分类和抽象a.基础组件(全局可用的底层组件)——最大泛化开发,泛化配置b.通用组件(页面级复用功能)——满足多场景复用业务b.业务组件(不复用,方便协作)——组件化封装和分离,以后可以扩展和复用。从协作的角度拆分a.分模块开发,避免多人重复工作b.功能相同,统一维护b..相似功能基于已有模块快速拼装*举个栗子:*上图是实际项目中部分功能拆分的例子(已上线):需求:视频详情页(左1),图文详情页(左1)2)、弹出窗口(左3)、弹出层(左4,下)拆分思路:视频页、图文页,除了最上面的视频和图文展示,其他功能相同,组件拆分可以根据功能实现。实现页面重用。组件拆分:组件的分类如图右下角所示:a.基础组件——弹窗组件、登录弹窗层b.通用组件——评论组件、瀑布流b.业务组件——视频播放、图片预览协作层次:a.多人游戏开发b.先开发组件——并行开发c.特殊分配的页面逻辑——无提交代码冲突d.不同页面复用——复用组件,无冗余是的,不需要做复杂的拆分。但是如果出现图文混杂的页面、热门讨论页面……以及其他与这两个页面功能结构相似的页面怎么办?实际情况是这样的。通过已有的功能组件,同样采用“搭积木”的思路开发n个页面。2.组件设计·组件交互设计a.通讯数据传输方式b.通信事件交互方式c.通信风格适配方法组件接口设计(前三种可以满足大部分场景)a.用户定义的类名(extraClass)b.源数据(data)c.交互事件(onTap)d.钩子函数(组件实例化、组件销毁、onShow、onHide)e.组件实例方法(隐藏、刷新)f.通信参数(状态管理中依赖数据的全局Keys)举个栗子:上图是瀑布流组件开发前的设计:瀑布流组件主要设计为接受数据源,翻页时增量数据(性能注意事项)和项目点击报告。这样就实现了功能的封装和内聚。用户使用时只需要做透明配置,同时方便复用。3.开发编队**核心:**数据交互-数据绑定事件交互-事件上报·举个栗子(Vue技术栈下):A.下拉组件的实现:props:a.list-下拉选项数组b.def-默认选项c.map-可以配置列表中需要显示的字段的按键事件:onItemTap:下拉项点击回调B.三个下拉同一个页面的被组件复用,它们是同一个组件的三个实例,相互独立。另外中间的tap开关和下面的列表都是组件,让整个页面涉及的功能高度集成,可复用,统一扩展和维护非常方便,这个页面的搭建还是很干净的和整洁。5.组件化思想的延伸在Vue技术栈下,每个.vue文件都是一个单文件组件。从本质上讲,Vue中的页面也是组件。也可以说,页面也可以通过组件方式构建或使用。·举个栗子:feed-home/index.vue是一个页面。对于分包需求,需要在主包和分包中都有这个页面。操作简单,直接复制一份即可。前期简单,后期维护不易!因此,从单文件组件的本质出发,通过组件引入在子包中引用主包的实例是一个技巧。项目实际测试可以满足。结论在中大型多人协作项目中,通过组件化的方式拆解、设计、开发项目,通过组件化分工协作,可以大大减少代码冗余,降低不同模块的复杂度。在开发协作层面耦合,但也解耦。组件化的实现不是一蹴而就的。需要不断的磨合和配合,建立一致的认知和协作方式。另外,在统一的技术规范和技术栈体系下,跨项目也可以通过npm私有源或者git-submodule实现组件复用。当然,由于业务的限制,目前这还是有些困难的,这也是我们正在努力的方向。