2022,前端工具鏈十年盤點

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列

2021 的年度盤點我們選擇了一個特別的形式,把時間范圍拉長到 10 年,梳理前端工具鏈里的 12 個重要的包的發布和版本更新時間,結合 npm 下載數據,看看前端的工具鏈在這十年間有怎樣的演變。

fd03bd0400ac046fe87c4c2448ba62d5.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 發布首版12,將處理過程定義為多個不同的任務,每個任務執行一個函數或插件;

  • 文件流: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 發布首版3,重心放在對 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 出現。

正文未提及信源:

  • CommonJS 溯源:https://arstechnica.com/information-technology/2009/12/commonjs-effort-sets-javascript-on-path-for-world-domination/

  • JavaScript 二十年:https://github.com/doodlewind/jshistory-cn

  • npm 包發版時間:https://libraries.io/

  • npm 包下載數據:https://npm-stat.com/charts.html

阿里媽媽前端快爆從 2017 年開始,已堅持更新到 2022 年。過去 5 年間,我們致力于傳達前端業界的更迭,也慢慢分化出來了重客觀信息的新聞版塊、重知識聚合的專題板塊、重碎片化分享的百寶箱板塊。

感謝全體編輯部成員過去一年的貢獻:一絲、墨塵、承虎、池冰。
感謝各位對本文的糾錯和支持:尤雨溪、doodlewind、工業聚、太狼、游真、E0、天豬、徐振東。

693cbe4f1bfff39baf02a2ba0967558b.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

5de1ffbf7f3bc05bac47a6eb9df7296f.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274885.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

var result = ![] == []; console.log(result); // 結果是?為什么?

相等操作符會對操作值進行隱式轉換后進行比較,如果一個操作值為布爾值,則在比較之前先將其轉換為數值,這里 ![] 一定是布爾值了。 http://www.csser.com/board/4f3f516e38a5ebc9780004d3轉載于:https://www.cnblogs.com/anjey/archive/2012/0…

講講volatile的作用

講講volatile的作用 講講volatile的作用254推薦一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,…

書籍排版學習心得_為什么排版是您可以學習的最佳技能

書籍排版學習心得重點 (Top highlight)I was introduced to design in a serpentine fashion. I don’t have any formal training. Instead, I’ve learned everything through the Web, books, and by interacting with designers daily.我被介紹為蛇形設計。 我沒有任何正規…

javascript專題:如何構建自己的js庫

首先看看這個: (function(){ //運行的代碼 })(); 紅色括號里面是一個匿名函數,紅色括號是分割,表示里面的函數是一個部分,綠色的括號表示一個運算符,表示紅色括號里面的函數要運行。 相當于定義完一個匿名函數后讓它直…

若川的 2021 年度總結,彈指之間

1前言從2014年開始,每一年都會寫年度總結,已經堅持了7個年頭。7年的光陰就是彈指之間,轉瞬即逝。正如孔子所說:逝者如斯夫,不舍晝夜。回顧2014,約定2015(QQ空間日志)2015年總結&…

線框圖用什么軟件_為什么要在線框中著色?

線框圖用什么軟件I was recently involved in a debate around why some wireframes (which were definitely not UI screens) were not 100% greyscale. This got me thinking — when is it ok to use colour in wireframes, and when is it going to cause you problems fur…

Linux 內核

Linux 內核是一個龐大而復雜的操作系統的核心,不過盡管龐大,但是卻采用子系統和分層的概念很好地進行了組織。通過本專題,我們可以學習 Linux 的分層架構、內核配置和編譯、內核性能調試和 Linux 2.6 中的許多提升功能。Linux 內核組成 Linux…

給asterisk寫app供CLI調用

環境:CentOS6.2 Asterisk 1.8.7.1 一、添加源文件 復制app_verbose.c為app_testApp.c 復制app_verbose.exports為app_testApp.exports 主要是修改一些標識,編譯不會出錯就行,這里列出我進行的主要修改。 1、添加頭文件 #include "aster…

前端,校招,面淘寶,指南

大家好,我是若川。持續組織了6個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列雖然是…

qq空間網頁設計_網頁設計中負空間的有效利用

qq空間網頁設計Written by Alan Smith由艾倫史密斯 ( Alan Smith)撰寫 Negative space is a key design element that you may come across in the fields of art, architecture, interior design, landscaping and web design. Rather than serving as awkward, empty areas …

自定義異常拋法

public List<LogRec> readLogs() throws ReadDataException { try { return returnLogRec(logFileName); } catch(Exception e) { throw new ReadDataException(e); } } 轉載于:https://www.cnblogs.com/zengmiaogen/archive/2012/04/15/2450438.html

SQL SERVER服務停止和啟動命令行

停止服務: net stop mssqlserver 啟動服務: net start mssqlserver 轉載于:https://www.cnblogs.com/davidgu/archive/2010/01/06/1640466.html

Git 和 GitHub 教程——版本控制入門

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列Learn…

matlab中的:的優先級_內容早期設計:內容優先

matlab中的:的優先級By Simone Ehrlich, Content Strategy Manager由 西蒙埃利希 &#xff0c;內容策略經理 Words are cheap. Cheaper than wires; cheaper than mocks. That doesn’t mean words aren’t important, just less expensive to produce as a design asset. So …

Nunit2.5.10快速上手

1、下載Nunit&#xff1a;http://www.nunit.org/index.php?pdownload&#xff0c;下載MSI格式的安裝包&#xff1b; 2、安裝Nunit&#xff0c;根據提示安裝即可&#xff0c;沒有什么需要配置的&#xff0c;直接下一步就可以了。 3、新建類庫項目NUnitQuickStart&#xff0c;在…

我真的哭了,哭過后呢(-)

這些是山區的孩子們&#xff01; 這是他們的教室。這個也算是&#xff01;如此的師資力量自己解決吃飯問題冬天到了&#xff0c;一起烤烤火與泥土污水一起還好&#xff0c;最大的數字只是10老師抱著孩子來給我們上課了不知道山那邊會是什么呢&#xff1f;又一雙充滿了渴望的大眼…

腦裂問題解決方案_從解決方案到問題

腦裂問題解決方案Once upon a time a couple of years ago, one of my mentors (and favourite people in the world) repeatedly drilled the idea above into my brain. Her advice for Product people was to “fall in love with the problem, not the solution”. At the …

Vue.js 官方團隊成員霍春陽新作,深入解析 Vue.js 設計細節【文末送書】

霍春陽&#xff08;Hcy&#xff09;&#xff0c;Vue.js 官方團隊成員。專注于 Web 研發領域&#xff0c;是 Vue.js 3 的核心貢獻者之一&#xff0c;Vue.js 文檔生成工具 Vuese 的作者&#xff0c;技術社區活躍者&#xff0c;曾撰寫大量頗受好評的技術博客。經過一年的準備&…

分享memcache和memcached安裝過程(轉)

Memcache是什么&#xff1f;源代碼地址&#xff1a;http://code.google.com/p/memcached/downloads/list Memcache是一個自由和開放源代碼、高性能、分配的內存對象緩存系統。用于加速動態web應用程序&#xff0c;減輕數據庫負載。 它可以應對任意多個連接&#xff0c;使用非阻…

LINQ之路 5:LINQ查詢表達式

書寫LINQ查詢時又兩種語法可供選擇&#xff1a;方法語法&#xff08;Fluent Syntax&#xff09;和查詢表達式&#xff08;Query Expression&#xff09;。 LINQ方法語法的本質是通過擴展方法和Lambda表達式來創建查詢。C# 3.0對于LINQ表達式還引入了聲明式的查詢表達式&#xf…