iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Modern Web

深入淺出,完整認識 Next.js 13 !系列 第 7

Day 07 - Turbopack 是什麼?

  • 分享至 

  • xImage
  •  

介紹完了全端框架的特色、CSR、SSR、SSG 三種網頁渲染方式的比較,以及 create-next-app 的專案架構,今天來看看 Next.js 13 到底更新了些什麼吧!

2022 年的 Next.js Conf,Vercl 的 CEO Guillermo Rauch 以 “Dynamic without limits“ 的主題正式向大眾介紹 Next.js 13。目標是希望能在不犧牲使用者體驗的前提下,提供更簡單、快速、省效能的開發體驗。假如像我寫這篇文章以前,聽過與看過許多 Next.js 13 新的 filing system 和 React Server Components ( RSC ) 的介紹,但一直很好奇緣由,或一些企業、新創為什麼選擇 Vercel 和 Next.js 的朋友,很推薦大家看一下發表會的 Keynote 影片

這次的更新主要有三大重點:

  1. Compiler Infrastructure 優化
  2. Rendering Infrastructure 優化
  3. Component Toolkit

今天會先跟大家介紹第一點:Compiler Infrastructure。廢話不多說,進入正題:


Compiler Infrastructure

Next 團隊這幾年持續在導入 Rust-based 的工具,優化 transpiling、minification 等流程。像是 v12 將預設的 compiler - Babel,和 minify 工具 - Terser,都改為在 SWC 開發的 Rust-based 工具 ( 參考文章 ),v13 也找來了 Webpack 創辦人 Tobias Koppers,推出了 Rust-based 的打包工具 Turbopack,號稱 hot module replacement ( HMR,簡單來說就是我們每次在開發模式存檔,網頁會自動更新 ) 比 Webpack 專案快 700 倍,比 Vite 專案快 4 倍;cold starts 比 Webpack 專案快 4 倍。
https://ithelp.ithome.com.tw/upload/images/20230907/20161853bqqBKpStoM.png
( 圖片來源:https://nextjs.org/blog/next-13 )

發表會上 Guillermo 也提到,以一個 >10,000 個 React components 的專案來說,Webpack cold start 約需要 23.3 秒,而 Turbopack 只需要 7.6 秒。
https://ithelp.ithome.com.tw/upload/images/20230907/201618536pcOEfShh8.png
( 圖片來源:https://turbo.build/pack )

真的有這麼快嗎?Vite 創辦人,也是 Vue.js 創辦人尤雨溪有親自出來實測,用 React+Vite 與 Next.js + Turbopack 比較 1,000 個 component 下 HMR 的速度。

實測出來的結果,Root components ( 含有很多 imports 和 child components) 更新速度 Turbopack 跟 Vite 差不多;Leaf components Turbopack 約快 68%,都與官方提供的數字差距不小,有興趣了解實驗細節的可參考此實驗 repo
https://ithelp.ithome.com.tw/upload/images/20230907/20161853joBso5Oq5W.png
( 圖片來源:https://github.com/yyx990803/vite-vs-next-turbo-hmr )

尤雨溪這篇文章貼出後,Vercel 官方也在部落格澄清,Turbopack 比 Vite 快 10 倍的說法 ( 原始 Twitter 貼文說十倍,後續似乎有改數字 ),是基於三個條件:

  1. Vite 不使用 SWC
  2. 應用程式包含超過 30,000 個 modules
  3. 只計算 HMR 模組更新的時間,不是從用戶更新程式碼後到應用程式實際更新的時間

而尤雨溪也隨後發文表示:30,000 個 modules 以實務上來說很少見,而且比起模組更新時間,用戶更關心 HMR end-to-end 的更新時間,因此質疑這是個不公平的比較。

呼應一下 Vercel 官方的回覆,Tobias 今年二月在 devtools.fm 的訪談中也提到,Turbopack 的主要目標是讓 app update 速度不受專案大小而影響,所以可能要大型專案 ( 破萬個 components ) 比較能感受到速度差異。

So our main goal by building the architecture was like to be in, so to make incremental updates or the performance of incremental updates, independent of app size.

Tobias Koppers - TurboPack, Webpack

雖然如同上文提到,Turbopack 在 HMR 的速度提升上,是否有如官方聲稱的幅度,還備受爭議,但目前 Turbopack 還是 Beta 版,正式版推出後速度會不會再優化也還不知道,Vercel 現任的 Developer Experience VP - Lee Robinson 8 月底也有在 Twitter 提到,假如 Turbopack 最終不是個最佳方案,也有可能改用 Vite。等待正式版推出以及更多相關實測出來前,不妨一起在旁吃瓜看著大神們的表演吧 (?

該怎麼在 Next.js 專案中使用 Turbopack?

  1. 直接創建一個 with Turbopack 的 Next.js v13 專案:
npx create-next-app --example with-turbopack
  1. 在現有的 Next.js 專案中使用 ( Pages Router 版也可使用 ):
    在專案的 package.json 中的 dev script 後加入 –-turbo
{
...
   "scripts": {
     "dev": "next dev --turbo",
     "build": "next build",
     "start": "next start",
     "lint": "next lint"
   },
...
}

完成後跑 npm run dev,看到 Turbopack 的歡迎訊息,就成功囉!
https://ithelp.ithome.com.tw/upload/images/20230907/20161853Q8AKBxAkHJ.png

最後做一些小提醒:目前 Turbopack 目前只能用於開發模式,也只能用在 Next.js 上,但官方說未來會支援 Vue 和 Svelte。除了目前的 Cold Start 和 HMR 外,之後還會推出像是 Code Build 和 Build from Cache 等新功能,大家敬請期待囉!

根據官方提供的數據,目前 Turbopack 已通過 >90% 的測試,有興趣了解測試進度和內容的讀者可參考上方超連結。

關於 Compiler Infrastructure 優化就介紹到這邊,明天會和大家分享改版的第二重點 - Rendering Infrastructure 的優化。

我個人對於 Rust 和 Vercel 團隊持續導入和開發的工具也蠻有興趣的,在聽 Tobias 分享設計 Webpack 和 Turbopack 的心路歷程時也覺得很有趣,( 假如有時間 ) 鐵人賽結束後可以跟大家分享更多相關工具的介紹。

謝謝大家耐心的閱讀,我們明天見!


上一篇
Day 06 - Next.js 13 專案架構介紹,各檔案資料夾該放在哪裡?
下一篇
Day 08 - App Router 是什麼?
系列文
深入淺出,完整認識 Next.js 13 !30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言