Turbopack
Turbopack 是一個增量打包器,專為 JavaScript 和 TypeScript 最佳化,用 Rust 編寫,並內置於 Next.js 中。您可以將 Turbopack 與 Pages 和 App Router 配合使用,以獲得更快的本地開發體驗。
為何選擇 Turbopack?
我們構建 Turbopack 是為了提升 Next.js 的效能,其中包括
- 統一圖: Next.js 支援多種輸出環境(例如,客戶端和伺服器)。管理多個編譯器並將包縫合在一起可能很繁瑣。Turbopack 為所有環境使用單個統一圖。
- 打包與原生 ESM: 有些工具在開發中跳過打包,並依賴瀏覽器的原生 ESM。這對於小型應用程式很有效,但由於過多的網路請求,可能會減慢大型應用程式的速度。Turbopack 在開發中打包,但以最佳化方式保持大型應用程式的快速。
- 增量計算: Turbopack 在多個核心之間並行工作,並將結果快取到函式級別。一旦完成一項工作,Turbopack 不會重複它。
- 懶惰打包: Turbopack 只打包開發伺服器實際請求的內容。這種懶惰方法可以減少初始編譯時間和記憶體使用。
開始使用
Turbopack 現在是 Next.js 中的預設打包器。使用 Turbopack 無需配置
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}使用 Webpack 而不是 Turbopack
如果需要使用 Webpack 而不是 Turbopack,可以使用 --webpack 標誌進行選擇
{
"scripts": {
"dev": "next dev --webpack",
"build": "next build --webpack",
"start": "next start"
}
}支援的功能
Next.js 中的 Turbopack 對於常見用例是零配置的。以下是開箱即用支援的功能摘要,以及在需要時如何進一步配置 Turbopack 的一些參考。
語言功能
| 功能 | 狀態 | 備註 |
|---|---|---|
| JavaScript 和 TypeScript | 支援 | 底層使用 SWC。型別檢查不由 Turbopack 完成(執行 tsc --watch 或依賴您的 IDE 進行型別檢查)。 |
| ECMAScript (ESNext) | 支援 | Turbopack 支援最新的 ECMAScript 功能,與 SWC 的覆蓋範圍一致。 |
| CommonJS | 支援 | require() 語法開箱即用。 |
| ESM | 支援 | 靜態和動態 import 完全支援。 |
| Babel | 支援 | 從 Next.js 16 開始,如果 Turbopack 檢測到配置檔案,它會自動使用 Babel。與 webpack 不同,SWC 始終用於 Next.js 的內部轉換和降級到舊版 ECMAScript。如果存在 Babel 配置檔案,帶 webpack 的 Next.js 將停用 SWC。node_modules 中的檔案被排除,除非您手動配置 babel-loader。 |
框架和 React 功能
| 功能 | 狀態 | 備註 |
|---|---|---|
| JSX / TSX | 支援 | SWC 處理 JSX/TSX 編譯。 |
| 快速重新整理 | 支援 | 無需配置。 |
| React Server Components (RSC) | 支援 | 適用於 Next.js App Router。Turbopack 確保正確的伺服器/客戶端打包。 |
| 根佈局建立 | 不支援 | App Router 中不支援自動建立根佈局。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 開箱即用。不支援自定義 Sass 函式 (sassOptions.functions),因為 Turbopack 基於 Rust 的架構無法直接執行 JavaScript 函式,這與 webpack 的 Node.js 環境不同。如果需要此功能,請使用 webpack。將來,Turbopack 獨立使用可能需要載入器配置。 |
| Less | 計劃透過外掛實現 | 預設尚不支援。一旦自定義載入器穩定,可能需要載入器配置。 |
| Lightning CSS | 正在使用中 | 處理 CSS 轉換。一些低使用率的 CSS Modules 功能(如 :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 懶惰地構建開發伺服器請求的內容,加速大型應用程式。 |
與 webpack 的已知差距
在遷移應用程式時,webpack 和 Turbopack 之間存在許多重要的行為差異,需要注意。通常,這些對於新應用程式來說不是問題。
CSS 模組排序
Turbopack 將遵循 JS 匯入順序來排序未指定順序的CSS 模組。例如
import utilStyles from './utils.module.css'
import buttonStyles from './button.module.css'
export default function BlogPost() {
return (
<div className={utilStyles.container}>
<button className={buttonStyles.primary}>Click me</button>
</div>
)
}在此示例中,Turbopack 將確保 utils.module.css 將在生成的 CSS 塊中出現在 button.module.css 之前,遵循匯入順序
Webpack 通常也會這樣做,但在某些情況下它會忽略 JS 推斷的順序,例如它推斷 JS 檔案是無副作用的。
如果應用程式依賴任意排序,這可能會在採用 Turbopack 時導致細微的渲染變化。通常,解決方案很簡單,例如讓 button.module.css @import utils.module.css 以強制排序,或者識別衝突的規則並更改它們以不針對相同的屬性。
Sass node_modules 匯入
Turbopack 開箱即用支援匯入 node_modules Sass 檔案。Webpack 支援舊版波浪號 ~ 語法,Turbopack 不支援。
從
@import '~bootstrap/dist/css/bootstrap.min.css';到
@import 'bootstrap/dist/css/bootstrap.min.css';如果無法更新匯入,可以新增 turbopack.resolveAlias 配置將 ~ 語法對映到實際路徑
module.exports = {
turbopack: {
resolveAlias: {
'~*': '*',
},
},
}包大小
根據我們對生產應用程式的測試,我們觀察到 Turbopack 生成的包大小通常與 Webpack 相似。然而,比較可能很困難,因為 turbopack 傾向於生成更少但更大的塊。我們的建議是關注更高層次的指標,例如核心 Web 生命體徵或您自己的應用程式級指標來比較兩種打包器的效能。然而,我們確實意識到一個可能偶爾導致大規模迴歸的差距。
Turbopack 尚未擁有 webpack 中預設啟用的內部圖最佳化的等效功能。此最佳化對於搖樹大型模組很有用。例如
import heavy from 'some-heavy-dependency.js'
export function usesHeavy() {
return heavy.run()
}
export const CONSTANT_VALUE = 3如果應用程式只使用 CONSTANT_VALUE,Turbopack 將檢測到這一點並刪除 usesHeavy 匯出,但不會刪除相應的 import。然而,透過內部圖最佳化,webpack 也可以刪除 import,這也可以刪除依賴項。
我們計劃在 Turbopack 中提供等效的內部圖最佳化,但仍在開發中。如果您受到此差距的影響,請考慮手動拆分模組。
構建快取
Webpack 支援磁碟構建快取以提高構建效能。Turbopack 提供了類似的選擇加入功能,目前處於測試階段。從 Next 16 開始,您可以透過設定以下實驗性標誌來啟用 Turbopack 的檔案系統快取
須知: 因此,在比較 webpack 和 Turbopack 效能時,請務必在構建之間刪除
.next資料夾以進行公平比較,或啟用 turbopack 檔案系統快取功能。
Webpack 外掛
Turbopack 不支援 webpack 外掛。這會影響依賴 webpack 外掛系統進行整合的第三方工具。我們確實支援webpack 載入器。如果您依賴 webpack 外掛,則需要找到相容 Turbopack 的替代方案,或者繼續使用 webpack,直到提供等效功能。
不支援和未計劃的功能
某些功能尚未實現或未計劃
- 舊版 CSS Modules 功能
- 獨立的
:local和:global偽類(僅支援函式變體:global(...))。 @value規則(已被 CSS 變數取代)。:import和:exportICSS 規則。.module.css中的composes組合.css檔案。在 webpack 中,這將把.css檔案視為 CSS 模組,而對於 Turbopack,.css檔案將始終是全域性的。這意味著如果要在 CSS 模組中使用composes,需要將.css檔案更改為.module.css檔案。- CSS Modules 中的
@import匯入.css作為 CSS 模組。在 webpack 中,這將把.css檔案視為 CSS 模組,而對於 Turbopack,.css檔案將始終是全域性的。這意味著如果要在 CSS 模組中使用@import,需要將.css檔案更改為.module.css檔案。
- 獨立的
sassOptions.functions不支援在sassOptions.functions中定義的自定義 Sass 函式。此功能允許定義可在編譯期間從 Sass 程式碼呼叫的 JavaScript 函式。Turbopack 基於 Rust 的架構無法直接執行透過sassOptions.functions傳遞的 JavaScript 函式,這與完全在 JavaScript 中執行的 webpack 基於 Node.js 的 sass-loader 不同。如果您正在使用自定義 Sass 函式,則需要使用 webpack 而不是 Turbopack。webpack()配置 在next.config.js中 Turbopack 取代了 webpack,因此不識別webpack()配置。請改用turbopack配置。- Yarn PnP 不計劃在 Next.js 中支援 Turbopack。
experimental.urlImports不計劃用於 Turbopack。experimental.esmExternals不計劃。Turbopack 不支援 Next.js 中的舊版esmExternals配置。- 一些 Next.js 實驗性標誌
experimental.nextScriptWorkersexperimental.sri.algorithmexperimental.fallbackNodePolyfills我們計劃將來實現這些功能。
有關每個功能標誌及其狀態的完整詳細分類,請參閱Turbopack API 參考。
配置
Turbopack 可以透過 next.config.js(或 next.config.ts)在 turbopack 鍵下進行配置。配置選項包括
rules定義用於檔案轉換的額外webpack 載入器。resolveAlias建立手動別名(類似於 webpack 中的resolve.alias)。resolveExtensions更改或擴充套件模組解析的副檔名。
module.exports = {
turbopack: {
// Example: adding an alias and custom file extension
resolveAlias: {
underscore: 'lodash',
},
resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
},
}有關更深入的配置示例,請參閱Turbopack 配置文件。
生成跟蹤檔案以進行效能除錯
如果您遇到效能或記憶體問題並希望幫助 Next.js 團隊診斷它們,可以透過在開發命令後附加 NEXT_TURBOPACK_TRACING=1 來生成跟蹤檔案
NEXT_TURBOPACK_TRACING=1 next dev這將生成一個 .next/dev/trace-turbopack 檔案。在 Next.js 儲存庫上建立 GitHub issue 時,請包含此檔案,以幫助我們進行調查。
預設情況下,開發伺服器輸出到 .next/dev。閱讀有關isolatedDevBuild的更多資訊。
總結
Turbopack 是一個基於 Rust 的增量打包器,旨在使本地開發和構建變得快速——特別是對於大型應用程式。它整合到 Next.js 中,提供零配置的 CSS、React 和 TypeScript 支援。
版本變更
| 版本 | 更改 |
|---|---|
v16.0.0 | Turbopack 成為 Next.js 的預設打包器。當找到配置檔案時,自動支援 Babel。 |
v15.5.0 | Turbopack 支援 build 測試版 |
v15.3.0 | 對 build 的實驗性支援 |
v15.0.0 | 用於 dev 的 Turbopack 穩定版 |
這有幫助嗎?