你寫的 Vue 3 單頁應用(SPA),明明只是點了一下選單,網頁卻「瞬間」換了內容、網址也跟著變,瀏覽器完全沒有重新整理——這背後默默幹活的就是前端路由(Frontend Routing)。對 CSF 這類大型後台來說,資產管理、告警管理、日誌檢索各是一個「頁面」,卻共享同一套框架與登入狀態,靠的就是路由在編排。本文用 Vue Router 4 手把手帶你從零搭出一套流暢的導航系統。
一、先搞懂路由在管什麼
傳統多頁網站每次點連結,瀏覽器都向伺服器要一整份新 HTML;SPA 則只在第一次載入時拿回框架,之後的「換頁」都由前端攔截網址變化、就地替換畫面。Vue Router 的核心職責有三:把網址對應到元件、在 <router-view> 渲染對應畫面、提供 <router-link> 做不刷新的導航。它還支援 history 模式(網址乾淨,像 /alarm/list 而非 /#/alarm/list)。
二、步驟 1:安裝並建立路由實例
先安裝依賴,再建立一個 router 實例,指定路由表與歷史模式:
// router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
const routes = [
{ path: '/', name: 'home', component: Home },
]
const router = createRouter({
history: createWebHistory(),
routes,
})
export default router
三、步驟 2:定義路由表並做元件懶加載
大型後台幾十個頁面若全部一次性載入,首屏會很慢。重點:用動態 import() 做路由級程式碼分割,瀏覽器只在使用者真正進入該頁時才下載對應 chunk:
const routes = [
{
path: '/alarm/list',
name: 'alarmList',
component: () => import('@/views/alarm/index.vue'),
},
{
path: '/log/retrieval',
name: 'logRetrieval',
component: () => import('@/views/logretrieval/index.vue'),
},
]
四、步驟 3:掛載路由並放置渲染出口
在 main.ts 註冊路由,並在 App.vue 擺上 <router-view> 做為畫面出口:
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
<!-- App.vue -->
<template>
<router-view />
</template>
五、步驟 4:動態路由與程式化導航
資產詳情頁常見 /asset/:id 這類動態參數。元件內用 useRoute() 取參數、用 useRouter() 做程式化跳轉:
import { useRoute, useRouter } from 'vue-router'
const route = useRoute()
const router = useRouter()
console.log(route.params.id) // 取動態參數
router.push({ name: 'alarmList' }) // 程式化導航
六、用導航守衛做權限控制
CSF 這類後台離不開權限。Vue Router 的 beforeEach 守衛可在進入頁面前攔截,搭配 usePermission 判斷角色,恰好呼應你們既有的 v-auth 指令:
router.beforeEach((to, from, next) => {
const permission = usePermission()
if (to.meta.requiresAuth && !permission.hasPermission(to.meta.perm)) {
next({ name: '403' })
} else {
next()
}
})
特別注意:history 模式部署到 Nginx / IIS 時,必須設定「所有路徑都 fallback 到 index.html」,否則使用者重新整理深層網址會直接 404。這在 CSF 的 Nginx 配置與 13zn.com 的 web.config 重寫規則裡都要對齊。
重點回顧:路由表決定網址與元件的對應;import() 懶加載是大型應用的效能命脈;beforeEach 守衛把權限收口在前端第一道關卡。把這三件事做對,导航體驗就能既快又穩。
互動話題:你在專案裡是怎麼管理幾十個路由的?會用自動掃描 views 資料夾生成路由表嗎?歡迎留言分享你的做法!