掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一周前,Vercel 宣布了 Webpack 的基于 Rust 的繼任者 Turbopack。

在公告中,Turbopack 宣稱“比 Vite 快 10 倍”。Vercel 的各種營(yíng)銷材料都重復(fù)宣揚(yáng)這句話,包括推文,博客文章和發(fā)送給 Vercel 用戶的營(yíng)銷電子郵件。
Turbopack 的文檔中還包括了 benchmark 圖,最初表明,使用 TurboPack 的 Next.js 13 可以在 0.01s 中執(zhí)行 React HMR 熱更新,而對(duì)于 Vite 來(lái)說(shuō)需要 0.09s。也有用于冷啟動(dòng)性能的 benchmarks,但是由于沒(méi)有發(fā)現(xiàn)冷啟動(dòng)速度是 Vite 10 倍的比較,因此我們只能假設(shè)“10 倍快”是基于 HMR 的性能。
Vercel 沒(méi)有在營(yíng)銷材料或文檔中使用用于論證這些數(shù)字的 benchmarks 的任何鏈接。因此,我很好奇,并決定使用剛發(fā)布的 Next 13 和 Vite 3.2 的 benchmark 來(lái)驗(yàn)證自己的主張。代碼和方法在此處[1]開(kāi)源。
我的方法的要點(diǎn)是通過(guò)測(cè)量以下兩個(gè)時(shí)間戳之間的增量來(lái)比較 HMR 性能:
benchmark 還測(cè)量了兩種不同情況下的數(shù)字:
在聊數(shù)字之前,有幾個(gè)額外的差異值得一提:
Next 13 引入了一個(gè)主要的架構(gòu)轉(zhuǎn)變,因?yàn)楝F(xiàn)在組件默認(rèn)為服務(wù)器組件,除非用戶使用“use-client”指令明確選擇客戶端模式。不僅是默認(rèn)設(shè)置,Next 文檔還建議用戶盡可能保持服務(wù)器組件模式,以提高終端用戶的性能。
我的初始 benchmark 測(cè)試測(cè)了 Next 13 在服務(wù)器模式下的根組件和葉組件的 HMR 性能。結(jié)果表明,在這兩種情況下,Next 13 的速度實(shí)際上都較慢,并且葉組件的差異顯著。
Round 1 snapshot (Next w/ RSC, Vite w/ Babel)[2]
當(dāng)我在 Twitter 上發(fā)布這些數(shù)字時(shí),很快就有人指出,我應(yīng)該在沒(méi)有 RSC 的情況下對(duì) Next 組件進(jìn)行 benchmark 測(cè)試,以使其相等。所以我在 Next 根組件中添加了“useclient”指令,以選擇進(jìn)入客戶端模式。事實(shí)上,在客戶端模式下,Next HMR 顯著提高,比 Vite 快 2 倍:
Round 2 snapshot (Next w/o RSC, Vite w/ Babel)[3]
我們的目標(biāo)是使 benchmark 只關(guān)注 HMR 性能差異。為了確保我們確實(shí)在比較同一個(gè)東西,我們還應(yīng)該消除另一個(gè)變量:Vite 的默認(rèn) React preset 使用 Babel 來(lái)轉(zhuǎn)換 React HMR 和 JSX。
React HMR 和 JSX 轉(zhuǎn)換不是與構(gòu)建工具耦合的特性??梢酝ㄟ^(guò) Babel(基于 js)或 SWC(基于 rust)完成。Esbuild 也可以轉(zhuǎn)換 JSX,但缺少對(duì) HMR 的支持。
SWC 明顯快于 Babel(單線程下 20 倍,多核心下 70 倍)。Vite 目前默認(rèn)為 Babel 的原因是在安裝大小和實(shí)用性之間進(jìn)行權(quán)衡。SWC 的安裝容量相當(dāng)大(node_modules 中占用 58MB,而 Vite 本身才 19MB),許多用戶仍然依賴 Babel 進(jìn)行其他轉(zhuǎn)換,因此 Babel pass 對(duì)他們來(lái)說(shuō)是不可避免的。當(dāng)然,這在未來(lái)可能會(huì)改變。
Vite core 不依賴 Babel。只需要用 vite-plugin-swc-react-refresh[4] 來(lái)替換默認(rèn)的 React 插件即可。切換后,我們看到了根案例中 Vite 的顯著改進(jìn),超過(guò)了 Next:
有趣的是,這里的成長(zhǎng)曲線顯示,Next/turbo 在根情況下比葉情況下慢 4 倍,而 Vite 只慢 2.4 倍。這意味著 Vite HMR 在更大型的組件中表現(xiàn)更好。
此外,切換到 SWC 也應(yīng)改善 Vercel benchmark 測(cè)試中 Vite 的冷啟動(dòng)指標(biāo)。
因?yàn)檫@是一個(gè)涉及 Node.js 和和原生 Rust 部分的復(fù)合測(cè)試,在不同的硬件上會(huì)有非凡的差異。我發(fā)布的結(jié)果是在我的 M1 MacBook Pro 上收集的。其他用戶在不同的硬件上運(yùn)行了相同的 benchmark 測(cè)試,并報(bào)告了不同的結(jié)果。
在某些情況下,根案例下的 Vite 更快。
而在另外一些情況下,兩種情況下 Vite 都明顯更快。
在我發(fā)布了我的 benchmark 之后,Vercel 發(fā)布了一篇博文[5],澄清了他們的 benchmark 方法,并將其 benchmark 提供給公眾驗(yàn)證。雖然這可能是第一天就做的事兒,但這絕對(duì)是朝著正確方向邁出的一步。
讀完帖子和 benchmark 代碼后,這里有幾個(gè)關(guān)鍵要點(diǎn):
總結(jié)下來(lái),“比 Vite 快 10 倍”必須在以下條件下才成立:
由于 Vercel 的 benchmark 測(cè)試測(cè)量“模塊評(píng)估時(shí)間”,以排除 React 的 HMR 運(yùn)行時(shí)引起的差異,我們可以假設(shè) benchmark 測(cè)試的目標(biāo)是對(duì) Vite 和 Turbopack 固有的 HMR 機(jī)制進(jìn)行公正的比較。
不幸的是,在這個(gè)前提下,Vite 仍然在 benchmark 測(cè)試中使用 Babel,這并不平等,這讓 10 倍速度的聲明無(wú)效了。在使用 SWC 轉(zhuǎn)換的 Vite 來(lái)矯正數(shù)字之前,應(yīng)將其視為不準(zhǔn)確的測(cè)試。
此外,我相信大多數(shù)人都會(huì)同意:
作為 Vite 的作者,我很高興看到像 Vercel 這樣資金雄厚的公司在改進(jìn)前端工具方面進(jìn)行了大量投資。如果適用,我們甚至可以在未來(lái)在 Vite 中利用 Turbopack。我相信 OSS 領(lǐng)域的健康競(jìng)爭(zhēng)最終會(huì)讓所有開(kāi)發(fā)者受益。
然而,我也認(rèn)為開(kāi)放源碼軟件的競(jìng)爭(zhēng)應(yīng)該建立在公開(kāi)溝通、公平比較和相互尊重的基礎(chǔ)上。令人失望和擔(dān)憂的是,看到激進(jìn)的營(yíng)銷使用了精心挑選的、未經(jīng)同行評(píng)審的、邊緣誤導(dǎo)性的數(shù)字,這些數(shù)字通常只在商業(yè)競(jìng)爭(zhēng)中出現(xiàn)。作為一家建立在 OSS 成功之上的公司,我相信 Vercel 可以做得更好。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流