Menu

Turbopack

Turbopackは、JavaScriptとTypeScriptに最適化されたインクリメンタルバンドラーで、Rustで書かれ、Next.jsに組み込まれています。ページルーターとアプリルーターの両方でTurbopackを使用でき、はるかに高速なローカル開発体験が得られます。

Turbopackを選ぶ理由

Turbopackは、以下を含むNext.jsのパフォーマンスを向上させるために構築されました。

  • 統一グラフ: Next.jsは複数の出力環境(例えば、クライアントとサーバー)をサポートしています。複数のコンパイラーの管理とバンドルの結合は面倒です。Turbopackはすべての環境に対して単一の統一グラフを使用します。
  • バンドリング対ネイティブESM: 一部のツールは開発時にバンドリングをスキップし、ブラウザーのネイティブESMに依存しています。これは小規模なアプリでは機能しますが、ネットワークリクエストが過剰になるため大規模なアプリでは速度が低下することがあります。Turbopackは開発時にバンドルしますが、大規模なアプリを高速に保つために最適化された方法で行います。
  • インクリメンタルな計算: Turbopackはコア間で作業を並列化し、結果をキャッシュします(関数レベルまで)。作業が完了したら、Turbopackはそれを繰り返しません。
  • レイジーバンドリング: Turbopackは開発サーバーによって実際にリクエストされたものだけをバンドルします。このレイジーなアプローチにより、初期コンパイル時間とメモリ使用量を削減できます。

はじめる

Turbopackはいまや、Next.jsのデフォルトバンドラーです。Turbopackを使用するために設定は必要ありません。

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

代わりにWebpackを使用する

Turbopackの代わりにWebpackを使用する必要がある場合は、--webpackフラグでオプトインできます。

package.json
{
  "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リビジョンへのダウンレベリングに使用されます。Next.jsとwebpackでは、Babel設定ファイルが存在する場合、SWCが無効になります。node_modules内のファイルは除外されます。ただし、babel-loaderを手動で設定した場合は除きます。

フレームワークとReact機能

機能ステータスメモ
JSX / TSXサポート済みSWCがJSX/TSXのコンパイルを処理します。
Fast Refreshサポート済み設定は不要です。
React Server Components (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は標準でサポートされています。カスタムSass関数(sassOptions.functions)はサポートされていません。これは、Turbopackの Rust ベースのアーキテクチャでは、webpack の Node.js 環境とは異なり、JavaScript 関数を直接実行できないためです。この機能が必要な場合はwebpackを使用してください。将来的には、Turbopack スタンドアロン使用にはおそらくローダー設定が必要になります。
Lessプラグイン経由で計画中デフォルトではまだサポートされていません。カスタムローダーが安定したら、ローダー設定が必要になる可能性があります。
Lightning CSS使用中CSS変換を処理します。いくつかの低使用率のCSSモジュール機能(:local/:globalをスタンドアロンの疑似クラスとして使用する場合など)はまだサポートされていません。詳細については以下を参照してください。

アセット

機能ステータスメモ
静的アセット(画像、フォント)サポート済みimport img from './img.png'のインポートは標準で機能します。Next.jsでは、<Image />コンポーネント用のオブジェクトを返します。
JSONインポートサポート済み.jsonからの名前付きまたはデフォルトインポートがサポートされています。

モジュール解決

機能ステータスメモ
パスエイリアスサポート済みtsconfig.jsonpathsbaseUrlを読み込み、Next.jsの動作に一致させます。
手動エイリアスサポート済みnext.config.jsresolveAliasを設定します(webpack.resolve.aliasに似ています)。
カスタム拡張子サポート済みnext.config.jsresolveExtensionsを設定します。
AMD部分的サポート基本的な変換は機能します。高度なAMD使用は制限されています。

パフォーマンスとFast Refresh

機能ステータスメモ
Fast Refreshサポート済み完全なリフレッシュなしでJavaScript、TypeScript、CSSを更新します。
インクリメンタルバンドリングサポート済みTurbopackは開発サーバーによってリクエストされたものだけを遅延ビルドし、大規模なアプリの速度を向上させます。

webpackとの既知のギャップ

webpackとTurbopackの間には、アプリケーションを移行する際に認識すべき多くの重要な動作の違いがあります。一般的に、これらは新しいアプリケーションではあまり懸念事項ではありません。

CSSモジュールの順序付け

Turbopackは、JS インポート順序に従ってCSSモジュールを順序付けします。これらは明示的に順序付けされていません。例えば、

components/BlogPost.jsx
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}>クリック</button>
    </div>
  )
}

この例では、Turbopackは、生成されたCSSチャンク内でutils.module.cssbutton.module.cssの前に表示されることを保証します。これはインポート順序に従っています。

Webpackも一般的にこれを行いますが、JS ファイルが副作用なしと推測される場合など、JS 推定順序を無視する場合があります。

Turbopackを採用する際に、アプリケーションが任意の順序に依存するようになっている場合、微妙なレンダリング変更が発生する可能性があります。一般的に、解決策は簡単です。例えば、button.module.css@import utils.module.cssを使用して順序を強制したり、競合するルールを特定して同じプロパティをターゲットにしないように変更したりします。

Sassのnode_modulesインポート

Turbopackは、node_modulesのSassファイルのインポートを標準でサポートしています。Webpackはこのためのレガシータイルダー~構文をサポートしていますが、Turbopackではサポートされていません。

変更前:

styles/globals.scss
@import '~bootstrap/dist/css/bootstrap.min.css';

変更後:

styles/globals.scss
@import 'bootstrap/dist/css/bootstrap.min.css';

インポートを更新できない場合は、turbopack.resolveAlias設定を追加して、~構文を実際のパスにマップできます。

next.config.js
module.exports = {
  turbopack: {
    resolveAlias: {
      '~*': '*',
    },
  },
}

バンドルサイズ

本番アプリケーションでのテストから、Turbopackは一般的にWebpackと同様のサイズのバンドルを生成することが観察されました。ただし、turbopackはより少ないがより大きなチャンクを生成する傾向があるため、比較は困難です。より高いレベルのメトリクス(Core Web Vitalsなど)またはバンドラー間のパフォーマンスを比較するための独自のアプリケーションレベルのメトリクスに焦点を当てることをお勧めします。ただし、大きな回帰を時々引き起こす可能性のある1つのギャップに気付いています。

Turbopackにはまだ、webpackのデフォルトで有効になっているInner Graph Optimizationに相当するものがありません。この最適化は大規模なモジュールをツリーシェイクするのに便利です。例えば、

large.module.js
import heavy from 'some-heavy-dependency.js'
 
export function usesHeavy() {
  return heavy.run()
}
 
export const CONSTANT_VALUE = 3

アプリケーションがCONSTANT_VALUEのみを使用する場合、Turbopackはこれを検出し、usesHeavyエクスポートを削除しますが、対応するimportは削除しません。ただし、Inner Graph Optimization を使用する場合、webpack はimportも削除でき、依存関係も削除できます。

Turbopackで Inner Graph Optimization に相当するものを提供することを計画していますが、まだ開発中です。このギャップの影響を受ける場合は、モジュールの手動分割を検討してください。

ビルドキャッシング

Webpackはディスクビルドキャッシングをサポートして、ビルドパフォーマンスを向上させます。Turbopackは、現在ベータ版の同様なオプトイン機能を提供しています。Next 16以降では、以下の実験的フラグを設定することでTurbopackのファイルシステムキャッシュを有効にできます。

補足: このため、webpackとTurbopackのパフォーマンスを比較する際は、公正な比較を確認するために、ビルド間で.nextフォルダーを削除するか、turbopackファイルシステムキャッシュ機能を有効にしてください。

Webpackプラグイン

Turbopackはwebpackプラグインをサポートしていません。これは統合のためにwebpackのプラグインシステムに依存するサードパーティーツールに影響します。webpackローダーはサポートしています。webpackプラグインに依存している場合は、Turbopack互換の代替案を見つけるか、同等の機能が利用可能になるまでwebpackを使用し続ける必要があります。

サポートされていない、計画されていない機能

いくつかの機能はまだ実装されていないか、計画されていません。

  • レガシーCSSモジュール機能
    • スタンドアロンの:local:global疑似クラス(関数バリアント:global(...)のみサポートされています)。
    • @valueルール(CSS変数に置き換わった)。
    • :import:exportICSルール。
    • .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ファイルに変更する必要があります。
  • sassOptions.functions sassOptions.functionsで定義されたカスタムSass関数はサポートされていません。この機能により、Sassコードのコンパイル中に呼び出すことができるJavaScript関数を定義できます。TurbopackのRustベースのアーキテクチャでは、webpack のNode.jsベースのsass-loaderのようにJavaScript経由で完全に実行されるsassOptions.functionsを通じて渡されるJavaScript関数を直接実行できません。カスタムSass関数を使用している場合は、Turbopackの代わりにwebpackを使用する必要があります。
  • next.config.js内のwebpack()設定 Turbopackはwebpackに置き換わるため、webpack()設定は認識されません。代わりにturbopack設定を使用してください。
  • Yarn PnP Next.jsではTurbopackサポートに計画されていません。
  • experimental.urlImports Turbopackには計画されていません。
  • experimental.esmExternals 計画されていません。TurbopackはNext.jsのレガシーesmExternals設定をサポートしていません。
  • いくつかのNext.js実験的フラグ
    • experimental.nextScriptWorkers
    • experimental.sri.algorithm
    • experimental.fallbackNodePolyfills これらは将来実装することを計画しています。

各機能フラグと状態の詳細な詳細については、Turbopack APIリファレンスを参照してください。

設定

Turbopackはnext.config.js(またはnext.config.ts)のturbopackキーの下で設定できます。設定オプションには以下が含まれます。

  • rules ファイル変換用に追加のwebpackローダーを定義します。
  • resolveAlias 手動エイリアスを作成します(webpackのresolve.aliasのような)。
  • resolveExtensions モジュール解決のためにファイル拡張子を変更または拡張します。
next.config.js
module.exports = {
  turbopack: {
    // 例:エイリアスとカスタムファイル拡張子を追加する
    resolveAlias: {
      underscore: 'lodash',
    },
    resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
  },
}

より詳細な設定例については、Turbopack設定ドキュメントを参照してください。

パフォーマンスデバッグ用のトレースファイル生成

パフォーマンスまたはメモリの問題が発生した場合、Next.jsチームが診断するのに役立つようにトレースファイルを生成するには、NEXT_TURBOPACK_TRACING=1をdevコマンドに追加します。

NEXT_TURBOPACK_TRACING=1 next dev

これにより、.next/dev/trace-turbopackファイルが生成されます。Next.jsリポジトリでGitHub問題を作成する際にそのファイルを含め、診断を支援してください。

デフォルトでは、開発サーバーは.next/devに出力します。isolatedDevBuildの詳細を読んでください。

概要

Turbopackは、特に大規模なアプリケーションのローカル開発とビルドを高速化するために設計されたRustベースインクリメンタルバンドラーです。Next.jsに統合されており、ゼロコンフィグのCSS、React、TypeScriptサポートを提供しています。

バージョン変更

バージョン変更
v16.0.0Turbopackがデフォルトバンドラーになります。設定ファイルが見つかった場合の自動Babelサポート。
v15.5.0buildベータ版のTurbopackサポート
v15.3.0buildの実験的サポート
v15.0.0devの安定したTurbopack