Turbopack
Turbopack 是一個針對 JavaScript 和 TypeScript 優化 的 增量打包工具,使用 Rust 編寫,並內建於 Next.js 中。您可以在頁面路由器和應用程式路由器中使用 Turbopack,以獲得 更快速 的本地開發體驗。
為什麼選擇 Turbopack?
我們開發 Turbopack 是為了提升 Next.js 的性能,包括:
- 統一依賴圖: Next.js 支援多種輸出環境(例如客戶端和伺服器端)。管理多個編譯器並拼接打包結果可能很繁瑣。Turbopack 為所有環境使用 單一、統一的依賴圖。
- 打包 vs 原生 ESM: 有些工具在開發時跳過打包,依賴瀏覽器的原生 ESM。這對於小型應用程式可行,但對於大型應用程式可能因過多網路請求而變慢。Turbopack 在開發時進行 打包,但以優化的方式保持大型應用程式的速度。
- 增量計算: Turbopack 將工作平行分配到多個核心,並將結果 快取 到函數級別。一旦某項工作完成,Turbopack 不會重複執行。
- 惰性打包: Turbopack 僅打包開發伺服器實際請求的內容。這種惰性方法可以減少初始編譯時間和記憶體使用量。
開始使用
要在您的 Next.js 專案中啟用 Turbopack,請在 package.json
檔案的 dev
和 build
指令中加入 --turbopack
標記:
目前,Turbopack 的 dev
功能已穩定,而 build
功能處於 alpha 階段。我們正在積極開發生產環境支援,Turbopack 正逐步趨於穩定。
支援的功能
Next.js 中的 Turbopack 對於常見使用情境提供 零配置 支援。以下是開箱即用支援的功能摘要,以及一些關於如何在需要時進一步配置 Turbopack 的參考。
語言功能
功能 | 狀態 | 備註 |
---|---|---|
JavaScript & TypeScript | 支援 | 底層使用 SWC。類型檢查不由 Turbopack 執行(請執行 tsc --watch 或依賴您的 IDE 進行類型檢查)。 |
ECMAScript (ESNext) | 支援 | Turbopack 支援最新的 ECMAScript 功能,與 SWC 的覆蓋範圍一致。 |
CommonJS | 支援 | require() 語法開箱即用。 |
ESM | 支援 | 靜態和動態 import 完全支援。 |
Babel | 部分不支援 | Turbopack 預設不包含 Babel。但您可以透過 Turbopack 配置設定 babel-loader 。 |
框架和 React 功能
功能 | 狀態 | 備註 |
---|---|---|
JSX / TSX | 支援 | SWC 處理 JSX/TSX 編譯。 |
快速重新整理 (Fast Refresh) | 支援 | 無需配置。 |
React 伺服器元件 (RSC) | 支援 | 適用於 Next.js 應用程式路由器。Turbopack 確保正確的伺服器/客戶端打包。 |
根佈局建立 | 不支援 | 不支援在應用程式路由器中自動建立根佈局。Turbopack 會指示您手動建立。 |
CSS 和樣式
功能 | 狀態 | 備註 |
---|---|---|
全域 CSS | 支援 | 直接在應用程式中導入 .css 檔案。 |
CSS 模組 | 支援 | .module.css 檔案原生支援(使用 Lightning CSS)。 |
CSS 巢狀 | 支援 | Lightning CSS 支援 現代 CSS 巢狀。 |
@import 語法 | 支援 | 合併多個 CSS 檔案。 |
PostCSS | 支援 | 自動在 Node.js 工作池中處理 postcss.config.js 。適用於 Tailwind、Autoprefixer 等。 |
Sass / SCSS | 支援 (Next.js) | 在 Next.js 中,Sass 開箱即用。未來,Turbopack 獨立使用時可能需要載入器配置。 |
Less | 計劃透過插件支援 | 目前不支援。一旦自訂載入器穩定,可能需要載入器配置。 |
Lightning CSS | 使用中 | 處理 CSS 轉換。某些低使用率的 CSS 模組功能(如獨立的 :local/:global 偽類)尚未支援。詳見下方。 |
資源
功能 | 狀態 | 備註 |
---|---|---|
靜態資源 (圖片、字體) | 支援 | 導入 import img from './img.png' 開箱即用。在 Next.js 中,返回用於 <Image /> 元件的物件。 |
JSON 導入 | 支援 | 支援從 .json 進行命名或預設導入。 |
模組解析
功能 | 狀態 | 備註 |
---|---|---|
路徑別名 | 支援 | 讀取 tsconfig.json 的 paths 和 baseUrl ,與 Next.js 行為一致。 |
手動別名 | 支援 | 在 next.config.js 中配置 resolveAlias (類似於 webpack.resolve.alias )。 |
自訂副檔名 | 支援 | 在 next.config.js 中配置 resolveExtensions 。 |
AMD | 部分支援 | 基本轉換可行;進階 AMD 使用受限。 |
性能和快速重新整理
功能 | 狀態 | 備註 |
---|---|---|
快速重新整理 | 支援 | 無需完全重新整理即可更新 JavaScript、TypeScript 和 CSS。 |
增量打包 | 支援 | Turbopack 惰性地僅構建開發伺服器請求的內容,加速大型應用程式。 |
不支援和未計劃的功能
某些功能尚未實現或未計劃支援:
- 舊版 CSS 模組功能
- 獨立的
:local
和:global
偽類(僅支援函數形式:global(...)
)。 @value
規則(由 CSS 變數取代)。:import
和:export
ICSS 規則。
- 獨立的
webpack()
配置 在next.config.js
中 Turbopack 取代了 webpack,因此不識別webpack()
配置。請改用turbopack
配置。- AMP Next.js 中不計劃支援 Turbopack。
- Yarn PnP Next.js 中不計劃支援 Turbopack。
experimental.urlImports
不計劃支援。experimental.esmExternals
不計劃支援。Turbopack 不支援 Next.js 中的舊版esmExternals
配置。- 某些 Next.js 實驗性標記
experimental.typedRoutes
experimental.nextScriptWorkers
experimental.sri.algorithm
experimental.fallbackNodePolyfills
我們計劃未來實現這些功能。
有關每個功能標記及其狀態的完整詳細說明,請參閱 Turbopack API 參考。
配置
Turbopack 可以透過 next.config.js
(或 next.config.ts
)中的 turbopack
鍵進行配置。配置選項包括:
rules
定義額外的 webpack 載入器 以進行檔案轉換。resolveAlias
建立手動別名(類似於 webpack 中的resolve.alias
)。resolveExtensions
變更或擴展模組解析的檔案副檔名。moduleIds
設定模組 ID 的生成方式('named'
或'deterministic'
)。treeShaking
在開發和未來的生產構建中啟用或停用 Tree Shaking。memoryLimit
設定 Turbopack 的記憶體限制(以位元組為單位)。
更多深入的配置範例,請參閱 Turbopack 配置文件。
生成追蹤檔案以進行效能除錯
如果您遇到效能或記憶體問題,並希望協助 Next.js 團隊診斷,可以透過在開發指令後附加 NEXT_TURBOPACK_TRACING=1
來生成追蹤檔案:
這將產生一個 .next/trace-turbopack
檔案。在 Next.js 儲存庫 上建立 GitHub 問題時,請包含該檔案以協助我們調查。
總結
Turbopack 是一個基於 Rust 的 增量 打包工具,旨在使本地開發和構建變得快速——尤其是對於大型應用程式。它整合到 Next.js 中,提供零配置的 CSS、React 和 TypeScript 支援。
請持續關注更多更新,我們將繼續改進 Turbopack 並新增生產構建支援。同時,請嘗試使用 next dev --turbopack
並告訴我們您的反饋。
版本變更
版本 | 變更 |
---|---|
v15.3.0 | 實驗性支援 build |
v15.0.0 | Turbopack 的 dev 功能穩定 |