最近对前端构建工具的一些理解

开发 新闻
构建工具在整个前端体系中占据的位置是越来越重要了。

前言

最近有幸在前端团队里面做了一次关于 webpack 的技术分享。在分享的准备过程中,为了能让大家更好的理解 webpack,特意对市面上以前和现在流行的构建工具做了一个梳理总结。在整理和分享的过程中,获益匪浅,对前端构建工具有了新的认识。在这里,将自己的一些思考总结写出来,希望也能给到对构建工具同样感兴趣的同学一点帮助。

本文的目录结构如下:

  • js 模块化的发展史和构建工具的变化
  • 结束语

构建工具的前世今生

谈到构建工具,大家首先想到的肯定就是 Webpack 以及现在最🔥的 Vite。Webpack,功能强大,生态丰富,从面世到今天,一直是很受大家欢迎;Vite 采用 unbundle 构建模式,带来了极致的开发体验,给开发人员以新的选择。

在这两个构建工具之外,还有其他的构建工具,如和 Webpack、Vite 类似的 Rollup、Parcel、Esbuild,自动化构建工具 grunt、gulp,以及更加久远的 YUI Tool。

这些工具的存在,构成了前端构建工具的发展史。

YUI Tool + Ant

YUI tool 是 07 年左右出现的一个构建工具,功能比较简单,用于压缩混淆 css 和 js 代码,需要配合 java 的 Ant 使用。

当时 web 应用开发主要采用 JSP,还不像现在这样前后端分离,通常是由 java 开发人员来编写 js、css 代码,前端代码都是和后端 java 代码放在一起的。因此前端代码的压缩混淆也就基于 java 实现了。

Grunt / Gulp

Grunt / Gulp 都是运行在 node 环境上的自动化工具。

在开发过程中,我们可以将一些常见操作如解析 html、es6 代码转换为 es5、less / sass 代码转换为 css 代码、代码检查、代码压缩、代码混淆配置成一系列任务,然后通过 Grunt / Gulp 自动执行这些任务。

Grunt 和 Gulp 的不同点:

  • 使用 Grunt的过程中,会产生一些中间态的临时文件。一些任务生成临时文件,其它任务可能会基于临时文件再做处理并生成最终的构建后文件,导致出现多次 I/O。
  • Gulp 有文件流的概念,通过管道将多个任务和操作连接起来,不会产生临时文件,减少了 I/O 操作,流程更清晰,更纯粹,大大加快了构建的速度。

Webpack / Rollup / Parcel

Webpack、Rollup、Parcel 统称为静态模块打包器。

这一类构建工具,通常需要指定入口 - entry,然后以 entry 为起点,通过分析整个项目内各个源文件之间的依赖关系,构建一个模块依赖图 - module graph,然后再将 module graph 分离为三种类型的 bundle: entry 所在的 initial bundle、lazy load 需要的 async bundle 和自定义分离规则的 custome bundle。

这几个构建工具各有优势:

  • Webpack 大而全,配置灵活,生态丰富,是构建工具的首选。
  • Parcel 号称零配置,使用简单,适合不太需要定制化构建的项目使用。
  • Rollup 推崇 ESM 标准开发,打包出来的代码干净,适用于组件库开发。

Vite / Esbuild

新一代构建工具。

esbuild, 基于 go 语言实现,代码直接编译成机器码(不用像 js 那样先解析为字节码,再编译为机器码),构建速度比 webpack 更快。

vite, 开发模式下借助浏览器对 ESM 的支持,采用 nobundle 的方式进行构建,能提供极致的开发体验;生产模式下则基于 rollup 进行构建。

js 模块化的发展史和构建工具的变化

javascript 语言设计之初,只是作为一个简单的脚本语言用来丰富网站的功能,并不像 java、c++ 那样有 module 的概念,发展到现在的模样,也经历了相当长的时间。

这段时间,可以简单归纳为:

  • 青铜时代 - no module;
  • 白银时代 - cjs、amd、cmd、umd、esm 相继出现;
  • 黄金时代 - 组件模块化;

不同的时代,构建工具也不同。

青铜时代

由于没有 module 的概念, javascript 无法在语言层面实现模块之间的相互隔离、相互依赖,只能由开发人员手动处理。

相应的,早期的 web 开发也比较简单甚至简陋:

  • 通过对象、iife(或者闭包)的方式实现模块隔离;
  • 通过手动确定 script 的加载顺序确定模块之间的依赖关系。
  • jsp 开发模式,没有专门的前端,html、js、css 代码通常也由后端开发人员编写。

为了节省带宽和保密,通常需要对前端代码做压缩混淆处理。这个时候,构建工具为 YUI Tool + Ant。

白银时代

chrome v8 引擎 和 node 的横空出世,给前端带来了无限的可能。

同时,javascript 的模块化标准也有了新的发展:

  1. commonjs 规范,适用于 node 环境开发。
  2. amd、cmd 规范,适用于浏览器环境。
  3. umd,兼容 amd、commonjs,代码可以同时运行在浏览器和 node 环境。
  4. ESM,即 ES6 module(这个时候还不是很成熟);

同时还出现了 less、sass、 es6、 jslint、 eslint、typescript 等新的东西, 前端角色也开始承担越来越重要的作用,慢慢的独立出来。

有了 node 提供的平台,大量的工具开始涌现:

  • less / sass 插件,可以将 less / sass 代码转化为 css 代码;
  • babel,可以将 es6 转化为 es5;
  • typescript,将 ts 编译为 js;
  • jslint / eslint,代码检查;
  • ...

这个时候,我们可以将上面的的这些操作配置成一个个任务,然后通过 Grunt / Gulp 自动执行任务。

黄金时代

基于 Angular、Vue、React 三大框架和 Webpack 的使用,组件模块化成为前端开发的主流模式。同时 ESM 规范也原来越成熟,被更多的浏览器支持。

以 React 和 Webpack 为例,通常我们会将一个应用涉及到的所有的功能拆分为一个个组件,如路由组件、页面组件、表单组件、表格组件等,一个组件对应一个源文件,然后通过 Webpack 将这些源文件打包。在开发过程中,还会通过 Webpack 开启一个 local server,实时查看代码的运行效果。

Webpack 是一个静态模块打包器,它会以 entry 指定的入口文件为起点,分析整个项目内各个源文件之间的依赖关系,构建一个模块依赖图 - module graph,然后将 module graph 分离为多个 bundle。

在构建 module graph 的过程中,会使用 loader 处理源文件,将它们转化为浏览器可以是识别的 js、css、image、音视频等。

随着时间的发展, Webpack 的功能越来越来强大,也迎来诸多对手。

Webpack1
|
|
Rollup 出现(推崇 ESM 规范,可以实现 tree shaking, 打包出来的代码更干净)
|
|
Webpack2(也实现了 tree shaking, 但是配置还是太繁琐了)
|
|
Parcel (号称 0 配置)
|
|
Webpack4(通过 mode 确定 development production 模式,各个模式有自己的默认配置)
|
|
Webpack5(持久化缓存、module federation)
Esbuild(采用 go 语言开发,比 Webpack 更快)
Vite(推崇 ESM 规范,开发模式采用 nobundle,更好的开发体验)

丰富的构建工具,形成了百花绽放的局面,可用于不同的情形,给开发人员带来了越来越多的选择。

结束语

目前来看,构建工具在整个前端体系中占据的位置是越来越重要。只会 Webpack 甚至不懂构建工具已经无法满足日常开发。这就需要我们时时学习,紧跟时代的脚步,了解最新的技术,不断前进。

尽管前路坎坷,依然相信未来可期,加油 💪🏻 !

责任编辑:张燕妮 来源: 大前端技术之路
相关推荐

2022-12-27 09:56:34

架构系统

2024-06-04 22:04:39

2023-03-15 23:59:13

前端构建工具

2023-08-22 10:13:53

模块工具JavaScrip

2012-06-15 11:02:31

架构师

2022-05-16 09:14:28

前端构建工具

2021-05-25 16:34:06

JavaScript前端

2009-07-21 09:55:45

iBATIS分页

2015-12-30 11:14:57

前端工具

2021-06-05 18:01:05

工具Rollup前端

2010-02-03 15:09:13

Python 构建工具

2020-09-29 10:42:30

kurbernetes开发云原生

2009-07-21 09:29:27

iBATIS使用

2013-04-07 10:40:55

前端框架前端

2015-03-30 11:21:27

编程编程反思

2022-05-17 16:56:33

开发工具前端

2021-05-08 23:24:21

前端工具Web

2017-04-08 17:12:36

设计模式抽象策略模式

2012-11-09 10:46:24

Canonical

2012-04-17 13:12:00

点赞
收藏

51CTO技术栈公众号