brand logo

ドキュメント

機能

新しい可能性を開くために、Nuxtのオプション機能を有効または無効にします。

Nuxtのいくつかの機能は、オプトインベースで利用可能であり、必要に応じて無効にすることもできます。

features

inlineStyles

HTMLをレンダリングする際にスタイルをインライン化します。これは現在、Viteを使用している場合にのみ利用可能です。

Vueコンポーネントのパスを受け取り、そのコンポーネントのスタイルをインライン化するかどうかを示すブール値を返す関数を渡すこともできます。

nuxt.config.ts
export default defineNuxtConfig({
  features: {
    inlineStyles: false // またはインライン化を決定する関数
  }
})

noScripts

NuxtスクリプトとJSリソースヒントのレンダリングを無効にします。routeRules内で細かく設定することもできます。

nuxt.config.ts
export default defineNuxtConfig({
  features: {
    noScripts: true
  }
})

future

将来の(おそらくメジャーな)バージョンでデフォルトになる新機能を早期にオプトインするためのfuture名前空間もあります。

compatibilityVersion

この設定オプションはNuxt v3.12+で利用可能です。現在のところ、Nuxt 4の動作にオプトインする各レイヤーで互換性バージョンを定義する必要があります。Nuxt 4がリリースされた後は必要ありません。

これにより、Nuxtの機能やフラグへの早期アクセスが可能になります。

compatibilityVersion4に設定すると、Nuxt v4の動作にオプトインするためにNuxt設定全体のデフォルトが変更されますが、テスト時にNuxt v3の動作を細かく再有効化することができます(例を参照)。その場合は問題を報告してください。Nuxtまたはエコシステムで対処します。

export default defineNuxtConfig({
  future: {
    compatibilityVersion: 4,
  },
  // _すべての_ Nuxt v3の動作を再有効化するには、次のオプションを設定します:
  srcDir: '.',
  dir: {
    app: 'app'
  },
  experimental: {
    scanPageMeta: 'after-resolve',
    sharedPrerenderData: false,
    compileTemplate: true,
    resetAsyncDataToUndefined: true,
    templateUtils: true,
    relativeWatchPaths: true,
    normalizeComponentNames: false
    defaults: {
      useAsyncData: {
        deep: true
      }
    }
  },
  features: {
    inlineStyles: true
  },
  unhead: {
    renderSSRHeadOptions: {
      omitLineBreaks: false
    }
  }
})

typescriptBundlerResolution

これは、TypeScriptの'Bundler'モジュール解決モードを有効にします。これは、NuxtやViteのようなフレームワークに推奨される設定です。

exportsを使用する現代的なライブラリを使用する際の型サポートを向上させます。

オリジナルのTypeScriptプルリクエストを参照してください。

nuxt.config.ts
export default defineNuxtConfig({
  future: {
    typescriptBundlerResolution: true
  }
})

tips

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

Nuxtのfeaturesオプションとは?〜何が嬉しいのか〜

Nuxtのfeaturesオプションは、Nuxtアプリケーションの挙動を細かく制御し、パフォーマンスや開発体験を向上させるための設定群です。例えば、スタイルのインライン化やスクリプトの出力制御など、デフォルトでは有効になっている機能をオプトイン・オプトアウトできるため、プロジェクトの要件に合わせて柔軟に調整可能です。

これにより、以下のような課題を解決できます。

  • ページの初期表示速度を改善したい
  • 不要なJavaScriptの読み込みを抑制したい
  • 将来のNuxtの新機能を先取りして試したい
  • TypeScriptのモジュール解決を最適化したい

特に大規模プロジェクトやパフォーマンスに敏感なサイトでは、featuresの適切な設定がUX向上に直結します。


まず結論:featuresオプションの要点

  • inlineStyles
    Vite利用時にCSSをHTMLにインライン化し、初期レンダリングを高速化できる。関数で制御も可能。

  • noScripts
    Nuxtが自動で挿入するスクリプトやJSリソースヒントを無効化し、軽量なHTMLを生成できる。細かい制御はrouteRulesで。

  • future名前空間
    将来のNuxtバージョンでデフォルトになる機能を先行利用可能。互換性を保ちながら新機能を試せる。

  • typescriptBundlerResolution
    TypeScriptのモジュール解決を改善し、最新のライブラリとの互換性を向上させる。


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

使うべきケース

  • パフォーマンス最適化を図りたいとき
    例えば、inlineStylesを有効にすると、CSSの読み込みを減らし、初期表示を速くできます。

  • JavaScriptの読み込みを制御したいとき
    SPA的な動作が不要な静的サイトやSEO重視のページで、noScriptsを使い不要なスクリプトを削減可能。

  • 将来のNuxt機能を試験的に使いたいとき
    future.compatibilityVersionを設定して、Nuxt 4の新機能を先行体験し、移行準備を進められます。

  • TypeScriptの最新機能を活用したいとき
    typescriptBundlerResolutionでモジュール解決の問題を減らし、開発効率を上げられます。

使わない方がよいケース

  • Viteを使っていない場合
    inlineStylesはVite専用機能なので、Webpackなど他のビルドツールでは効果がありません。

  • JavaScriptが必須のインタラクティブなページ
    noScriptsを有効にするとNuxtのクライアントサイド機能が動作しなくなるため、動的なUIが必要な場合は避けるべきです。

  • 安定性を最優先したい本番環境
    futureの機能はまだ実験的なものもあるため、リスクを避けたい場合は慎重に検討してください。


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

1. ページの初期表示を高速化したい場合

Viteを使っているプロジェクトで、CSSをインライン化してレンダリングを高速化します。

export default defineNuxtConfig({
  features: {
    inlineStyles: true
  }
})

さらに、特定のコンポーネントだけインライン化したい場合は関数で制御可能です。

export default defineNuxtConfig({
  features: {
    inlineStyles: (componentPath) => {
      // 特定のコンポーネントのみインライン化
      return componentPath.includes('CriticalComponent.vue')
    }
  }
})

2. 静的サイトで不要なスクリプトを削減したい場合

静的なブログやドキュメントサイトで、JavaScriptを極力減らしたいときにnoScriptsを有効にします。

export default defineNuxtConfig({
  features: {
    noScripts: true
  }
})

さらに、routeRulesでページ単位に制御も可能です。

export default defineNuxtConfig({
  routeRules: {
    '/about': { noScripts: true },
    '/dashboard': { noScripts: false }
  }
})

3. Nuxt 4の新機能を先行体験しつつ互換性を保つ

将来的な移行を見据えて、future.compatibilityVersionを設定しつつ、必要に応じて旧動作を再有効化します。

export default defineNuxtConfig({
  future: {
    compatibilityVersion: 4
  },
  experimental: {
    scanPageMeta: 'after-resolve',
    compileTemplate: true
  }
})

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

SSRとHydrationの影響

  • inlineStylesはSSR時にCSSをインライン化するため、Hydration時にスタイルの不整合が起きにくいですが、関数で制御する場合は対象コンポーネントのスタイルが正しく反映されているか確認が必要です。

  • noScriptsを有効にすると、クライアントサイドのJavaScriptが読み込まれず、Hydrationが行われません。結果として動的なUIが動作しなくなるため、静的コンテンツ向けに限定しましょう。

パフォーマンスへの影響

  • inlineStylesは初期表示を高速化しますが、CSSが大きい場合はHTMLサイズが増加し、ネットワーク負荷が増す可能性があります。適用範囲を限定するのが望ましいです。

  • noScriptsはJavaScriptの読み込みを減らせますが、ユーザー体験が制限されるため、必要な機能が動作しなくなるリスクを理解して使いましょう。

将来機能の安定性

  • future名前空間の機能はまだ開発中のものも多く、バグや挙動の変更が起こる可能性があります。本番環境での利用は慎重に検討し、十分なテストを行ってください。

まとめ

Nuxtのfeaturesオプションは、パフォーマンス最適化や将来の機能を先取りするための強力なツールです。適切に使うことで、初期表示速度の向上や不要なスクリプトの削減、TypeScriptのモジュール解決改善など、多くのメリットが得られます。

ただし、SSRやHydrationの挙動、JavaScriptの必要性、将来機能の安定性などに注意し、プロジェクトの要件に合わせて慎重に設定を選択しましょう。実務でのユースケースを参考にしながら、最適な設定を見つけてください。


Nuxtの公式ドキュメントと合わせて、実際のプロジェクトでの挙動を検証しながらfeaturesオプションを活用することをおすすめします。特にfutureの機能は頻繁に更新されるため、最新情報のキャッチアップも重要です。