上半部分不是写死的十条对照,而是一套真在跑的映射规则:输入 app/pages 下的相对路径(前缀可写可不写),下面实时给出 URL、路由名、params 形态和该注意的事。
下半部分是反过来考你:给 URL 选文件。
| app/pages 下的文件 | 生成的 URL | 取参数的方式 | 说明 |
|---|---|---|---|
index.vue | / | — | 首页,index 只代表它所在层级的根 |
about.vue | /about | — | 最常见:文件名去后缀就是路径段 |
users/index.vue | /users | — | 和 users.vue 效果相同(URL 一样) |
users/[id].vue | /users/:id | route.params.id(字符串) | 方括号 = 动态段,一段只吃一格 |
users/[id]/posts/[pid].vue | /users/:id/posts/:pid | params.id、params.pid | 参数可以出现在任意一段 |
blog/[...slug].vue | /blog/:slug*(写成 /blog/* 理解就行) | params.slug 是数组 | 兜底通配:/blog/2026/05/a → ['2026','05','a'] |
doc/[[id]].vue | /doc/:id? | 访问 /doc 时 params.id 为 undefined | 双层方括号 = 可选参数 |
(shop)/cart.vue | /cart | — | 圆括号是「分组」,只做代码归类,不进 URL |
-draft.vue | 不生成路由 | — | 以 - 开头的文件/目录被直接跳过 |
父.vue + 父/子.vue | /父 与 /父/子 | — | 父文件里必须渲染 <NuxtPage />,否则子页面不显示 |
另外两条:动态段名字随便起([id] 和 [userId] 生成两条互不相干的路由);
一个目录里 x.vue 和 x/index.vue 同时存在时,x/index.vue 会变成 x.vue 的默认子路由(/x 命中它)。