turbopack
turbopack オプションを使用すると、Turbopack をカスタマイズして、さまざまなファイルを変換したり、モジュールの解決方法を変更したりできます。
知っておくと良いこと:
turbopackオプションは、以前は Next.js バージョン 13.0.0 から 15.2.x までexperimental.turboという名前でした。experimental.turboオプションは Next.js 16 で削除される予定です。古いバージョンの Next.js を使用している場合は、
npx @next/codemod@latest next-experimental-turbo-to-turbopack .を実行して、設定を自動的に移行してください。
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
turbopack: {
// ...
},
}
export default nextConfig知っておくと良いこと:
- Next.js 用の Turbopack は、組み込み機能のためにローダーやローダー設定を必要としません。Turbopack は CSS および最新 JavaScript のコンパイルを組み込みでサポートしているため、
@babel/preset-envを使用している場合はcss-loader、postcss-loader、またはbabel-loaderは必要ありません。
リファレンス
オプション
turbopack 設定で利用可能なオプションは次のとおりです。
| オプション | 説明 |
|---|---|
root | アプリケーションのルートディレクトリを設定します。絶対パスである必要があります。 |
rules | Turbopack で実行するときに適用される、サポートされている webpack ローダーのリスト。 |
resolveAlias | エイリアスされたインポートを、代わりにロードされるモジュールにマッピングします。 |
resolveExtensions | ファイルをインポートするときに解決される拡張機能のリスト。 |
debugIds | JavaScript バンドルおよびソースマップで デバッグID の生成を有効にします。 |
サポートされているローダー
Turbopack の webpack ローダー実装で動作することがテストされたローダーは以下の通りですが、ここにリストされていない他の多くの webpack ローダーも機能するはずです。
babel-loader(Babel 設定ファイルが見つかった場合は自動的に設定されます)@svgr/webpacksvg-inline-loaderyaml-loaderstring-replace-loaderraw-loadersass-loader(自動的に設定されます)graphql-tag/loader
Webpackローダー機能の欠如
Turbopack は webpack ローダーを実行するために loader-runner ライブラリを使用しており、標準的なローダー API のほとんどを提供します。ただし、一部の機能はサポートされていません。
モジュールのロード
importModule- サポートなしloadModule- サポートなし
ファイルシステムと出力
コンテキストプロパティ
ユーティリティ
utils- サポートなしresolve- サポートなし (代わりにgetResolveを使用してください)
これらの機能のいずれかにクリティカルに依存しているローダーがある場合は、問題を報告してください。
例
ルートディレクトリ
Turbopack はモジュールを解決するためにルートディレクトリを使用します。プロジェクトルート外のファイルは解決されません。
Next.js はプロジェクトのルートディレクトリを自動的に検出します。これは、次のいずれかのファイルを探すことによって行われます。
pnpm-lock.yamlpackage-lock.jsonyarn.lockbun.lockbun.lockb
異なるプロジェクト構造の場合、たとえばワークスペースを使用しない場合、root オプションをマニュアルで設定できます。
const path = require('path')
module.exports = {
turbopack: {
root: path.join(__dirname, '..'),
},
}Webpackローダーの設定
組み込み機能以上のローダーサポートが必要な場合、多くの webpack ローダーは既に Turbopack で動作します。現在、いくつかの制限があります。
- webpack ローダー API のコアサブセットのみが実装されています。現在、いくつかの人気のあるローダーで十分なカバレッジがありますが、API サポートは将来的に拡大していきます。
- JavaScript コードを返すローダーのみがサポートされています。スタイルシートや画像のようなファイルを変換するローダーは、現在サポートされていません。
- webpack ローダーに渡されるオプションは、プレーンな JavaScript のプリミティブ、オブジェクト、および配列である必要があります。たとえば、オプションの値として
require()プラグインモジュールを渡すことはできません。
ローダーを設定するには、インストールしたローダーの名前とオプションを next.config.js に追加し、ファイル拡張子をローダーのリストにマッピングします。ルールは順番に評価されます。
以下は、.svg ファイルをインポートして React コンポーネントとしてレンダリングできるようにする @svgr/webpack ローダーを使用した例です。
module.exports = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
}知っておくと良いこと:
rulesオブジェクトで使用されるグロブは、ファイル名に基づいて一致しますが、グロブに/文字が含まれている場合、それは完全なプロジェクト相対ファイルパスに基づいて一致します。Windows のファイルパスは Unix スタイルの/パス区切り文字を使用するように正規化されます。Turbopack は、Rust の
globsetライブラリ を変更したバージョンを使用しています。
設定オプションが必要なローダーの場合、文字列の代わりにオブジェクト形式を使用できます。
module.exports = {
turbopack: {
rules: {
'*.svg': {
loaders: [
{
loader: '@svgr/webpack',
options: {
icon: true,
},
},
],
as: '*.js',
},
},
},
}知っておくと良いこと: Next.js バージョン 13.4.4 より前では、
turbopack.rulesはturbo.loadersという名前で、*.mdxの代わりに.mdxのようなファイル拡張子のみを受け入れていました。
高度なWebpackローダー条件
高度な condition 構文を使用して、ローダーが実行される場所をさらに制限できます。
module.exports = {
turbopack: {
rules: {
// '*' will match all file paths, but we restrict where our
// rule runs with a condition.
'*': {
condition: {
all: [
// 'foreign' is a built-in condition.
{ not: 'foreign' },
// 'path' can be a RegExp or a glob string. A RegExp matches
// anywhere in the full project-relative file path.
{ path: /^img\/[0-9]{3}\// },
{
any: [
{ path: '*.svg' },
// 'content' is always a RegExp, and can match
// anywhere in the file.
{ content: /\<svg\W/ },
],
},
],
},
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
}- サポートされているブール演算子は
{all: [...]}、{any: [...]}、および{not: ...}です。 - サポートされているカスタマイズ可能な演算子は
{path: string | RegExp}および{content: RegExp}です。pathとcontentが同じオブジェクトに指定されている場合、暗黙的なandとして機能します。
さらに、いくつかの組み込み条件がサポートされています。
browser: クライアントで実行されるコードに一致します。サーバーコードは{not: 'browser'}を使用して一致させることができます。foreign:node_modules内のコード、および一部の Next.js 内部ファイルに一致します。通常、ローダーを{not: 'foreign'}に制限したい場合が多いです。これにより、ローダーが呼び出されるファイル数を減らすことでパフォーマンスが向上する可能性があります。development:next devを使用している場合に一致します。production:next buildを使用している場合に一致します。node: デフォルトの Node.js ランタイムで実行されるコードに一致します。edge-light: Edge ランタイムで実行されるコードに一致します。
ルールはオブジェクトまたはオブジェクトの配列にすることができます。配列は、不連続な条件をモデリングするのに役立つことがよくあります。
module.exports = {
turbopack: {
rules: {
'*.svg': [
{
condition: 'browser',
loaders: ['@svgr/webpack'],
as: '*.js',
},
{
condition: { not: 'browser' },
loaders: [require.resolve('./custom-svg-loader.js')],
as: '*.js',
},
],
},
},
}知っておくと良いこと: すべての一致するルールは順番に実行されます。
エイリアスの解決
Turbopack は、webpack の resolve.alias 設定と同様に、エイリアスを通じてモジュール解決を変更するように設定できます。
解決エイリアスを設定するには、next.config.js でインポートパターンを新しい宛先にマッピングします。
module.exports = {
turbopack: {
resolveAlias: {
underscore: 'lodash',
mocha: { browser: 'mocha/browser-entry.js' },
},
},
}これにより、underscore パッケージのインポートが lodash パッケージにエイリアスされます。つまり、import underscore from 'underscore' は、underscore の代わりに lodash モジュールをロードします。
Turbopack は、Node.js の 条件付きエクスポート と同様に、このフィールドを通じて条件付きエイリアスもサポートしています。現時点では browser 条件のみがサポートされています。上記の例では、Turbopack がブラウザ環境をターゲットとする場合、mocha モジュールのインポートは mocha/browser-entry.js にエイリアスされます。
カスタム拡張機能の解決
Turbopack は、webpack の resolve.extensions 設定と同様に、カスタム拡張機能でモジュールを解決するように設定できます。
解決拡張機能を設定するには、next.config.js で resolveExtensions フィールドを使用します。
module.exports = {
turbopack: {
resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.mjs', '.json'],
},
}これにより、元の解決拡張機能は提供されたリストで上書きされます。デフォルトの拡張機能を含めるようにしてください。
webpack から Turbopack へのアプリの移行方法に関する詳細情報やガイダンスについては、webpack 互換性に関する Turbopack のドキュメント を参照してください。
デバッグID
Turbopack は、JavaScript バンドルおよびソースマップで デバッグID を生成するように設定できます。
デバッグIDを設定するには、next.config.js で debugIds フィールドを使用します。
module.exports = {
turbopack: {
debugIds: true,
},
}このオプションは、互換性を確保するために JavaScript バンドルにデバッグIDのポリフィルを自動的に追加します。デバッグIDは globalThis._debugIds グローバル変数で利用できます。
バージョン履歴
| バージョン | 変更履歴 |
|---|---|
16.0.0 | turbopack.debugIds が追加されました。 |
16.0.0 | turbopack.rules.*.condition が追加されました。 |
15.3.0 | experimental.turbo は turbopack に変更されました。 |
13.0.0 | experimental.turbo が導入されました。 |
役に立ちましたか?