0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Vue Routerとクライアントサイドルーティングについて学んだ内容をまとめました。

0
Posted at

はじめに

Vue Routerの基本とクライアントサイドルーティングについて学んだ内容をまとめています。基本や仕組みを理解することを重視したため、Vue Routerの設定方法やオプションは本記事には記載しておりません。

Vue RouterはVue公式のルーティングライブラリで、シングルページアプリケーション (以下SPA) のクライアントサイドルーティングを実現することができます。クライアントサイドルーティングは、SPAにおいてURLと表示するコンポーネントを対応させ、ページ全体を再読み込みせずにページ遷移を実現する仕組みです。

Vue Routerを理解するためには、まず「クライアントサイドルーティングとは何か」を理解することが重要です。この記事では、従来のサーバーサイドルーティングとの違いから、Vue Routerとクライアントサイドルーティングをまとめています。

この記事の対象者

  • Vue Routerに入門する方
  • Vue Routerの実装をしたが、設定内容の理解を深めたい方
  • Vue Router公式ドキュメントに対する理解を深めたい方

サーバーサイドルーティング

従来のWebアプリケーションでは、URLごとにサーバーが表示するページを決定するサーバーサイドルーティングが一般的でした。サーバーサイドルーティングでは、ユーザーが別のページをクリックするたびにブラウザはサーバーへ通信を行い、HTMLやCSSを再取得してページ全体を再読み込みします。

例えばユーザーが /about へ移動すると、

ブラウザ
↓ 
リクエスト (GET /about)
↓ 
サーバー 
↓ 
レスポンス (about.html)
↓ 
ブラウザ 
↓ 
about.html を表示 (ページ全体を再読み込み)

という処理が行われます。サーバーは対応するHTMLを返し、ブラウザはページ全体を再読み込みしています。

クライアントサイドルーティング

クライアントサイドルーティングでは最初にアプリケーションを読み込み、その後のページ遷移はJavaScriptが担当します。
例えば /about へ移動しても、サーバーから新しいHTMLを取得することはありません。

リンクをクリック
↓
Vue Router
↓
URL変更
↓
対応するコンポーネントを表示

この仕組みをクライアントサイドルーティングと呼びます。また、この仕組みを担うのがVue Routerです。

Vue Routerの基本構成

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    component: HomeView,
  },
  {
    path: '/about',
    component: AboutView,
  },
]

const router = createRouter({
  history: createWebHistory(),
  routes,
})

routescreateRoutercreateWebHistoryといった要素が登場しました。これらの要素についてご説明します。

routes

routes ではURLとコンポーネントの対応関係を定義します。

const routes = [
  {
    path: '/',
    component: HomeView,
  },
  {
    path: '/about',
    component: AboutView,
  },
]

例えば、/about にアクセスすると AboutView が表示されるといった対応関係を定義しています。

createRouter

createRouter は、Vue Router全体の設定をまとめたRouterインスタンスを作成する関数です。

const router = createRouter({
  history: createWebHistory(),
  routes,
})

設定のうち、routesは上記で定義したURLとコンポーネントの対応関係です。では、createWebHistory とはなんでしょうか?ここからは、このHistoryモードに関する設定を見ていきます。

Historyモード

Historyモードとは

createRouterを利用してRouterインスタンスを作成する際は、ルーティングの履歴管理方式 (Historyモード) を選択します。
通常、ブラウザの履歴はページ遷移によって自動で追加されます。例えば、以下のようにサーバーサイドルーティングでページ遷移をすると、

/home → /about → /profile

ブラウザはこの順番で履歴を保存します。そのため、ブラウザの「戻る」ボタンを押すと、

/profile → /about

のように前のページへ戻ることができます。

他方で、SPAのクライアントサイドルーティングでは、ページ遷移時にサーバーから新しいHTMLを取得しません。JavaScriptで表示するコンポーネントを切り替えるだけでは、ブラウザのURLや履歴は自動では更新されません。
そこでVue Routerでは、ブラウザが提供するHistory APIやメモリ上の履歴を利用して、URLや履歴を管理します。これらの履歴管理方式をHistoryモードと呼び、createRouterでRouterインスタンスを作成する際にHistoryモードの選択を行います。

ここからは、Vue Routerで利用できる代表的なHistoryモードを見ていきます。

createWebHistory

createWebHistory()

createWebHistory は、ブラウザのHistory APIを利用して、# を含まないURLでルーティングを行う方式です。History APIとは、ブラウザが持つ履歴機能をJavaScriptから操作するためのAPIです。これを利用することで、ページ全体を再読み込みすることなくURLや履歴を更新できます。

履歴は次のようになります。

/home → /about → /profile

サーバーサイドルーティングのときと同様に、履歴が積まれます。通常のWebサイトと同じような自然なURLになります。

ただし、createWebHistory を利用する場合は、サーバー側でフォールバック設定を行う必要があります。
クライアントサイドルーティングによるページ遷移では、JavaScriptがURLと表示するコンポーネントを切り替えるため、ページ全体の再読み込みは発生しません。
しかし、ブラウザをリロードした場合や、URLを直接開いた場合は、通常のWebページと同じようにサーバーへリクエストが送信されます。

例えば現在のURLが /about だったとします。ここでブラウザをリロードすると、ブラウザはサーバーへ次のようなリクエストを送ります。

GET /about

SPAでは /about というHTMLファイルが実際に存在するわけではなく、多くの場合は index.html のみが存在します。
そのため、サーバー側で特別な設定をしていないと、

404 Not Found

になってしまいます。この問題を防ぐため、SPAではどのURLへアクセスされても index.html を返すようにサーバーを設定します。

GET /about
↓
index.html を返す
↓
Vue Router が起動する
↓
現在のURLを解析する
↓
AboutView を表示する

このように、存在しないパスへアクセスされた場合でも index.html を返す設定を、フォールバック設定と呼ぶことがあります。

createWebHashHistory

createWebHashHistory()

createWebHashHistory は、URLのハッシュ(#)部分を利用してルーティングを行う方式です。ハッシュ部分の変更はサーバーへ送信されませんが、ブラウザの履歴には追加されます。そのため、サーバーへ新しいHTMLをリクエストすることなく、戻る・進むボタンに対応したページ遷移を実現できます。

履歴は次のようになります。

/#/home → /#/about

# 以降はサーバーへ送信されません。
例えば次のURLをブラウザで開いた場合、

https://example.com/#/about

サーバーへ送信されるリクエストは、

GET /
↓
index.html
↓
Vue Router
↓
#/about
↓
AboutView

となります。そのため、サーバーは /about を解決する必要がなく、createWebHistory のようなフォールバック設定も不要です。他方で、URLに # が含まれるため、見た目は少し不自然になります。

createMemoryHistory

createMemoryHistory()

createMemoryHistory は、ブラウザのURLとは連動せず、メモリ上で履歴を管理する方式です。
ページ遷移を行っても、ブラウザのアドレスバーに表示されるURLは変更されません。また、ブラウザの戻る・進むボタンとも連動しません。そのため、通常のブラウザ向けSPAでは利用されることは少なく、主にサーバーサイドレンダリングやテストなどで利用されます。

ページ表示とページ遷移の設定

RouterView

RouterView は現在のURLに対応するコンポーネントを表示する役割を持っています。通常は App.vueRouterView を配置します。

<!-- App.vue -->
<template>
  <RouterView />
</template>

この場合、現在のURLに対応するコンポーネントがRouterViewに表示されます。
例えば、現在のURLが/aboutの場合は次のような構造になります。

App.vue
└─ RouterView
   └─ AboutView

通常のルート構成であれば、App.vueRouterView に現在のURLに対応するコンポーネントが表示されます。

RouterLink

ページ遷移には RouterLink を利用します。

<RouterLink to="/about">
  About
</RouterLink>

RouterLink<a> タグと同様にリンクとして利用できます。クリックするとVue RouterがURLを更新し、現在のURLに対応するコンポーネントへ切り替えます。サーバーへの通信やページの再読み込みは発生しません。

まとめ

  • クライアントサイドルーティングでは、ページ遷移時にサーバーから新しいHTMLを取得しない
  • Vue Routerはクライアントサイドルーティングを実現するライブラリ
  • HistoryモードによってURLの管理方法を選択できる
  • createWebHistory を利用する場合は、サーバー側でフォールバック設定が必要
  • RouterView が現在のURLに対応するコンポーネントを表示する
  • RouterLink を利用してページ遷移を行う

他にも、Vue Routerにはオプションとして利用できる便利な機能がありますので、ぜひ公式ドキュメントもご活用いただけると幸いです。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?