一、构建工具是什么?
构建工具是一个把源代码生成最终可执行代码的自动化工具。
简单点说,就是把 es6、less、模板等这样的源代码,转换成可以执行的 JavaScript、CSS、HTML 代码。包括如下内容:
- 代码转换:将 TypeScript 编译成 JavaScript、将 SCSS 编译成 CSS等。
- 文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。
- 代码分割:提取多个页面的公共代码,提取首屏不需要执行部分代码让其异步加载。
- 在采用模块化的项目里会有很多个模块和文件,需要通过构建功能将模块分类合并成一个文件。
- 自动刷新:监听本地源代码变化,自动重新构建、刷新浏览器。
- 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
- 自动发布:更新代码后,自动构建出线上发布代码并传输给发布系统。
目前已有的构建工具包括:Gulp、FIS、Webpack、Rollup、Parcel等。
下面将笼统的介绍下它们的构建流程。
二、构建流程
以上列出的目前流行的构建工具中,构建流程大体分两类。
1. “流式”流程(代码构建方式)
典型的就是gulp,它的构建流程看代码就能直观的了解。
1 | var gulp = require('gulp'); |
这种构建方式优点是简单、灵活,但对于模块化开发、复杂项目却不是那么友好,需要写一大堆构建代码。
2. “插件式”流程(配置构建方式)
典型的就是webpack,先看下它的配置文件
1 | module.exports = { |
这样的配置文件一般会有entry、output、plugin等配置项。
先看副图,感受下webpack构建流程:
webpack的核心就是其插件系统,简单来说,就是webpack在整个构建过程中埋了很多个事件,我们可以事先在配置文件中(plugins)配置所需要的钩子函数,当webpack构建执行到相应事件时,会触发这个事件对应的钩子函数,执行自定义流程。这种插件系统最大的优势就是非常灵活,方便系统的拓展。
简单来看构建流程,大概是这样:
如果简化为单文件流程,可简化为这样:
1 | resolve -> compile -> emit |
下面我们将介绍 js 单文件的编译流程
三、js编译流程
一个 js 文件会经过 babel、uglify-js 等工具的处理,核心是将源码转化为 ast,然后进行相应的处理。
看完代码转换,我们再看下webpack模块系统的实现感受下:
1 | // a.js |
了解了代码转换后,再看下其它联想:比如去掉代码中所有的console?
UglifyJS配置
四、总结
当我们了解了编译流程后,我们就能更清晰的了解整个前端代码从源码到最终可执行代码的变换。理论上所有的构建过程前端都可以介入,在需要的时候可以自定义更改构建流程。
参考
- [1] 前端构建工具发展及其比较
- [2] 细说 webpack 之流程篇
- [3] 了不起的 Webpack 构建流程学习指南