Routing - URLを状態として扱う画面遷移基盤
ロードマップ: Vue.js学習ロードマップ
What(何についてか)
Routingは、URLに応じて表示する画面コンポーネントを切り替える仕組みである。VueのSPAでは、サーバーがページごとにHTMLを返すのではなく、ブラウザ上のアプリケーションがURL変化を監視し、対応する画面を描画する。
Why(なぜ必要か)
SPAでは、画面遷移のたびにHTML全体を再読み込みすると体験が重くなる。クライアントサイドルーティングを使うことで、アプリを再起動せずに現在のURLだけを状態として扱い、必要な画面だけを差し替えられる。
また、実務では単純な画面切り替えだけでなく、戻る・進む、直リンク、404、認可、ネスト画面、URLパラメータなどを安定して扱う必要がある。そのため、RoutingはUIの補助機能ではなく、複数画面アプリケーションの基盤として重要である。
How(どう動くか)
Server-Side Routing と Client-Side Routing
- Server-Side Routing: URLごとにサーバーが新しいHTMLを返す
- Client-Side Routing: ブラウザ側でURL変化を検知し、表示するコンポーネントを切り替える
VueのSPAでは後者が中心になる。
最小の自前Routing実装
公式ページでは、window.location.hash と動的コンポーネントを使った最小構成が示されている。
<script setup>
import { ref, computed } from 'vue'
import Home from './Home.vue'
import About from './About.vue'
import NotFound from './NotFound.vue'
const routes = {
'/': Home,
'/about': About
}
const currentPath = ref(window.location.hash)
window.addEventListener('hashchange', () => {
currentPath.value = window.location.hash
})
const currentView = computed(() => {
return routes[currentPath.value.slice(1) || '/'] || NotFound
})
</script>
<template>
<a href="#/">Home</a> |
<a href="#/about">About</a> |
<a href="#/non-existent-path">Broken Link</a>
<component :is="currentView" />
</template>この例の流れは次のとおりである。
flowchart TD A["URL hash change"] --> B["currentPath ref を更新"] B --> C["computed currentView を再計算"] C --> D["routes から対応コンポーネントを選択"] D --> E["component :is で描画"]
本質
Routingの本質は、URLを状態として扱い、その状態に応じて表示コンポーネントを切り替えることにある。
currentPath: 現在のURL状態routes: URLと画面の対応表currentView: 現在URLから導かれる表示対象<component :is="...">: 選ばれた画面の描画
Vue Router が抽象化する責務
自前実装で手書きしていた責務を、Vue Routerが実務向けに抽象化する。
| 責務 | 自前実装 | Vue Router |
|---|---|---|
| URL変化の監視 | hashchange / History API を直接扱う | ルータが吸収する |
| URLと画面の対応 | routes オブジェクト | route record として宣言的に管理 |
| 画面描画 | <component :is="currentView" /> | <router-view /> |
| 画面遷移リンク | <a href="#/..."> | <router-link> |
| 404・認可・ネスト | 手作業で実装 | ルータ基盤上で整理しやすい |
Options API → Composition API 差分(補足)
| 項目 | Options API(旧) | Composition API(新) |
|---|---|---|
| URL状態 | data() で currentPath を持つ | ref() で currentPath を持つ |
| 派生ビュー | computed: { currentView() { ... } } | computed(() => ...) |
| 監視開始 | mounted() でイベント登録 | script setup で直接登録、必要に応じてライフサイクル併用 |
this 参照 | this.currentPath | currentPath.value |
Key Concepts
| 用語 | 説明 |
|---|---|
| Routing | URLに応じて画面を切り替える仕組み |
| Client-Side Routing | ブラウザ側でURL変化を処理して画面更新する方式 |
| SPA | 1つのHTML/JSアプリの中で画面遷移を行う構成 |
| History API | ブラウザ履歴を操作してURL遷移を扱うAPI |
| hash routing | # 以降を使って画面状態を表現する簡易ルーティング |
| dynamic component | 実行時に表示コンポーネントを切り替える仕組み |
| Vue Router | Vue公式のルーティングライブラリ |
| router-view | 現在のルートに対応する画面を差し込む描画ポイント |
| router-link | ルーティング用の宣言的リンクコンポーネント |
実務での判断軸
- 画面数が少なく、URL管理が不要ならルータなしでも成立する場合がある
- 複数画面をURLとして表現するならVue Routerを導入する
- 直リンク、戻る/進む、404、認可、ネスト構造が必要ならRouting基盤は必須である