コンテンツにスキップ

Turbopack

Turbopackは、Rustで書かれた、JavaScriptとTypeScriptに最適化されたインクリメンタルバンダーであり、Next.jsに組み込まれています。Pages RouterとApp Routerの両方でTurbopackを使用でき、はるかに高速なローカル開発体験を実現します。

Turbopackとは?

Next.jsのパフォーマンスを向上させるためにTurbopackを開発しました。これには以下が含まれます。

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

はじめに

Turbopackは現在、Next.jsのデフォルトバンダーです。Turbopackを使用するために設定は不要です。

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

Webpackを使用する場合

WebpackをTurbopackの代わりに引き続き使用したい場合は、--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とは異なり、Next.jsの内部変換と古いECMAScriptリビジョンへのダウンレベル変換には常にSWCが使用されます。Webpackを使用するNext.jsは、Babel設定ファイルが存在する場合、SWCを無効にします。node_modules内のファイルは除外されます。ただし、babel-loaderを手動で設定する場合は除きます。

フレームワークとReactの機能

機能ステータス注釈
JSX / TSXサポートJSX/TSXのコンパイルはSWCが処理します。
高速リフレッシュサポート設定不要。
React Server Components (RSC)サポートNext.js App Router向けです。Turbopackは、正しいサーバー/クライアントバンディングを保証します。
ルートレイアウトの作成未サポートApp Routerでのルートレイアウトの自動作成はサポートされていません。Turbopackは手動での作成を促します。

CSSとスタイリング

機能ステータス注釈
グローバルCSSサポートアプリケーションに.cssファイルを直接インポートしてください。
CSS Modulesサポート.module.cssファイルはネイティブで動作します(Lightning CSS)。
CSSネストサポートLightning CSSはモダンなCSSネストをサポートしています。
@import構文サポート複数のCSSファイルを結合します。
PostCSSサポートpostcss.config.jsをNode.jsワーカープールで自動的に処理します。Tailwind、Autoprefixerなどに便利です。
Sass / SCSSサポート済み (Next.js)Next.jsでは、Sassは標準でサポートされています。カスタムSass関数(sassOptions.functions)は、WebpackのNode.js環境とは異なり、TurbopackのRustベースのアーキテクチャはJavaScript関数を直接実行できないため、サポートされていません。この機能が必要な場合は、Webpackを使用してください。将来的には、Turbopackスタンドアロンの使用にはローダー設定が必要になる可能性があります。
Lessプラグイン経由で計画中まだデフォルトではサポートされていません。カスタムローダーが安定したら、ローダー設定が必要になるでしょう。
Lightning CSS使用中CSS変換を処理します。一部の低使用率のCSS Modules機能(スタンドアロン擬似クラスとしての: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

機能ステータス注釈
高速リフレッシュサポートフルリフレッシュなしで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}>Click me</button>
    </div>
  )
}

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

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

これは、アプリケーションが恣意的な順序に依存するようになった場合に、微妙なレンダリング変更につながる可能性があります。一般的に、解決策は簡単です。例えば、順序を強制するために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に相当するものはありません。この最適化は、大きなモジュールをツリーシェイクするのに役立ちます。例:

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を削除できるため、依存関係もドロップできます。

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

ビルドキャッシュ

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

知っておくと良いこと: このため、WebpackとTurbopackのパフォーマンスを比較する際は、ビルド間で.nextフォルダを削除して公平な比較を行うか、Turbopackのファイルシステムキャッシュ機能を有効にしてください。

Webpackプラグイン

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

未サポートおよび計画外の機能

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

  • レガシーCSS Modules機能
    • スタンドアロンの: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ファイルに変更する必要があることを意味します。
  • sassOptions.functions sassOptions.functionsで定義されたカスタムSass関数はサポートされていません。この機能は、コンパイル中にSassコードから呼び出すことができるJavaScript関数を定義できます。TurbopackのRustベースのアーキテクチャは、JavaScript全体で実行されるWebpackのNode.jsベースのsass-loaderとは異なり、sassOptions.functionsを介して渡されたJavaScript関数を直接実行できません。カスタムSass関数を使用している場合は、Turbopackの代わりにWebpackを使用する必要があります。
  • 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.nextScriptWorkers
    • experimental.sri.algorithm
    • experimental.fallbackNodePolyfills 今後実装する予定です。

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

設定

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

  • rules ファイル変換のための追加のWebpackローダーを定義します。
  • resolveAlias 手動エイリアスを作成します(Webpackのresolve.aliasと同様)。
  • resolveExtensions モジュール解決のためのファイル拡張子を変更または追加します。
next.config.js
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ファイルが生成されます。このファイルをGitHubのNext.jsリポジトリに問題を作成する際に含めて、調査に役立ててください。

デフォルトでは、開発サーバーは.next/devに出力します。isolatedDevBuildについて読む。

まとめ

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

バージョン変更履歴

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