路由

Nuxt 文件系统路由会为 pages/ 目录下的每个文件创建一个路由。

Nuxt 的核心功能之一是文件系统路由。在 app/pages/ 目录下的每个 Vue 文件都会创建一个相应的 URL(或路由),用于显示该文件的内容。通过对每个页面使用动态导入,Nuxt 利用代码分割(code-splitting)来为所请求的路由加载最少量的 JavaScript。

页面

Nuxt 路由基于Vue Router并根据 app/pages/ 目录下创建的每个组件的文件名,生成相应的路由。

这种文件系统路由使用命名约定来创建动态路由和嵌套路由。

-| pages/
---| about.vue
---| index.vue
---| posts/
-----| [id].vue
阅读更多内容,请查看 文档 > 4.x > 目录结构 > App > Pages

<NuxtLink> 组件用于页面之间的跳转。它会渲染一个 <a> 标签,并将 href 属性设置为页面的路由地址。当应用程序水合(hydrate)后,页面转换将通过 JavaScript 更新浏览器 URL 来完成。这避免了全页面刷新,并支持动画过渡。

<NuxtLink> 进入客户端视口时,Nuxt 会自动预加载链接页面的组件和有效负载(生成的页面),从而实现更快的导航。

app/pages/index.vue
<template>
  <header>
    <nav>
      <ul>
        <li><NuxtLink to="/about">About</NuxtLink></li>
        <li><NuxtLink to="/posts/1">Post 1</NuxtLink></li>
        <li><NuxtLink to="/posts/2">Post 2</NuxtLink></li>
      </ul>
    </nav>
  </header>
</template>
文档 > 4 X > API > 组件 > Nuxt Link 中阅读更多信息。

路由参数

useRoute() 组合式函数(composable)可以在 Vue 组件的 <script setup> 块或 setup() 方法中使用,以访问当前路由的详细信息。

pages/posts/[id].vue
<script setup lang="ts">
const route = useRoute()

// When accessing /posts/1, route.params.id will be 1
console.log(route.params.id)
</script>
阅读更多内容,请查看 文档 > 4.x > API > Composables > Use Route

路由中间件

Nuxt 提供了一个可自定义的路由中间件框架,你可以在整个应用程序中使用它。这非常适合提取需要在导航到特定路由之前运行的代码。

路由中间件运行在 Nuxt 应用的 Vue 部分。尽管名称相似,但它们与运行在 Nitro 服务器端的服务器中间件(server middleware)完全不同。
路由中间件不会在服务器路由(例如 /api/*)或其他服务器请求中运行。若要对这些请求应用中间件,请改用 服务器中间件

共有三种类型的路由中间件:

  1. 匿名(或内联)路由中间件:直接定义在使用它们的页面中。
  2. 具名路由中间件:放置在 app/middleware/ 目录中,并在页面使用时通过异步导入自动加载。(注意:路由中间件名称会被标准化为 kebab-case,因此 someMiddleware 会变为 some-middleware。)
  3. 全局路由中间件:放置在 app/middleware/ 目录中(带有 .global 后缀),并会在每次路由变更时自动运行。

保护 /dashboard 页面的 auth 中间件示例

function isAuthenticated (): boolean { return false }
// ---cut---
export default defineNuxtRouteMiddleware((to, from) => {
  // isAuthenticated() is an example method verifying if a user is authenticated
  if (isAuthenticated() === false) {
    return navigateTo('/login')
  }
})
文档 > 4.x > 目录结构 > App > Middleware 中阅读更多内容。

路由验证

Nuxt 通过每个页面中 definePageMeta() 里的 validate 属性提供路由验证功能。

validate 属性接受 route 作为参数。你可以返回一个布尔值来确定该路由是否可以渲染此页面。如果返回 false,则会导致 404 错误。你也可以直接返回一个包含 status/statusText 的对象来自定义返回的错误信息。

如果你有更复杂的用例,可以使用匿名路由中间件。

pages/posts/[id].vue
<script setup lang="ts">
definePageMeta({
  validate (route) {
    // Check if the id is made up of digits
    return typeof route.params.id === 'string' && /^\d+$/.test(route.params.id)
  },
})
</script>
阅读更多内容,请查看 文档 > 4.x > API > Utils > Define Page Meta