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 文件的 devbuild 指令碼中新增 --turbopack 標記:

package.json
{
  "scripts": {
    "dev": "next dev --turbopack",
    "build": "next build --turbopack",
    "start": "next start"
  }
}

目前,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.jsonpathsbaseUrl,匹配 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 規則。
    • .module.css 中使用 composes 組合 .css 文件。在 webpack 中,這會將 .css 文件視為 CSS 模組,而在 Turbopack 中,.css 文件始終是全域的。這意味著如果您想在 CSS 模組中使用 composes,需要將 .css 文件更改為 .module.css 文件。
    • 在 CSS 模組中使用 @import 導入 .css 作為 CSS 模組。在 webpack 中,這會將 .css 文件視為 CSS 模組,而在 Turbopack 中,.css 文件始終是全域的。這意味著如果您想在 CSS 模組中使用 @import,需要將 .css 文件更改為 .module.css 文件。
  • 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 設定記憶體限制(以位元組為單位)。
next.config.js
module.exports = {
  turbopack: {
    // 範例:新增別名和自訂文件副檔名
    resolveAlias: {
      underscore: 'lodash',
    },
    resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
  },
}

有關更深入的配置範例,請參閱 Turbopack 配置文件

生成追蹤文件以進行性能除錯

如果您遇到性能或記憶體問題,並希望幫助 Next.js 團隊診斷,可以透過在開發指令中附加 NEXT_TURBOPACK_TRACING=1 來生成追蹤文件:

NEXT_TURBOPACK_TRACING=1 next dev --turbopack

這將產生一個 .next/trace-turbopack 文件。在 Next.js 倉庫 建立 GitHub 問題時包含該文件,以幫助我們調查。

總結

Turbopack 是一個基於 Rust增量打包工具,旨在使本地開發和建置變得快速——特別是對於大型應用程式。它整合到 Next.js 中,提供零配置的 CSS、React 和 TypeScript 支援。

請持續關注更多更新,因為我們將繼續改進 Turbopack 並新增生產建置支援。同時,請嘗試使用 next dev --turbopack 並告訴我們您的反饋。

版本變更

版本變更
v15.3.0實驗性支援 build
v15.0.0Turbopack 用於 dev 穩定