2022,前端工具链十年盘点

简介: 2021 的年度盘点我们选择了一个特别的形式,把时间范围拉长到 10 年,梳理前端工具链里的 12 个重要的包的发布和版本更新时间,结合 npm 下载数据,看看前端的工具链在这十年间有怎样的演变。

图片.png

2021 的年度盘点我们选择了一个特别的形式,把时间范围拉长到 10 年,梳理前端工具链里的 12 个重要的包的发布和版本更新时间,结合 npm 下载数据,看看前端的工具链在这十年间有怎样的演变。

图片.png

查看本图的全部细节,请访问:https://time.graphics/line/598790

前史:2009 - 2010


2009 年前,前端的工具链不由 JavaScript 编写,功能也较为简单,如 make、python、C# 等。2009 年起,前端工具链的前置要求被逐个满足。


  • 模块定义:2009 年,CommonJS 模块定义规范被提出;
  • 语言:2009 年,ECMAScript 5 发布,JavaScript 标准更明确,功能更多;
  • 执行环境:2009 年,Node.js 发布初始版本;
  • 包管理:2010 年,npm 发布;


第一章:寻找抽象,2011 - 2015


2011 年起,时机成熟,前端工具链开始大量冒出。这个阶段的主流工具链均在尝试各种抽象,以合理表达前端的自动化处理流程:


  • 任务:2012 年 Grunt 发布首版¹²,将处理过程定义为多个不同的任务,每个任务执行一个函数或插件;
  • 文件流:2013 年 Gulp 发布首版,并快速在同年发布到了 3.0 正式版,在 Grunt 抽象任务的基础上,Gulp 引入了流编程的概念,避免在执行复杂任务时,需要将编译中间结果放在临时文件夹的场景;
  • 模块依赖:2012 年 Webpack 发布首版,并于 2014 年发布 1.0 正式版,它通过分析模块间依赖来决定编译过程,将可扩展点抽象为 loader 和 plugin。


对于不同的子场景,也有其他工具:

  • Node.js 支持:2011 年,browserify 发布首版,允许在前端仓库引入 Node.js 的部分 API,并实现跟其他库类似的打包步骤;
  • 国内前端开发:2013 年,百度开源了 FIS,针对国内前端的更常见需求进行了支持,包括 GBK 特性支持;
  • 转译:2014 年,Babel 发布首版³,重心放在对 JavaScript 转译,使得尚在提案阶段的语言特性能兼容。

注 1:部分包在发版 npm 前,会通过官网直接分发,本文所有包发版时间以 npm 为准,不统计其他渠道,下略。

注 2:“首版”即 npm 包首次发版时间,它可能小于 1.0.0,下略。

注 3:Babel 首版叫做 6to5,后改名为 Babel。


第二章:打包一切,2016 - 2019


2016 年,Webpack 的 npm 年下载量和 Gulp、Grunt 达到同一个数量级,意味着 Webpack 统治前端工具链的时代来临。

工具链中,存在如下的三类发展轴向:

  • 高封装性:即配置内容简单,不需要写太多配置即可完成前端流程配置;
  • 低复杂度:即工具的内部实现简单,文档友好度、插件书写复杂度均受此特性影响;
  • 强能力:即支持的功能集更多。

对比出现的这些工具库,很难做到同时拥有三个特性,如 Webpack 复杂度较高,Grunt 能力较弱,Gulp 封装性较低。

Webpack 最终能统治社区,离不开它的三个王牌能力:一切皆可打包、本地模块热加载(HMR)和按需加载。而 Webpack 的弱项是其配置的繁琐和复杂,在这个阶段出现的大部分新包,也是在牺牲了部分能力的前提下,去强化封装性和简化复杂度:


  • 2013 年⁴,Parcel 发布首版,并在 2018 年发布 1.0 正式版,在当时它主打无配置启动项目;
  • 2015 年,Rollup 发布首版,并在 2019 年发布 1.0 正式版,它主打工具库的打包,相比 Webpack 配置更简单和轻量;
  • 面临其他工具库的挑战,Webpack 也在 2018 年发布 4.0 版,支持了无配置启动项目。

注 4:从 npm 记录而言,Parcel 首版发布于 2013 年,但是它大规模进入公共视野是在 2017 年。


第三章:性能优化,2020 至今


2020 年开始,我们观察到工具链开始将重心放在了性能优化上:

  • 2020 年,Webpack 5.0 发布,实现了多进程编译以优化计算密集型任务,并强化了缓存机制;
  • 2020 年,Snowpack 发布首版正式版,主打不打包项目依赖的模块(Bundleless),而是直接依赖 CDN 提供的模块文件,大大提升了本地环境运行速度;
  • 2020 年,Vite 发布首版,同样主打 Bundleless。


那么,这些性能优化是不是到了理论极限呢?我们可以从工具链里不同的任务类型分述:

  • CPU 密集型,如压缩、转译等环节,可能的优化有:
  • 使用更高效算法:优化空间小;
  • 压榨 V8 性能:如参考 Crankshaft Bailout 或 TurboFan Bailout;
  • 多核并行计算:受到进程通信开销制约;
  • 使用其他语言实现⁵:受到跨语言通信制约;
  • I/O 密集型,包括:
  • 文件读写:利用 bundleless 减少本地文件读取量;此外 Node.js 默认异步 API 使得此类任务能足够快,优化空间小;
  • 进程通信:序列化/反序列化开销较大,共享内存的 worker_threads 尚不稳定⁶,此外线程启动有损耗;
  • 跨语言通信:2018 年,napi-rs 1.0 发布,Node.js 调用 rust 有了更高效简单的方式⁷;
  • GPU 密集型,前端场景较少⁸,包括:
  • 机器学习:如使用 NVIDIA RAPIDS API 的 node-rapids;
  • 图像处理:如 GPU.js。


社区找到的突破口在 CPU 密集型任务上,使用 Go 或者 Rust 书写计算密集型的部分任务:

  • 2019 年,基于 Rust 实现的 SWC 发布首版,对标 Babel,显著提升了性能;
  • 2020 年,使用 go 实现的 esbuild 发布首版,相比 SWC 更聚焦于 TypeScript 和 JavaScript 的转译,性能更快;
  • 2020 年,Vite 发布 2.0,使用 esbuild 实现了性能二次提升;
  • 2020 年,Parcel 发布 2.0,基于 napi-rs 和 Rust 重新实现;
  • 2020 年,rome 发布首版,在 2021 年也转为基于 Rust 开发。

最后,我们看看 2021 年的 npm 包年下载量数据:


  • Babel 14 亿,稳坐榜首;
  • Webpack 8亿,位列其次;
  • 新兴的高性能打包降序依次是:esbuild 4800万、Vite 860万、Parcel 340万、SWC 280万、Snowpack 170万;
  • 老牌的打包工具降序依次是:Rollup 2亿、Gulp 720万、Grunt 350万。


时局如何变迁,让我们拭目以待。

注 5:JavaScript 的特性为 JIT、弱类型、动态类型,其执行效率相对其他 AOT、强类型、静态类型的语言更低。

注 6:Node 12 起正式支持 worker_threads,但稳定性一直不高,如触发 Access Violation。

注 7:对于 Rust,一开始有 neon 提供 js binding,但性能还不够快。

注 8:因为 Node.js 标准包里不包含对 GPU 的封装。另外,浏览器缺乏直接利用 GPU 的 API,直到 WebGPU 出现。


正文未提及信源:



阿里妈妈前端快爆从 2017 年开始,已坚持更新到 2022 年。过去 5 年间,我们致力于传达前端业界的更迭,也慢慢分化出来了重客观信息的新闻版块、重知识聚合的专题板块、重碎片化分享的百宝箱板块。

感谢全体编辑部成员过去一年的贡献:一丝、墨尘、承虎、池冰。

感谢各位对本文的纠错和支持:尤雨溪、doodlewind、工业聚、太狼、游真、E0、天猪、徐振东。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
数据可视化 安全 前端开发
低代码开发究竟藏着怎样的神秘力量?它为何能成为加速软件创新的关键利器?
【8月更文挑战第21天】在数字化时代,低代码开发作为新兴方式,通过可视化界面与预建组件加速软件创新。它提高了开发效率,降低了成本与门槛,使非专业人员也能参与。但其灵活性受限且需重视安全稳定性。随着技术进步,低代码将成为推动软件快速发展的重要力量。
33 0
|
2月前
|
JSON 前端开发 JavaScript
新一代前端工具链rome
新一代前端工具链rome
141 62
|
1月前
|
前端开发 JavaScript 小程序
前端新机遇!为什么我建议学习鸿蒙?
【10月更文挑战第4天】前端新机遇!为什么我建议学习鸿蒙?
110 0
前端新机遇!为什么我建议学习鸿蒙?
|
3月前
|
人工智能 开发者 前端开发
【创新·未来】当AI遇见代码:Vaadin Copilot引领Web开发新时代,你准备好了吗?
【8月更文挑战第31天】Vaadin 是一个成熟的 Java Web 应用框架,最新版本 24.4.0 带来了多项更新,包括引入 Vaadin Copilot——一个集成 AI 的开发工具,可实现拖放组件、实时更新源代码等功能。此外,Vaadin 24.4.0 还统一了 Hilla 框架,支持 Flow 和 Hilla 视图混合应用,实现 React 组件与 Java 应用的无缝集成。未来,Vaadin 将继续提升开发者体验和应用性能,整合更多现代 Web 技术,如 Web 组件和 PWA 支持,保持其在企业级应用开发领域的领先地位。
57 0
|
3月前
|
SQL 安全 PHP
探寻PHP的现代演进之路:从Web开发到框架创新——揭秘PHP语言如何引领技术潮流
【8月更文挑战第2天】探索PHP的现代演进:从Web开发到框架创新
55 1
|
4月前
|
开发框架 vr&ar 数据安全/隐私保护
移动应用的未来之路:框架、系统与创新
【5月更文挑战第83天】 随着移动互联网的飞速发展,移动应用(App)已成为人们日常生活和工作的重要组成部分。本文将深入探讨移动应用开发的最新趋势、挑战以及未来可能的发展方向。我们将重点讨论跨平台开发框架的兴起、原生与混合应用的优劣对比,以及移动操作系统在安全性、性能和用户体验方面的最新进展。通过分析这些关键技术要素,文章旨在为开发者、设计师及决策者提供洞见,帮助他们在竞争激烈的市场中保持领先。
|
6月前
|
移动开发 前端开发 JavaScript
跨端开发浪潮中的变与不变
自 90 年代初开启 PC 时代以来,随着移动网络的快速普及,在 2010 年左右,进入移动时代、IOT 时代,各种移动互联设备不断涌现,除了最常见的 PC、Pad、智能手机外,它还可能是小小的一块智能手表,也可以是一个大屏终端。智能设备层出不穷,填满了人们生活的各个角落,设备的系统类型、屏幕大小等也是愈发碎片化。
|
6月前
|
Web App开发 搜索推荐 前端开发
【热门话题】Chrome 插件研发详解:从入门到实践
本文详细介绍了Chrome插件的开发,从基础概念到实战技巧。首先,解释了插件的结构,包括manifest.json、背景脚本、内容脚本和UI界面。接着,阐述了生命周期、通信机制以及开发步骤,包括创建项目结构、编写manifest.json、开发脚本和UI,以及测试与调试。通过一个显示当前页面URL的插件实例,展示了具体实现过程。最后,讲解了如何在Chrome Web Store发布和分发插件。Chrome插件开发为开发者提供了创造个性化体验的平台,本文旨在引导读者入门并深入实践。
139 2
|
JavaScript 前端开发 Java
谈一谈 OpenHarmony 的方舟编译体系
谈一谈 OpenHarmony 的方舟编译体系
|
Cloud Native IDE Java
阿里巴巴正式开源云原生应用脚手架
12 月 3 日,微服务 x 容器开源开发者 Meetup 上海站上,阿里云智能技术专家,云原生应用脚手架项目负责人良名宣布阿里巴巴云原生应用脚手架项目正式开源,并在现场做了相关内容介绍。
599 13
阿里巴巴正式开源云原生应用脚手架