app.vue
app.vue ファイルは Nuxt アプリケーションのメインコンポーネントです。
pages/ ディレクトリがある場合、app.vue ファイルはオプションです。Nuxt はデフォルトの app.vue を自動的に含めますが、必要に応じて構造や内容をカスタマイズするために独自のものを追加することもできます。
使用方法
最小限の使用法
Nuxt では、pages/ ディレクトリはオプションです。存在しない場合、Nuxt は vue-router 依存関係を含めません。これは、ランディングページやルーティングを必要としないアプリケーションを構築する際に便利です。
<template>
<h1>Hello World!</h1>
</template>
ページを使用する場合
pages/ ディレクトリがある場合、現在のページを表示するために <NuxtPage> コンポーネントを使用する必要があります。
<template>
<NuxtPage />
</template>
また、アプリケーションの共通構造を app.vue に直接定義することもできます。これは、ヘッダーやフッターなどのグローバル要素を含めたい場合に便利です。
<template>
<header>
Header content
</header>
<NuxtPage />
<footer>
Footer content
</footer>
</template>
app.vue は Nuxt アプリケーションのメインコンポーネントとして機能することを忘れないでください。これに追加するもの(JS や CSS)はすべてグローバルで、すべてのページに含まれます。
レイアウトを使用する場合
アプリケーションが異なるページに異なるレイアウトを必要とする場合、layouts/ ディレクトリと <NuxtLayout> コンポーネントを使用できます。これにより、複数のレイアウトを定義し、ページごとに適用することができます。
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
はじめに:app.vueがもたらす利便性と解決できる課題
Nuxt.jsのapp.vueは、アプリケーション全体のルートコンポーネントとして機能します。これにより、共通のUI要素(ヘッダーやフッターなど)を一元管理でき、ページごとに繰り返し書く必要がなくなります。また、pages/ディレクトリが存在しない場合でも、シンプルな単一ページアプリケーションを構築できる柔軟性を持っています。
この補足記事では、app.vueの基本的な役割から、実務での具体的な活用例、そして注意すべきポイントまでを詳しく解説します。Nuxtを使い始めたばかりの方や、より効率的な設計を目指す中級者の方に役立つ内容です。
まず結論:app.vueのポイントまとめ
app.vueはNuxtアプリのメインコンポーネントで、全ページ共通のUIを定義できるpages/ディレクトリがない場合でも、単一ページアプリとして機能させられる- ページを表示するには
<NuxtPage>コンポーネントを使う必要がある - 複数のレイアウトを使いたい場合は
<NuxtLayout>を組み合わせることで柔軟に対応可能 - グローバルなCSSやJavaScriptの読み込み場所としても適している
- 過度に複雑なロジックを
app.vueに詰め込むと保守性が低下するため注意が必要
いつ使うべきか・使わない方がよいケース
使うべきケース
- アプリ全体で共通のヘッダーやフッター、ナビゲーションバーを設置したいとき
- ページ間で共通の状態管理やグローバルなイベントリスナーを設定したいとき
pages/ディレクトリを使わずにシンプルなランディングページや単一ページアプリを作成するとき- 複数のレイアウトを使い分ける際に、レイアウトの親コンポーネントとして機能させたいとき
使わない方がよいケース
- ページごとに全く異なるUI構造を持ち、共通部分がほとんどない場合
- 複雑なロジックや状態管理を
app.vueに詰め込みすぎてしまう場合(VuexやPiniaなどのストアに分離推奨) - ルーティングを使わずに複数の画面を切り替えたいが、
pages/ディレクトリを活用したほうが管理しやすい場合
実務でよくあるユースケースとサンプルコード
1. グローバルなヘッダー・フッターの共通化
多くのWebアプリでは、全ページ共通のヘッダーやフッターを持ちます。app.vueにこれらを配置することで、コードの重複を避けられます。
<template>
<header>
<nav>
<ul>
<li><NuxtLink to="/">ホーム</NuxtLink></li>
<li><NuxtLink to="/about">会社情報</NuxtLink></li>
</ul>
</nav>
</header>
<NuxtPage />
<footer>
<p>© 2024 MyCompany</p>
</footer>
</template>
2. pages/ディレクトリなしのシンプルなランディングページ
ルーティング不要の単一ページアプリを作る場合、app.vueだけで完結できます。
<template>
<main>
<h1>ようこそ!</h1>
<p>これはシンプルなNuxtアプリです。</p>
</main>
</template>
3. 複数レイアウトの親コンポーネントとしての利用
app.vueで<NuxtLayout>を使い、ページごとに異なるレイアウトを適用できます。
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
よくある落とし穴・注意点
SSRとCSRの違いによる挙動の違い
app.vueはサーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)の両方で動作します。サーバーで生成されたHTMLとクライアントでのHydration(再活性化)が一致しないと、警告や表示崩れが起こることがあります。特に動的に変わるUI要素は注意が必要です。
パフォーマンスへの影響
app.vueに大量のロジックや重い処理を詰め込むと、初期表示のパフォーマンスが低下します。共通部分は必要最小限にし、重い処理は遅延ロードや非同期処理に分離しましょう。
グローバルCSS・JSの影響範囲
app.vueに追加したCSSやJavaScriptは全ページに影響します。意図しないスタイルの競合や副作用を防ぐため、スコープや命名規則に注意してください。
まとめ
app.vueはNuxtアプリの土台として非常に重要な役割を持ちます。共通UIの管理や単一ページアプリの構築、複数レイアウトの親コンポーネントとして活用できるため、設計の自由度が高まります。一方で、過度なロジックの集中やSSR/CSRの違いによる問題には注意が必要です。適切に使いこなすことで、保守性とパフォーマンスの両立が可能になります。
app.vueはNuxtの全ページに影響を与えるため、変更時は必ず動作確認を行い、パフォーマンスやUIの一貫性を保つことが重要です。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/guide/directory-structure/app