工程化这个词涉及的概念其实很宽泛,大多数时候我们说的工程化,似乎只是涉及到编写代码到产出构建产物的过程。
但是,工程化,可以延伸到更远的标准流程中。
首先,软件工程,是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。前端开发其实也是软件开发,所以前端的工程化,也涉及软件工程说的构建、维护的流程。
为什么会诞生软件工程学
了解三次软件危机
软件工程学的但是,其实是软件危机催动的。学科很多就是人们遇到了问题,找到了解决问题的办法。
第一次软件危机发生在上世纪60年代
从60年代中期开始,大容量、高速度计算机问世,使计算机的应用范围迅速扩大,软件开发急剧增长。
高级语言开始出现;操作系统的发展引起了计算机应用方式的变化;大量数据处理导致第一代数据库管理系统的诞生。
软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出,程序设计的复杂度也随之增长。
这些变化导致了一系列问题:
- 软件开发费用和进度失控;
- 软件的可靠性差、质量;
- 生产出来的软件难以维护;
第二次软件危机发生在80年代,彼时的大规模软件常常由数百万行代码组成,有数以百计的程序员参与其中,怎样高效、可靠的构造和维护这样规模的软件成为了一个新的难题。
而且,这时典型需求的是更好的“可组合性”(Composability)、“可延展性”(Malleability)以及“可维护性”(Maintainability)。
面向对象(C++、C#、Java等)就是在这一时期诞生的,更好的软件工程方法(设计模式、重构、测试、需求分析等等)也诞生了,而程序员们也越来越不需要知道硬件是怎么工作。
软件工程这门学科就是在这样的背景下,在遇到种种开发思想,开发工具,研发流程,部署,交付等方方面面的问题的同时不断完善自身理论的。
我们回看前端世界,每每提到前端工程化,总会回顾下当时‘刀耕火种’(高频词汇)的时代,从那个时代一路走来,和软件工程的发展类似的,前端软件的规模,复杂度大到一定程度,就必须要借助工程化思想来做管理了。
前端工程化涉及的方面
代码版本、代码质量、文档管理
- 版本控制系统(VCS)就是我们平时用的Gitlab、Github之类的。用于帮助维护项目历史记录,解决存在冲突的更改,或者回滚。
- 代码质量是为了保证我们程序开发所提交的代码符合规范,这里面各种lint比如eslint、tslint等保证了语法的规范,另外,还有格式化代码等保证了代码自身的书写风格。sonar qube是一个规范平台,但是它是C/S架构的,需要客户端和服务器协同工作,它可以像lint一样校验各种语法,同时还能生成报表;
- 高效的生成文档或者书写文档,比如JSdoc、markdown;
缺陷管理
缺陷管理其实为了促进是开发和测试之间的高效沟通。是双方在同一个平台是共同维护的对缺陷和bug的记录,查看,跟进。
常见的工具有:Trello、Ambition、Jira
构建工具
前端对构建产物是在是太敏感了,比如构建产物的大小和形态就直接影响了产品的性能和体验。这种敏感就导致了在前端工程化中,构建是重中之重。也就造成了从狭义的角度看,似乎工程化的工作都集中在了这里。
这个话题值得细说,但是这里我们就不详细展开了,目前常见的构建技术有Webpack、rollup、gulp。虽然webpack绝对主导,但是其它也术业专攻:rollup通常用来打包库,比如react、vue就是用rollup构建的;gulp可能在node端面向server的应用中常见一些;
基于webpack的构建流程整体就是从入口文件进入,开始遍历各种依赖,在这个过程中加载loader和plugin翻译整合代码,最终生成一个或多个js文件,是为打包产物。
部署管理
这里涉及Web容器(可以简单理解成沙箱软件运行环境集合),当前最流行的容器莫过于Docker,涉及Docker的编排管理就涉及k8s,这又是一个比较复杂,需要学习的一套东西。
CI/CD及流程控制
(这里的C—都是—>continuous,I是集成integration,D是部署delivery)
CI/CD在整个工程化流程管理中尤为重要,这是一套自动化的流程管理机制,一般借助管理平台,串联整个流程。或者说,整个工程化的流程,都能借助CI/CD平台串联。
下图是Jenkins作为平台,串联整个流程的示意图:
CI/CD的优点有:
- 快速反馈回路
- 增加可见度
- 简化故障排除
- 软件质量更高
- 集成问题更少
- 有更多的时间专注于开发
CI/CD这个也是后续需要重点学习,以及要操作实践的东西。