brand logo

ドキュメント

実験的機能

Nuxtの実験的機能を有効にして新しい可能性を開きましょう。

Nuxtの実験的機能は、Nuxtの設定ファイルで有効にすることができます。

内部的には、Nuxtは@nuxt/schemaを使用してこれらの実験的機能を定義しています。詳細については、APIドキュメントまたはソースコードを参照してください。

これらの機能は実験的であり、将来的に削除または変更される可能性がありますのでご注意ください。

asyncContext

ネイティブの非同期コンテキストを有効にして、NuxtおよびNitroでネストされたコンポーザブルにアクセスできるようにします。これにより、非同期コンポーザブル内でコンポーザブルを使用する可能性が開かれ、Nuxt instance is unavailableエラーが発生する可能性を減らします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    asyncContext: true
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 20918

asyncEntry

Vueバンドルの非同期エントリーポイントの生成を有効にし、モジュールフェデレーションのサポートを支援します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    asyncEntry: true
  }
})

externalVue

ビルド時にvue@vue/*vue-routerを外部化します。

デフォルトで有効です。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    externalVue: true
  }
})

この機能は近い将来削除される可能性があります。

treeshakeClientOnly

サーバーバンドルからクライアント専用コンポーネントの内容をツリーシェイクします。

デフォルトで有効です。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    treeshakeClientOnly: true
  }
})

emitRouteChunkError

vite/webpackチャンクの読み込みエラーが発生したときにapp:chunkErrorフックを発行します。デフォルトの動作は、チャンクの読み込みに失敗したときに新しいルートへのナビゲーションで新しいルートをリロードすることです。

これを'automatic-immediate'に設定すると、ナビゲーションを待たずに現在のルートを即座にリロードします。これは、ナビゲーションによってトリガーされないチャンクエラーに役立ちます。例えば、Nuxtアプリが遅延コンポーネントの読み込みに失敗した場合です。この動作の潜在的な欠点は、エラーを引き起こしたチャンクがアプリに必要ない場合などに、望ましくないリロードが発生することです。

自動処理を無効にするには、これをfalseに設定するか、手動でチャンクエラーを処理するにはmanualに設定します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    emitRouteChunkError: 'automatic' // または 'automatic-immediate', 'manual' または false
  }
})

restoreState

チャンクエラー後や手動のreloadNuxtApp()呼び出し後にページをリロードする際に、sessionStorageからNuxtアプリの状態を復元できるようにします。

ハイドレーションエラーを避けるため、Vueアプリがマウントされた後にのみ適用されるため、初回ロード時にちらつきが発生する可能性があります。

これを有効にする前に慎重に検討してください。予期しない動作を引き起こす可能性があります。また、ビルド間で一致しない可能性があるため、useStateに明示的なキーを提供することを検討してください。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    restoreState: true
  }
})

inlineRouteRules

defineRouteRulesを使用してページレベルでルートルールを定義します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    inlineRouteRules: true
  }
})

ページのpathに基づいて、マッチングするルートルールが作成されます。

こちらも参照 api > utils > define-route-rules こちらも参照 guide > concepts > rendering#hybrid-rendering

renderJsonPayloads

複雑な型を復活させるサポートを持つJSONペイロードのレンダリングを可能にします。

デフォルトで有効です。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    renderJsonPayloads: true
  }
})

noVueServer

Nitro内でVueサーバーレンダラーエンドポイントを無効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    noVueServer: true
  }
})

payloadExtraction

nuxt generateで生成されたページのペイロードの抽出を有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    payloadExtraction: true
  }
})

clientFallback

SSRでエラーが発生した場合にクライアントでコンテンツをレンダリングするための実験的な<NuxtClientFallback>コンポーネントを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    clientFallback: true
  }
})

crossOriginPrefetch

Speculation Rules APIを使用したクロスオリジンプリフェッチを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    crossOriginPrefetch: true
  }
})
こちらも参照 wicg.github.io > nav-speculation > prefetch.html

viewTransition

クライアントサイドルーターとのView Transition API統合を有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    viewTransition: true
  }
})
サンプルコードの編集とプレビューhttps: > stackblitz.com > edit > nuxt-view-transitions?file=app.vue
こちらも参照 developer.mozilla.org > en-US > docs > Web > API > View_Transitions_API

writeEarlyHints

ノードサーバーを使用する際に早期ヒントの書き込みを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    writeEarlyHints: true
  }
})

componentIslands

<NuxtIsland>および.island.vueファイルを使用した実験的なコンポーネントアイランドのサポートを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    componentIslands: true // false または 'local+remote'
  }
})
こちらも参照 guide > directory-structure > components#server-components こちらも参照 github.com > nuxt > nuxt > issues > 19772

configSchema

設定スキーマのサポートを有効にします。

デフォルトで有効です。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    configSchema: true
  }
})

polyfillVueUseHead

古い@vueuse/head APIに依存するモジュール、プラグイン、またはユーザーコードの互換レイヤーを追加します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    polyfillVueUseHead: false
  }
})

respectNoSSRHeader

x-nuxt-no-ssrヘッダーを設定することでNuxtのSSRレスポンスを無効にすることを許可します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    respectNoSSRHeader: false
  }
})

localLayerAliases

レイヤー内の~~~@@@エイリアスをそのレイヤーのソースおよびルートディレクトリに基づいて解決します。

デフォルトで有効です。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    localLayerAliases: true
  }
})

typedPages

unplugin-vue-routerを使用した新しい実験的な型付きルーターを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    typedPages: true
  }
})

これにより、navigateTo<NuxtLink>router.push()などの型付き使用が可能になります。

ページ内でconst route = useRoute('route-name')を使用することで、型付きのパラメータを取得することもできます。

pnpmshamefully-hoist=trueなしで使用する場合、この機能を動作させるためにunplugin-vue-routerをdevDependencyとしてインストールする必要があります。

watcher

Nuxtのウォッチングサービスとして使用される代替ウォッチャーを設定します。

Nuxtはデフォルトでchokidar-granularを使用し、ウォッチングから除外されたトップレベルディレクトリ(node_modules.gitなど)を無視します。

代わりにparcelを設定して@parcel/watcherを使用することができ、大規模プロジェクトやWindowsプラットフォームでのパフォーマンスを向上させることができます。

また、chokidarを設定してソースディレクトリ内のすべてのファイルをウォッチすることもできます。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    watcher: 'chokidar-granular' // 'chokidar' または 'parcel' もオプションです
  }
})

sharedPrerenderData

この機能を有効にすると、プリレンダリングされたページ間でペイロードデータが自動的に共有されます。これにより、useAsyncDatauseFetchを使用して異なるページで同じデータを取得するサイトをプリレンダリングする際に、パフォーマンスが大幅に向上する可能性があります。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    sharedPrerenderData: true
  }
})

この機能を有効にする際には、データの一意のキーが常に同じデータに解決可能であることを確認することが特に重要です。例えば、特定のページに関連するデータを取得するためにuseAsyncDataを使用している場合、そのデータに一意に一致するキーを提供する必要があります。(useFetchは自動的にこれを行います。)

// 動的ページ(例: `[slug].vue`)では安全ではありません。ルートスラッグが取得されるデータに影響を与えるためです。
// しかし、Nuxtはそれをキーに反映できないため、知ることができません。
const route = useRoute()
const { data } = await useAsyncData(async () => {
  return await $fetch(`/api/my-page/${route.params.slug}`)
})
// 代わりに、取得されるデータを一意に識別するキーを使用する必要があります。
const { data } = await useAsyncData(route.params.slug, async () => {
  return await $fetch(`/api/my-page/${route.params.slug}`)
})

clientNodeCompat

この機能を使用すると、NuxtはクライアントビルドでNode.jsのインポートを自動的にポリフィルします。これはunenvを使用して行われます。

Bufferのようなグローバルをブラウザで動作させるには、それらを手動で注入する必要があります。

import { Buffer } from 'node:buffer'

globalThis.Buffer = globalThis.Buffer || Buffer

scanPageMeta

このオプションを使用すると、ビルド時にモジュールにdefinePageMetaで定義されたルートメタデータ(特にaliasnamepathredirectpropsmiddleware)の一部を公開できます。

これは、変数や条件付き代入ではなく、静的または文字列/配列でのみ機能します。詳細とコンテキストについては元の問題を参照してください。

また、すべてのルートがpages:extendで登録された後にのみページメタデータをスキャンすることも可能です。その場合、別のフックpages:resolvedが呼び出されます。この動作を有効にするには、scanPageMeta: 'after-resolve'を設定します。

この機能がプロジェクトで問題を引き起こす場合は無効にすることができます。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    scanPageMeta: false
  }
})

cookieStore

ブラウザがサポートしている場合、Cookieの更新をリッスンし、useCookieのref値を更新するためのCookieStoreサポートを有効にします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    cookieStore: true
  }
})
こちらも参照 developer.mozilla.org > en-US > docs > Web > API > CookieStore

buildCache

設定とソースファイルのハッシュに基づいてNuxtビルドアーティファクトをキャッシュします。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    buildCache: true
  }
})

有効にすると、次のファイルへの変更がフルリビルドをトリガーします:

Directory structure
.nuxtrc
.npmrc
package.json
package-lock.json
yarn.lock
pnpm-lock.yaml
tsconfig.json
bun.lock
bun.lockb

さらに、srcDir内のファイルへの変更はVueクライアント/サーバーバンドルのリビルドをトリガーします。Nitroは常にリビルドされます(ただし、Nitroがキャッシュ可能なアーティファクトとそのハッシュを発表できるようにする作業が進行中です)。

最大10個のキャッシュtarballが保持されます。

extraPageMetaExtractionKeys

definePageMeta()マクロは、ページに関するビルド時のメタデータを収集する便利な方法です。Nuxt自体は、リダイレクト、ページエイリアス、カスタムパスなどの内部機能を強化するために使用されるサポートキーのセットリストを提供します。

このオプションを使用すると、scanPageMetaを使用する際にページメタデータから抽出する追加のキーを渡すことができます。

definePageMeta({
  foo: 'bar'
})
export default defineNuxtConfig({
  experimental: {
    extraPageMetaExtractionKeys: ['foo'],
  },
  hooks: {
    'pages:resolved' (ctx) {
      // ✅ fooが利用可能です
    },
  },
})

これにより、モジュールはビルドコンテキストでページメタデータから追加のメタデータにアクセスできます。これをモジュール内で使用する場合、NuxtPageの型をキーで拡張することも推奨されます

normalizeComponentNames

自動生成されたVueコンポーネント名が、コンポーネントを自動インポートするために使用する完全なコンポーネント名と一致することを保証します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    normalizeComponentNames: true
  }
})

デフォルトでは、手動で設定していない場合、Vueはコンポーネントのファイル名に一致するコンポーネント名を割り当てます。

Directory structure
├─ components/
├─── SomeFolder/
├───── MyComponent.vue

この場合、Vueにとってコンポーネント名はMyComponentになります。これを<KeepAlive>で使用したり、Vue DevToolsで識別したりするには、このコンポーネントを使用する必要があります。

しかし、自動インポートするためにはSomeFolderMyComponentを使用する必要があります。

experimental.normalizeComponentNamesを設定すると、これらの2つの値が一致し、VueはNuxtのコンポーネント命名パターンに一致するコンポーネント名を生成します。

spaLoadingTemplateLocation

クライアント専用ページ(ssr: false)をレンダリングする際に、オプションでローディング画面(app/spa-loading-template.htmlから)をレンダリングします。

withinに設定すると、次のようにレンダリングされます:

<div id="__nuxt">
  <!-- spa loading template -->
</div>

または、bodyに設定してNuxtアプリのルートと並行してテンプレートをレンダリングすることもできます:

<div id="__nuxt"></div>
<!-- spa loading template -->

これにより、クライアント専用ページをハイドレートする際の白いフラッシュを回避します。

browserDevtoolsTiming

ブラウザのdevtoolsでNuxtフックのパフォーマンスマーカーを有効にします。これにより、Chromiumベースのブラウザのパフォーマンスタブで追跡できるパフォーマンスマーカーが追加され、デバッグやパフォーマンスの最適化に役立ちます。

これは開発モードでデフォルトで有効になっています。この機能を無効にする必要がある場合は、次のように設定できます:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    browserDevtoolsTiming: false
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 29922 こちらも参照 developer.chrome.com > docs > devtools > performance > extension

debugModuleMutation

モジュールコンテキストでのnuxt.optionsへのミューテーションを記録し、Nuxt初期化フェーズ中にモジュールによって行われた設定変更をデバッグするのに役立ちます。

これはdebugモードが有効な場合にデフォルトで有効になります。この機能を無効にする必要がある場合は、次のように設定できます:

明示的に有効にするには:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    debugModuleMutation: true
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 30555

lazyHydration

<Lazy>コンポーネントのハイドレーション戦略を有効にし、コンポーネントが必要になるまでハイドレーションを遅延させることでパフォーマンスを向上させます。

遅延ハイドレーションはデフォルトで有効ですが、この機能を無効にすることもできます:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    lazyHydration: false
  }
})
こちらも参照 guide > directory-structure > components#delayed-or-lazy-hydration

templateImportResolution

Nuxtテンプレート内のインポートの解決方法を制御します。デフォルトでは、Nuxtはテンプレート内のインポートをそれを追加したモジュールに相対的に解決しようとします。

これはデフォルトで有効になっているため、特定の環境で解決の競合が発生している場合は、この動作を無効にすることができます:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    templateImportResolution: false
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 31175

decorators

このオプションは、esbuildによって強化された、Nuxt/Nitroアプリ全体でデコレータ構文を有効にします。

長い間、TypeScriptはcompilerOptions.experimentalDecoratorsを介してデコレータをサポートしてきました。この実装はTC39の標準化プロセスに先立っていました。現在、デコレータはStage 3 Proposalであり、TS 5.0+で特別な設定なしでサポートされています(詳細はhttps://github.com/microsoft/TypeScript/pull/52582およびhttps://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/#decoratorsを参照)。

experimental.decoratorsを有効にすると、TC39提案のサポートが有効になります。TypeScriptの以前のcompilerOptions.experimentalDecorators実装のサポートではありません。

これが最終的にJS標準に組み込まれる前に変更があるかもしれないことに注意してください。

使用法

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    decorators: true,
  },
})
app.vue
function something (_method: () => unknown) {
  return () => 'decorated'
}

class SomeClass {
  @something
  public someMethod () {
    return 'initial'
  }
}

const value = new SomeClass().someMethod()
// これは 'decorated' を返します

purgeCachedData

NuxtはuseAsyncDataおよびnuxtApp.static.dataからキャッシュされたデータを自動的にパージします。これにより、メモリリークを防ぎ、必要に応じて新しいデータがロードされることを保証しますが、無効にすることも可能です:

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    purgeCachedData: false
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 31379

granularCachedData

useAsyncDataおよびuseFetchのデータをリフレッシュする際に(watchrefreshNuxtData()、または手動のrefresh()呼び出しによって)、getCachedDataからの結果を呼び出して使用するかどうかを決定します。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    granularCachedData: true
  }
})
こちらも参照 github.com > nuxt > nuxt > pull > 31373

pendingWhenIdle

falseに設定すると、useAsyncDatauseFetchuseLazyAsyncData、およびuseLazyFetchから返されるpendingオブジェクトは、statusが保留中の場合にのみtrueとなる計算プロパティになります。

つまり、immediate: falseが渡された場合、最初のリクエストが行われるまでpendingfalseになります。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    pendingWhenIdle: false
  }
})

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

Nuxtの実験的機能とは?〜開発の可能性を広げる新機能群〜

Nuxtは常に進化を続けており、その中で「実験的機能」と呼ばれる新しい機能群が提供されています。これらはまだ正式な安定版ではありませんが、将来的にNuxtの標準機能になる可能性を秘めています。実験的機能を活用することで、開発効率の向上やパフォーマンスの最適化、新しいAPIの利用など、最新技術をいち早く試すことが可能です。

しかし、実験的機能は仕様変更や削除のリスクもあるため、適切な理解と運用が求められます。本記事では、Nuxtの実験的機能の概要から、実務での活用例、注意点までを丁寧に解説します。


まず結論:Nuxt実験的機能のポイント

  • 最新技術の先取り:非同期コンテキストやコンポーネントアイランドなど、次世代の開発手法を試せる
  • パフォーマンス改善:クライアント専用コンポーネントのツリーシェイクや外部Vue化でバンドルサイズ削減が可能
  • 柔軟なエラーハンドリング:チャンク読み込みエラーの自動再読み込みや状態復元機能でUX向上
  • 型安全なルーティング:型付きルーター機能で開発時のミスを減らせる
  • 注意点:仕様変更の可能性が高く、本番環境での利用は慎重に。SSRやHydrationの問題に注意が必要

いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • 新機能を試したい開発段階
    新しいAPIや機能を早期に検証し、将来のアップデートに備えたい場合に有効です。
  • パフォーマンス最適化を目指す場合
    クライアント専用コンポーネントのツリーシェイクや外部Vue化など、ビルドサイズやロード時間を改善したいとき。
  • 複雑なルーティングや状態管理を型安全にしたい場合
    型付きルーターや状態復元機能を利用して、開発効率と品質を高めたいとき。

使わない方がよいケース

  • 本番環境での安定性が最優先の場合
    実験的機能は仕様変更やバグのリスクがあるため、安定性を重視する本番環境では慎重に。
  • SSRやHydrationに関する問題が許容できない場合
    状態復元やクライアントフォールバックなどはHydrationエラーを引き起こす可能性があるため、影響範囲をよく検証する必要があります。
  • 依存関係の複雑化を避けたい場合
    一部の機能は追加の依存パッケージが必要になることがあり、プロジェクトの複雑化につながることがあります。

実務でよくあるユースケースとサンプルコード

1. 非同期コンテキストの有効化でネストしたComposableを安全に使う

非同期処理内でComposableを呼び出す際に「Nuxt instance is unavailable」エラーを防止できます。

export default defineNuxtConfig({
  experimental: {
    asyncContext: true
  }
})

これにより、非同期関数の中でもuseStateuseFetchなどのComposableを問題なく利用可能です。


2. クライアント専用コンポーネントのツリーシェイクでバンドルサイズ削減

treeshakeClientOnlyを有効にすると、サーバー側のバンドルからクライアント専用コンポーネントのコードを除外し、ビルドサイズを小さくできます。

export default defineNuxtConfig({
  experimental: {
    treeshakeClientOnly: true
  }
})

これにより、例えば地図やチャートなどクライアント限定の重いコンポーネントを効率的に扱えます。


3. 型付きルーターで安全なナビゲーションを実現

typedPagesを有効にすると、navigateTouseRouteで型安全なルーティングが可能になります。

export default defineNuxtConfig({
  experimental: {
    typedPages: true
  }
})
const route = useRoute('user-profile')
navigateTo(route)

これにより、ルート名やパラメータのタイプミスを防ぎ、開発効率が向上します。


よくある落とし穴・注意点

SSRとHydrationの問題

  • restoreState機能はsessionStorageから状態を復元しますが、Vueアプリのマウント後に適用されるため、初回ロード時にちらつきやHydrationエラーが発生することがあります。
  • クライアント専用コンポーネントのツリーシェイクはサーバー側レンダリングに影響するため、SSRでの表示崩れに注意が必要です。

パフォーマンスとビルドの安定性

  • 実験的機能はビルドプロセスに影響を与えることがあり、特にasyncEntryexternalVueはモジュール連携に影響を及ぼす可能性があります。
  • externalVueは将来的に削除される可能性があるため、依存関係の管理に注意してください。

エラーハンドリングの自動化の落とし穴

  • emitRouteChunkErrorの自動リロード設定は便利ですが、不要なリロードが発生する場合もあるため、状況に応じてmanual設定を検討しましょう。

まとめ

Nuxtの実験的機能は、最新技術を活用して開発効率やパフォーマンスを向上させる強力なツールです。非同期コンテキストの改善や型付きルーティング、クライアント専用コンポーネントの最適化など、多彩な機能が用意されています。

ただし、これらはまだ安定版ではなく、仕様変更や不具合のリスクもあるため、本番環境での利用は慎重に検討してください。まずは開発環境で試し、効果や影響を把握した上で段階的に導入することをおすすめします。

Nuxtの進化を先取りしつつ、安定したアプリケーション開発を目指しましょう。


実験的機能を利用する際は、公式のGitHubリポジトリやドキュメントの更新情報をこまめにチェックし、最新の動向を把握することが重要です。


title: 'Nuxtのexperimental.sharedPrerenderData機能の活用と注意点' description: 'Nuxtのexperimental.sharedPrerenderData機能は、プリレンダリングされたページ間でデータを共有し、パフォーマンスを向上させます。本記事では、この機能の概要、使いどころ、実務での活用例、注意点を詳しく解説します。'

Nuxtのexperimental.sharedPrerenderData機能の活用と注意点

Nuxtのexperimental.sharedPrerenderDataは、プリレンダリングされた複数のページ間で取得したデータを自動的に共有する機能です。これにより、同じデータを複数ページで重複して取得する必要がなくなり、ビルド時のパフォーマンスが大幅に向上します。

本記事では、この機能のメリットや適切な使い方、実務での具体的なユースケース、そして注意すべきポイントを丁寧に解説します。Nuxtを使った静的サイト生成やプリレンダリングを検討している初〜中級者の方に役立つ内容です。


1. イントロダクション:なぜsharedPrerenderDataが嬉しいのか?

通常、Nuxtでプリレンダリングを行う際、useAsyncDatauseFetchを使って各ページでAPIなどからデータを取得します。しかし、複数のページで同じデータを取得している場合、それぞれのページで同じリクエストが発生し、ビルド時間や生成されるファイルサイズが増加してしまいます。

sharedPrerenderDataを有効にすると、プリレンダリング時に同じキーで取得されたデータをNuxtが自動的に共有し、重複したデータ取得を防止します。結果として、ビルド時間の短縮や生成物の軽量化が期待できるため、大規模サイトやデータ共有が多いサイトで特に効果的です。


2. まず結論:sharedPrerenderDataのポイント

  • プリレンダリング時に同じキーのデータを共有し、重複取得を防止する
  • useAsyncDatauseFetchで取得するデータに一意のキーを必ず指定する必要がある
  • 動的ルート(例:[slug].vue)ではキーの指定を誤ると正しく共有されないため注意が必要
  • ビルド時間の短縮や生成ファイルの軽量化に寄与するが、設定は実験的機能である
  • APIレスポンスが変わらない静的データや共通データの取得に特に効果的

3. いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • 複数ページで同じAPIレスポンスやデータを取得している場合
  • 静的サイト生成(SSG)でビルド時間を短縮したい場合
  • ペイロードサイズを抑えたい大規模サイト
  • 共有可能な共通データ(例:サイト設定、ナビゲーションメニューなど)を複数ページで使う場合

使わない方がよいケース

  • 動的に変化するデータをページごとに取得し、キーが一意に管理できない場合
  • ページごとに異なるパラメータでAPIを呼び出し、キーの管理が複雑になる場合
  • 実験的機能のため、安定性を重視するプロダクション環境での利用に慎重になりたい場合

4. 実務でよくあるユースケースとサンプルコード

ユースケース1:共通のサイト設定データを複数ページで共有

サイト全体で共通の設定情報(例:サイトタイトルやフッター情報)をAPIから取得し、複数ページで使う場合に有効です。

// nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    sharedPrerenderData: true
  }
})
// composables/useSiteSettings.ts
export const useSiteSettings = () => {
  return useAsyncData('site-settings', () => $fetch('/api/site-settings'))
}
const { data: siteSettings } = useSiteSettings()

このようにキーを固定しておくことで、プリレンダリング時にsite-settingsのデータが共有されます。


ユースケース2:ブログの一覧ページと詳細ページで同じ記事データを共有

ブログ記事の一覧ページと詳細ページで同じ記事データを取得する場合、記事IDをキーにして共有できます。

const route = useRoute()
const { data: article } = await useAsyncData(route.params.id, () =>
  $fetch(`/api/articles/${route.params.id}`)
)

ここでキーにroute.params.idを指定することで、同じ記事IDのデータはプリレンダリング時に共有されます。


ユースケース3:カテゴリ一覧とカテゴリ詳細で共通のカテゴリデータを共有

カテゴリ一覧ページとカテゴリ詳細ページで共通のカテゴリ情報を使う場合も同様です。

const { data: categories } = await useAsyncData('categories', () =>
  $fetch('/api/categories')
)

5. よくある落とし穴・注意点

キーの一意性を必ず守る

useAsyncDatauseFetchで取得するデータには必ず一意のキーを指定してください。キーが固定されていないと、Nuxtはどのデータを共有すべきか判断できず、期待通りに動作しません。

特に動的ルートでは、キーにルートパラメータを含める必要があります。

// NG例(キーなし)
const { data } = await useAsyncData(() => $fetch(`/api/page/${route.params.slug}`))

// OK例(キーにslugを指定)
const { data } = await useAsyncData(route.params.slug, () => $fetch(`/api/page/${route.params.slug}`))

SSRとCSRの違いに注意

この機能はプリレンダリング(ビルド時)にデータを共有するためのものです。クライアントサイドでの動的なデータ取得には影響しません。CSR時にデータが変わる場合は、別途キャッシュや再取得の仕組みを検討してください。

パフォーマンスとビルド時間のトレードオフ

共有データが多すぎると、ビルド時に大きなペイロードが生成される可能性があります。必要なデータだけを共有するように設計しましょう。

実験的機能であることの理解

experimental.sharedPrerenderDataはまだ実験的な機能です。将来的に挙動が変わる可能性があるため、プロダクション環境での利用は慎重に検討してください。


6. まとめ

Nuxtのexperimental.sharedPrerenderDataは、プリレンダリング時に複数ページ間で同じデータを共有し、ビルドパフォーマンスを向上させる強力な機能です。特に静的サイト生成で共通データを多用する場合に効果的です。

ただし、キーの一意性管理や動的ルートでの使い方に注意が必要であり、実験的機能であることを踏まえて利用しましょう。適切に活用すれば、ビルド時間短縮や生成物の軽量化に大きく貢献します。


sharedPrerenderDataを使う際は、まず小規模なプロジェクトやテスト環境で動作を確認し、キーの管理やデータ共有の挙動を理解してから本格導入することをおすすめします。


title: 'Nuxtのexperimentalオプション:デコレータとキャッシュ制御の実務的活用ガイド' description: 'Nuxtのexperimentalオプションであるdecoratorsやキャッシュ関連設定の使いどころや注意点を詳しく解説。実務でのユースケースやパフォーマンスへの影響も踏まえ、初中級者向けにわかりやすく説明します。'

Nuxtのexperimentalオプションを活用するメリットと課題解決

Nuxtは常に最新のJavaScript/TypeScriptの機能を取り入れ、開発体験の向上を目指しています。その中でもexperimentalオプションは、まだ正式な安定機能ではないものの、将来的に標準化される可能性のある新機能を試験的に利用できる設定群です。

特にdecoratorsオプションは、TypeScriptのデコレータ構文を最新のTC39 Stage 3提案に準拠した形で利用可能にし、クラスベースのコードをより表現豊かにします。また、purgeCachedDatagranularCachedDatapendingWhenIdleといったキャッシュや非同期データの挙動を細かく制御できる設定は、パフォーマンス最適化やメモリ管理に役立ちます。

これらの機能を理解し適切に使うことで、Nuxtアプリの開発効率やユーザー体験を向上させることが可能です。

まず結論:experimentalオプションのポイント

  • decorators

    • TypeScript 5.0以降の標準的なデコレータ構文をNuxt/Nitro全体で有効化
    • クラスのメソッドやプロパティに装飾を付けて機能拡張が可能
    • まだ仕様が変わる可能性があるため注意が必要
  • purgeCachedData

    • useAsyncDataなどのキャッシュを自動的にクリアするか制御可能
    • メモリリーク防止や最新データ取得に有効だが、無効化もできる
  • granularCachedData

    • データのリフレッシュ時にキャッシュの使い方を細かく制御
    • パフォーマンスと最新性のバランス調整に役立つ
  • pendingWhenIdle

    • 非同期データのpending状態の判定を細かく制御
    • immediate: false時の挙動を明確化し、UIの状態管理を改善

いつ使うべきか、使わない方がよいケース

decorators

  • 使うべきケース

    • クラスベースの設計を好み、メソッドやプロパティに共通処理を付加したい場合
    • TypeScript 5.0以降の最新仕様に準拠したデコレータを利用したい場合
    • Nitroやサーバーサイドでもデコレータを活用したい場合
  • 使わない方がよいケース

    • まだ仕様が安定していないため、将来のアップデートで動作が変わるリスクを避けたい場合
    • プロジェクトで既に旧式のexperimentalDecoratorsを使っているが移行コストが高い場合

purgeCachedData / granularCachedData / pendingWhenIdle

  • 使うべきケース

    • 大規模アプリでメモリ使用量を抑えたい場合
    • 非同期データのキャッシュ挙動を細かく制御し、UXを最適化したい場合
    • データのリフレッシュ頻度やタイミングを厳密に管理したい場合
  • 使わない方がよいケース

    • キャッシュ制御の挙動を複雑にしたくない小規模プロジェクト
    • デフォルトのキャッシュ挙動で問題がない場合

実務でよくあるユースケースとサンプルコード

1. デコレータでロギングやバリデーションを共通化

function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value
  descriptor.value = function (...args: any[]) {
    console.log(`Calling ${propertyKey} with`, args)
    return originalMethod.apply(this, args)
  }
}

class UserService {
  @Log
  getUser(id: number) {
    return { id, name: 'Alice' }
  }
}

const service = new UserService()
service.getUser(123) // コンソールに呼び出しログが出る

このように、デコレータを使うことでメソッド呼び出し時の共通処理を簡潔に実装できます。

2. purgeCachedDataでメモリリーク防止

export default defineNuxtConfig({
  experimental: {
    purgeCachedData: true
  }
})

大量の非同期データを扱うページでキャッシュを自動的にクリアし、不要なメモリ消費を抑制します。

3. granularCachedDataで部分的なキャッシュ再利用

export default defineNuxtConfig({
  experimental: {
    granularCachedData: true
  }
})

データのリフレッシュ時に必要な部分だけキャッシュを使い回し、パフォーマンスを向上させます。

よくある落とし穴・注意点

decoratorsの仕様変更リスク

TC39のStage 3提案に基づくため、将来的に仕様が変わる可能性があります。特に大規模プロジェクトでは、アップデート時に動作確認と修正が必要になることを念頭に置きましょう。

SSRとHydrationの影響

デコレータを使った処理がサーバーサイドとクライアントサイドで異なる場合、Hydrationエラーの原因になることがあります。サーバーとクライアントで同じ結果になるよう注意してください。

キャッシュ制御の複雑化

purgeCachedDatagranularCachedDataを無闇に切り替えると、データの取得タイミングや状態管理が複雑になり、バグやパフォーマンス低下を招くことがあります。設定変更は段階的に行い、挙動をよく検証しましょう。

pendingWhenIdleの誤解

pendingWhenIdle: falseにすると、immediate: falseの非同期処理開始前はpendingfalseになります。UIのローディング表示制御に影響するため、意図しない表示状態にならないよう注意が必要です。

まとめ

Nuxtのexperimentalオプションは、最新のTypeScript機能や非同期データのキャッシュ制御を柔軟に扱うための強力なツールです。特にデコレータはコードの表現力を高め、キャッシュ関連設定はパフォーマンス最適化に寄与します。

ただし、まだ仕様が安定していない部分もあるため、プロジェクトの規模や運用方針に合わせて慎重に導入しましょう。適切に使いこなせば、Nuxtアプリの開発効率とユーザー体験を大きく向上させることができます。

experimentalオプションは将来的に正式機能に統合される可能性があります。最新のNuxtリリースノートやTypeScriptの動向を定期的にチェックし、適切にアップデートしてください。