前言
前端工程化本质上是软件工程的一种。软件工程化需要关注性能、稳定性、可用性、可维护性等方面,前端工程化质量保障就是以前端工程化为前提,建立一套方法体系,覆盖前端研发额度生命周期,在生命周期的不同环节中,采取合适的方案,从而提供一套质量保障的解决方案。
1. 工程搭建
工程搭建时需要考虑的是技术方案的调研选型,方案选型考虑不足可能会在后面的研发过程中出现影响工程质量的问题。
2. 版本控制
版本控制是工程化管理中的重要一环,它涉及对软件开发过程中各种程序代码、配置文件、说明文档的文件变更管理。软件开发往往涉及多人协同,版本控制可以记录什么人在什么时候变更了什么内容;在并行开发中,版本控制还可以有效解决版本同步的问题。
在每个开发任务中,需要对基准版本、目标功能版本进行管理。
版本控制工具最常用的就是Git,除此之外还有SVN、CVS等。
3. 代码质量
代码质量一般指代码本身的质量,包括复杂度、重复率、代码风格等。代码质量代表着项目的有序程度,会影响团队维护代码的效率。
代码质量的标准可以用传统的业界标准进行衡量:
- 编码规范:遵循最佳实践和团队编码规范,提升团队协作效率以及代码可维护性
- 可读性:高可读性的代码能够让其他开发人员快速掌握代码的功能和流程,提高团队协作效率。
- 可维护性:可维护性是由多种因素构成的,比如可扩展性、可读性等。具体来说,如果代码分层清晰,模块化好,高内聚低耦合,遵循基于接口而非基于实现编程的设计原则等,就可以提升可维护性。
- 代码重复率:如果代码中存在大量重复代码,就要考虑进行提取,封装成公共的方法或组件。
- 可测试性:代码应该易于进行单元测试,各个功能单元(如函数、组件等)应该具有明确的输入和输出,并且尽可能减少外部依赖。
烂代码的产生往往源于业务压力大,开发人员没有精力追求代码质量,最终形成恶性循环。为了避免这种情况,需要主动对代码质量进行管控,以及持续进行技术升级,进行长期投入。基于代码质量标准原则,可以在不同的阶段进行相应的治理:
- 开发阶段:在团队中建立代码规范制度
- 提交代码:基于代码规范使用自动化工具进行代码质量检查
- 代码评审:从业务逻辑角度,评估需求还原度,检查异常边界情况等
4. 组件建设
组件是对公共模块的封装实现,可以有效解决前端项目的复用性问题。进行组件建设时,需要遵循以下原则:
- 高内聚:每个组件尽量只完成一件事,从而最大限度地聚合。
- 低耦合:组件之间是低依赖的,每个组件是独立的模块,通过简单、明确的接口进行通信,而不是纠缠在一起。
- 可复用性:组件能够在不同的场景中被重复使用,并且在复用过程中只需要进行少量的修改或无需修改就能满足新的需求。
组件可以按照不同的维度划分。
比如,按照组件的复杂度可以划分为:
- 原子组件:颗粒度最细的组件,不可再拆分,比如Button、Switch等
- 复合组件:由多个原子组件或其他复合组件组合而成的新组件
按照组件的可视化进行划分:
- 视图组件:在页面上渲染出来的组件,主要负责用户界面的展示部分。
- 功能组件:侧重于实现特定的业务功能或交互逻辑,比如状态管理等
按照组件的功能领域可以划分为:
- 通用组件:不依赖于特定业务逻辑,具有广泛适用性的组件,可以跨业务复用
- 业务组件:包含了特定业务的逻辑,只在特定的业务模块中使用
组件建设中需要考虑组件规范、组件测试、发布规范等因素。
5. 测试保障
随着软件的大型化、复杂化,只靠开发人员的“调试”往往难以保障软件质量,软件测试成为了软件开发中的重要一环。前端测试在保障质量方面起着重要作用。
常用的前端测试手段包括:
- 单元测试:对组件、函数等最小可测试单元进行检查和验证。问题范围较小,便于开发者及时修复。
- 集成测试:将多个单元组合在一起进行测试,重点关注这些单元之间的接口和交互是否正确。
- 性能测试:主要评估前端应用的性能指标,目的是确保应用在不同的网络环境和设备条件下都能提供流畅的用户体验,及时发现性能瓶颈并进行优化。
- 兼容性测试:跨浏览器测试,确保前端应用在各种主流浏览器上都能正常运行,并且外观和功能保持一致。
6. 持续集成
开发人员要及时将自己的工作进行集成,通过自动化构建来验证,从而尽早地发现集成错误。
前端常见的持续集成检测包括单元测试、代码检测、自动化测试、代码质量检测等。
- 单元测试:验证每个单元的功能是否符合预期,常用的工具是Jest、Mocha等
- 代码检测:是检查代码是否符合预定的风格规范,常用的工具是ESLint、StyleLint等
- 自动化测试:包括集成测试和端到端测试,验证功能流程是否能正确交互和工作,常用的工具有Cypress、Selenium WebDriver
- 代码质量检测:检查代码的复杂度、潜在的安全漏洞、性能问题等方面,目的是评估代码的整体质量,发现可能影响可维护性的问题。常用的工具有SonarQube、CodeClimate
7. 系统部署
前端部署起初是一个非常简单的流程,只需要将静态文件提交到服务器即可。随着互联网的发展,企业为了提升用户体验,开始追求交付质量、性能和稳定性,部署过程也变得复杂。 比如:
- 为了提升性能,静态资源和动态网页分集群部署,静态资源会被部署到CDN节点上
- 为了控制新功能上线的影响面,实行代码灰度、A/B分流
- 新功能上线出现问题时,需要快速回滚
随着部署流程变得复杂,就需要借助工程化的能力来提升部署效率。通过部署平台,开发人员可以通过可视化的方式进行一键部署,并且在平台上可以看到各个环境的运行信息和日志,方便跟踪发布流程和排查发布问题,从而在部署过程中提供质量保障。
8. 页面监控
页面是与用户直接交互的界面,如果线上页面出现卡顿、白屏等问题,就会影响用户正常使用;而对于一些不阻塞交互的JavaScript报错,也需要关注,避免造成更大的问题。为了保障质量,就需要实现页面监控。
页面监控包括:
- 性能监控:监控首屏加载时间、资源加载、帧频等关键指标,可用的工具包括浏览器开发者工具、Performance API,还有第三方性能监控工具:如 Google Analytics、New Relic 等。
- 异常监控:监控JavaScript 错误、资源加载异常、接口请求异常等页面异常。常见的工具有:Sentry。
- 白屏监控:白屏通常是由于页面的 HTML、CSS 和 JavaScript 等资源加载失败,或者加载时间过长导致页面无法正常渲染而出现的。可以对文档和关键资源的加载状态进行监听来实现。
- 卡顿监控:卡顿主要是由于页面的 JavaScript 执行时间过长、频繁的 DOM 操作或者页面渲染性能不足等原因导致的。使用浏览器的性能分析工具(如 Chrome DevTools 的 Performance 面板)来观察主线程上任务的执行情况。
- 用户行为监控:通过用户行为可以提供更多上下文信息,包括用户的访问来源、在页面上的停留时间、浏览顺序等。
9. 请求监控
前端页面主要通过请求与服务器进行数据交互,因此请求在前端页面中扮演了重要角色。请求监控包括:
- 请求拦截:通过拦截器的形式采集请求数据
- 高并发请求:在一定的时间范围内发送的请求数量过多
- 重复请求:在一定的时间范围内发送同一请求的请求数量过多
- HTTP状态码:通过监控 HTTP 状态码发现请求错误,比如当出现错误状态码(如 4xx 或 5xx )超过一定阈值时,触发告警,通知开发人员进行检查。
- 高延迟请求:高延迟请求可能是由于网络问题、服务器性能问题或请求数据量过大等原因导致,监控高延迟请求是为了发现性能瓶颈,及时采取措施
- 被取消的请求:业务发起后由于某些原因被取消
- 业务异常的请求:请求返回业务异常
- 爬虫请求:监听非正常提交的页面请求
10. 资源保障
前端页面依赖的是若干静态资源,比如HTML、CSS、JavaScript、图片等。当图片资源出现问题时可能导致使用体验下降,而HTML、CSS、JavaScript资源出问题可能导致整个前端服务不可用,因此资源保障也是前端质量保障的重要环节。
资源问题主要包括加载失败、加载时间过长、资源劫持等。对于资源加载失败问题,常见的解决方法是全局监听资源加载事件,当资源加载失败时,将资源链接降级到备用资源尝试重新加载,并且上报到前端监控系统,以便后续跟进。
11. 工程质量优化
工程质量优化一般指通过技术手段来改善现有的工程质量问题。比如构建优化、CDN加速、服务端渲染等。
以webpack构建工具为例,提高构建速度的主要手段包括:
- 优化 Loader 配置,通过
exclude
和include
选项减少Loader或Plugin需要处理的文件数量。 - 使用DLL,避免重复构建第三方库
- 启用多进程构建
- 缓存构建结果
减少资源打包体积的主要手段包括:
- 使用Tree Shaking,删除冗余代码
- 代码压缩,包括JavaScript压缩、CSS压缩
- 代码分割,例如按需加载,DLL等
后记
这个系列主要是对《前端工程质量保障体系实践》的学习整理,加上了一些自己的补充,对前端研发工程化和质量保障体系的各个方面提供了一个很好的 roadmap。
前端工程化领域面临的问题和解决方案总是在变化更新,各种前端技术层出不穷。通过了解前端工程化技术的演变过程,以及学习各种工程化解决方案背后的发现问题、分析问题、解决问题的思考过程,希望能够从中收获有益的实践启发。