在 Vue 專案中,透過設定 VueRouter 制訂各個頁面的 URL 以及各種畫面結構安排,但在 Nuxt 專案中,不再需要透過設定,pages 的目錄結構會自動對應出 VueRouter 的設定。
透過 pages 底下的資料夾與檔案路徑,Nuxt 會自動生成 VueRouter 實例,不再需要自行定義。

在上圖的目錄結構中會產生下列路由與 page component 之間的對應:
| 路由 (URL) | page component | 路由名稱 (Route Name) |
|---|---|---|
| /manager | pages/manager/index.vue | manager |
| /manager/user | pages/manager/user/index.vue | manager-user |
| /manager/user/create | pages/manager/user/create.vue | manager-user-create |
| /manager/user/edit | pages/manager/user/edit.vue | manager-user-edit |
| /manager/user/view | pages/manager/user/view.vue | manager-user-view |
自動生成的 VueRouter 設定如下:
new VueRoute([
{
name: 'manager',
path: '/manager',
component: '~/pages/manager/index.vue',
chunkName: 'pages/manager/index'
},
{
name: 'manager-user',
path: '/manager/user',
component: '~/pages/manager/user/index.vue',
chunkName: 'pages/manager/user/index'
},
{
name: 'manager-user-create',
path: '/manager/user/create',
component: '~/page/manager/user/create.vue',
chunkName: 'pages/manager/user/create'
},
{
name: 'manager-user-edit',
path: '/manager/user/edit',
component: '~/pages/manager/user/edit.vue',
chunkName: 'pages/manager/user/edit'
},
{
name: 'manager-user-view',
path: '/manager/user/view',
component: '~/pages/manager/user/view.vue',
chunkName: 'pages/manager/user/view'
},
// ...
]);
基礎路由規則為:
<檔案路徑>/<page component 檔案名稱>,其中檔案路徑不包含「pages」。index,則路由為 <檔案路徑>。如同 Laravel 可以在路由中帶入參數,對此稱為動態路由 (Dynamic Route)。由於 Nuxt 沒有 VueRouter 可以設定,因此路由中的變數,就會成為資料夾或是 page component 的名稱。
假設我們希望在 「編輯特定使用者」和 「瀏覽特定使用者」兩個頁面的路由帶上變數 userId,則會需要建立名稱為 _<變數名稱> 的資料夾:
| 路由 (URL) | page component | 路由名稱 (Route Name) |
|---|---|---|
/manager/user/userId/edit |
pages/manager/user/_userId/edit.vue |
manager-user-userId-edit |
/manager/user/userId/view |
pages/manager/user/_userId/view.vue |
manager-user-userId-view |
如果變數是帶在路由的最後面如 /manager/user/view/userId ,則 page component 命名為 _<變數名稱>.vue:
| 路由 (URL) | page component | 路由名稱 (Route Name) |
|---|---|---|
/manager/user/view/userId |
pages/manager/user/view/_userId.vue |
manager-user-view-userId |
在畫面的設計上,很常會有同一個系列的畫面有一部份是相同的,例如 pages/manager/user/ 底下的 page components 都有相同的側邊選單。在 Nuxt 中可以設計一個用來嵌套的子樣板,這樣開發與維護就變得精簡。
嵌套路由本身也是一個 page component,其命名規則為:
01. 嵌套樣版名稱與要嵌套的檔案資料夾名稱相同
02. 嵌套樣版與要嵌套的檔案資料夾在同一層
例如下圖,pages/manager/user.vue 會嵌套到 pages/manager/user 底下所有 page components。
在嵌套樣版中利用 <nuxt-child> component 來置換不同 page componsnt 內容:
<template>
<div>
<div>來自嵌套樣版 user.vue 的文字</div>
<div>
<nuxt-child></nuxt-child>
</div>
</div>
</template>
對應的 VueRouter 如下:
new VueRouter([
{
name: "manager",
path: "/manager",
component: "~/pages/manager/index.vue",
chunkName: "pages/manager/index"
},
{
path: "/manager/user",
component: "~/pages/manager/user.vue",
chunkName: "pages/manager/user",
children: [
{
name: "manager-user",
path: "",
component: "~/pages/manager/user/index.vue",
chunkName: "pages/manager/user/index"
},
{
name: "manager-user-create",
path: "create",
component: "~/pages/manager/user/create.vue",
chunkName: "pages/manager/user/create"
},
{
name: "manager-user-edit",
path: "edit",
component: "~/pages/manager/user/edit.vue",
chunkName: "pages/manager/user/edit"
},
{
name: "manager-user-view",
path: "view",
component: "pages/manager/user/view.vue",
"chunkName": "pages/manager/user/view"
}
]
}
]);
雖然 Nuxt 會自己透過 pages 目錄結構繫結 VueRouter 設定,但 Nuxt 仍然在 nuxt.config.js 的 router 屬性,提供我們做額外的設定:
base:是用來指定整個應用的基底 URL,例如下面的例子,在執行 npm run dev 之後,專案起始 URL 會是 localhost:3000/app。export default {
// ...
router: {
base: '/app/'
}
// ...
}
routeNameSplitter: 在先前介紹路由名稱的時候有提到適用「-」符號連結,在這個屬性我們可以自行設定連結的符號。下面的設定,pages/manager/user/edit.vue 的路由名稱會是 manager => user => edit。export default {
// ...
router: {
routeNameSplitter: ' => '
}
// ...
}
extendRoutes:在 VueRouter 中增加額外自訂的路由,例如下面是一個轉址路由的範例。export default {
// ...
router: {
extendRoutes (routes, resolve) {
routes.push({
path: '/manager/user/create', redirect: '/manager/user/0/create'
});
}
}
// ...
}
如果是從 Vue 專案轉到 Nuxt,在路由的設定可能會稍有不習慣,還好 Nuxt 還是有保留客制設定的部分,我們一樣可以設定出各種不同需求的路由。在看完 page 的路由規則與相關設定之後,明天要跟大家介紹 Vuex 與 Cookie!