【Nuxt.js】pages/ディレクトリでファイルベースルーティングを理解する

JavaScript

こんにちは、かつコーチです。

前回、Nuxt.jsのプロジェクトを実際に作成しました。

今回は、Nuxtの中でも特につまずきやすい「ルーティング」の仕組みを解説します。

Vue Router(Vue.js標準のルーティングライブラリ)を自分で設定した経験がある方ほど、Nuxtの手軽さに驚くはずです。

pages/ディレクトリとは?

ファイルベースルーティングの定義

Nuxt.jsは、ファイルベースルーティングという仕組みを採用しています。

ファイルベースルーティングとは、ファイルやフォルダの配置がそのままURL構造になる仕組みのことです。

pages/ディレクトリの中にVueファイルを置くだけで、Nuxtが自動的にルート(URLと画面の対応関係)を生成してくれます。

素のVue.jsで開発する場合は、Vue Routerを自分でインストールし、URLと表示コンポーネントの対応表を自力で書く必要があります。

Nuxtでは、その対応表を書く作業自体がほぼ不要になります。

なぜファイルベースルーティングが必要なのか

ページ数が少ないうちは、ルーティングを手書きしてもそれほど負担ではありません。

ですが、ページ数が10、20と増えていくと、対応表のメンテナンスだけで一苦労になります。

新しいページを追加するたびに「ルート設定ファイルへの追記」を忘れる、というミスも起きがちです。

ファイルベースルーティングであれば、「ファイルを置く=ページが増える」という直感的な操作だけで済みます。

設定ファイルの書き忘れによるバグを、構造的に防げるのが大きなメリットです。

基本の書き方 / 実装手順

手順1:index.vueでトップページを作る

pages/index.vueを作成すると、これがトップページ(/)になります。

<!-- pages/index.vue -->
<template>
  <div>
    <h1>トップページです</h1>
  </div>
</template>

npm run devで開発サーバーを起動し、http://localhost:3000/にアクセスすると、この内容が表示されます。

手順2:ファイル名でルートを増やす

続いて、pages/about.vueを作成してみます。

<!-- pages/about.vue -->
<template>
  <div>
    <h1>会社紹介ページです</h1>
  </div>
</template>

ファイルを保存するだけで、http://localhost:3000/aboutにアクセスできるようになります。

ルート設定ファイルへの追記は一切不要です。

手順3:フォルダを使ってURLを階層化する

pages/blog/index.vueのように、フォルダの中にindex.vueを置くこともできます。

<!-- pages/blog/index.vue -->
<template>
  <div>
    <h1>ブログ一覧ページです</h1>
  </div>
</template>

この場合、URLは/blogになります。

さらにpages/blog/[id].vueのように角括弧付きのファイル名を使うと、動的なルートを作れます。

<!-- pages/blog/[id].vue -->
<template>
  <div>
    <h1>記事ID:{{ $route.params.id }}</h1>
  </div>
</template>

/blog/1/blog/2など、末尾の数字が変わるURLすべてに対応できます。

手順4:NuxtLinkでページ遷移する

ページ間の遷移には、<a>タグの代わりに<NuxtLink>コンポーネントを使います。

<!-- pages/index.vue -->
<template>
  <div>
    <h1>トップページです</h1>
    <NuxtLink to="/about">会社紹介ページへ</NuxtLink>
  </div>
</template>
遷移方法挙動選ぶ判断軸
<a href="...">ページを丸ごと再読み込みするNuxtアプリ内の遷移には非推奨
<NuxtLink to="...">画面を再読み込みせず、必要な部分だけ差し替えるNuxtアプリ内の遷移は基本これを使う

<NuxtLink>を使うと、ページ遷移が速く、状態(入力中のフォーム内容など)も保持されやすくなります。

つまずきやすい設定・注意点

ファイル名の付け方に注意する

pages/直下のファイル名は、そのままURLの一部になります。

日本語ファイル名や、大文字・小文字が混在したファイル名は避け、kebab-case(ハイフン区切り)に統一するのが無難です。

よくあるつまずきポイント・エラー対処

index.vueを作り忘れて真っ白な画面になった話

❌ Before:pages/index.vueを作らずにpages/top.vueだけ作った状態

トップページ用のつもりでpages/top.vueを作成し、http://localhost:3000/にアクセスした状態です。

このとき画面には何も表示されず、ブラウザのコンソールには次のような404関連のエラーが出ます。

[404] Page not found: /

私も新規プロジェクトの立ち上げ時、うっかりtop.vueという名前でトップページを作ってしまい、しばらく真っ白な画面を前に固まった経験があります。

原因は単純で、/に対応するファイルはindex.vueという決まった名前でなければならない、というルールを忘れていたことでした。

✅ After:index.vueにリネームして解決する

mv pages/top.vue pages/index.vue

ファイル名をindex.vueに変更すると、http://localhost:3000/で正しく表示されるようになりました。

「トップページだけ表示されない」というときは、まずファイル名がindex.vueになっているか確認してみてください。

応用・一歩先の使い方

ネストしたレイアウトへの接続

ページ数が増えてくると、「共通のヘッダー・フッターをどう管理するか」という悩みが出てきます。

Nuxtには、この悩みに応えるlayouts/という仕組みも用意されています。

pages/でルーティングの基礎を理解できたら、次は共通レイアウトの管理方法へと進んでいくとスムーズです。

動的ルート・ネストされたルートへの発展

今回紹介した[id].vueは、動的ルートの入り口にすぎません。

複数のパラメータを組み合わせたり、ルートを深くネストさせたりする書き方も存在します。

実務でブログやECサイトのような「一覧+詳細」の画面を作る際には、この応用パターンが頻繁に登場します。

まとめ

この記事のポイント

  • pages/ディレクトリの構造が、そのままURL構造になる
  • index.vueはそのフォルダの起点となるページ用ファイル名
  • [id].vueのように角括弧を使うと動的ルートを作れる
  • ページ遷移には<a>ではなく<NuxtLink>を使う

次に読むべき記事

ルーティングの基礎が理解できたら、次は共通レイアウトの管理方法に進みましょう。

「layouts/で共通レイアウトを管理する」で、ヘッダー・フッターの扱い方を解説予定です。

タグ: #Nuxt.js #初心者向け #ルーティング

タイトルとURLをコピーしました