当前位置: 首页 > news >正文

Next.js路由导航完全指南

在前端框架(如 React、Vue 等)或移动端开发中,路由系统是实现页面 / 界面导航的核心机制。Next.js 采用 文件系统路由(File System Routing),即根据项目目录结构自动生成路由。

Next.js 目前有两套路由解决方案,Next.js 从 v13.0.0 版本开始引入 App Router,之前的方案称之为“Pages Router”,目前的方案称之为“App Router”,两套路由系统可以相互兼容,Next.js v14+ 默认启用,本文基于 next v15版本说明。

关键区别

特性Pages RouterApp Router
目录结构基于 pages/ 目录基于 app/ 目录
组件类型仅支持客户端组件支持 Server Components(默认)
数据获取getServerSideProps/getStaticProps直接在组件中使用 async/await
布局方式手动实现 Layout 组件自动支持嵌套布局(layout.js)
文件类型.js/.jsx/.tsx新增 .server.jsx/.client.jsx

四种导航方式

Next.js 提供了多种路由导航方式,每种方式都有其特定的使用场景和优势。

1. 组件

是 Next.js 提供的一个内置组件,用于在页面之间进行客户端导航。它扩展了 HTML 的 a 标签,提供了预获取和路由之间的客户端导航功能。这是在 Next.js 中推荐的路由导航方式。

基础使用

import Link from 'next/link';export default function Page() {return <Link href="/dashboard">Dashboard</Link>;
}

动态路由

import Link from 'next/link';export default function Page() {const items = [{ id: 1, name: 'Item 1' },{ id: 2, name: 'Item 2' },];return (<ul>{items.map(item => (<li key={item.id}><Link href={`/items/${item.id}`}>{item.name}</Link></li>))}</ul>);
}

获取当前路径名

import { usePathname } from 'next/navigation';export default function Page() {const pathname = usePathname();return <div>Current Path: {pathname}</div>;
}

2. useRouter (客户端组件)

允许你以编程方式改变来自客户端组件的路由,这种方式适用于在事件处理函数或异步操作中进行导航。

'use client';import { useRouter } from 'next/navigation';export default function Page() {const router = useRouter();return (<button type="button" onClick={() => router.push('/dashboard')}>Dashboard</button>);
}

useRouter 的常用方法:

  • push:在客户端将新地址添加到浏览器历史栈中。
  • replace:在客户端导航时,将现在的访问地址替换成目标地址。
  • refresh:刷新当前路由。
  • prefetch:预获取提供的路由,加快客户端导航速度。
  • back:向后导航到浏览器历史栈中的上一页。
  • forward:向前导航到浏览器历史栈中的下一页。

3. redirect 功能(服务端组件)

redirect 函数用于在服务器组件中进行路由跳转。这种方式通常用于在服务器端根据某些条件重定向用户。

import { redirect } from 'next/navigation'async function fetchTeam(id: string) {const res = await fetch('https://...')if (!res.ok) return undefinedreturn res.json()
}export default async function Profile({params,
}: {params: Promise<{ id: string }>
}) {const { id } = await paramsif (!id) {redirect('/login')}const team = await fetchTeam(id)if (!team) {redirect('/join')}// ...
}
  • redirect 默认返回 307(临时重定向)状态代码。当在服务器操作中使用时,它会返回 303(请参阅其他),通常用于由于 POST 请求而重定向到成功页面。
  • 如果你想在渲染过程之前重定向,可以使用 next.config.js 或 中间件。
中间件

中间件允许你在请求完成之前运行代码。然后,根据传入的请求,你可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。

中间件在缓存内容和路由匹配之前运行。

常见应用场景

  • 读取部分传入请求后快速重定向
  • 根据A/B测试或实验重写到不同的页面
  • 修改所有页面或部分页面的标题
  • 拦截请求,实现鉴权、日志

中间件中的 NextResponse

  • redirect 传入请求到不同的 URL
  • rewrite 通过显示给定 URL 进行响应
  • 设置 API 路由,getServerSideProps 和 rewrite 目标的请求标头。
  • 设置响应 cookie
  • 设置响应标头
中间件的重定向应用

1. 鉴权
中间件允许你在请求完成之前运行代码。然后,根据传入请求,使用 NextResponse.redirect 重定向到不同的 URL。如果你想根据条件(例如身份验证、会话管理等)重定向用户或有大量重定向(非登录页验证 token)。

例如,如果用户未通过身份验证,则将用户重定向到 /login 页面:
```
import { NextResponse, NextRequest } from 'next/server'
import { authenticate } from 'auth-provider'export function middleware(request: NextRequest) {const isAuthenticated = authenticate(request)// If the user is authenticated, continue as normalif (isAuthenticated) {return NextResponse.next()}// Redirect to login page if not authenticatedreturn NextResponse.redirect(new URL('/login', request.url))
}export const config = {matcher: '/dashboard/:path*',
}
```
- 中间件在 redirects 之后、next.config.js 中、渲染之前运行。
  1. 拦截请求
export function middleware(request) {if (!request.cookies.has('token')) {return Response.redirect(new URL('/login', request.url));}
}

4. 原生 history API

除了 Next.js 提供的路由功能外,你还可以使用浏览器的原生 History API 进行路由跳转。这种方式适用于需要更细粒度控制路由历史的情况,不会重新加载页面。

export default function Page() {return (<button type="button" onClick={() => window.history.pushState({}, '', '/dashboard')}>Dashboard</button>);
}

动态路由

Next.js 提供了强大的动态路由功能,允许开发者根据动态参数生成页面。

1. 概念

动态路由允许你根据动态参数生成页面。例如,一个博客网站可能需要为每篇文章生成一个单独的页面,而文章的 ID 是动态的。通过动态路由,你可以使用一个页面模板来处理所有这些动态页面。

2. 创建动态路由

在 Next.js 中,动态路由通过在页面文件名中使用方括号 [] 来定义。例如,如果你有一个页面文件名为 [id].js,那么这个页面将能够处理所有类似 /123、/456 的路径,其中 123 和 456 是动态参数。

pages/
├── posts/
│   └── [id].js
└── users/└── [username].js
获取动态参数

在动态路由页面中,你可以通过 useRouter 钩子或 getServerSideProps、getStaticProps 等方法来获取动态参数。

特性useRouter 钩子getServerSidePropsgetStaticProps
使用环境仅客户端仅服务端仅构建时
获取参数方式const { id } = useRouter().querycontext.paramscontext.params
数据获取时机客户端渲染时每次请求时构建时
SEO 友好性较差(客户端渲染)优秀(服务端渲染)优秀(静态生成)
性能影响客户端解析,影响较小每次请求都执行,影响较大仅构建时执行,运行时无负担
适用场景不需要SEO的交互部分需要实时数据的页面内容不频繁变化的页面
类型支持需要手动类型断言自动推断类型自动推断类型
静态生成支持不适用不适用支持,需配合 getStaticPaths
访问请求对象不可访问可通过 context.req 访问不可访问
访问响应对象不可访问可通过 context.res 访问不可访问
重定向处理使用 router.push可在函数内返回 redirect 对象可在函数内返回 redirect 对象
重新验证支持不适用不适用支持 revalidate 参数
预渲染行为客户端渲染服务端渲染静态生成
动态路由必需配置不需要不需要需要 getStaticPaths

策略流程图

在这里插入图片描述

并行路由

(未完待续)

http://www.xdnf.cn/news/705151.html

相关文章:

  • TCP/IP四层模型
  • 如何用AI设计海报,DeepSeek+即梦免费批量生成
  • 通义灵码2.5——基于MCP打造我的12306火车票智能查询小助手
  • LVS+Keepalived 高可用
  • 【前端】Hexo一键生成目录插件推荐_放入Hexo博客
  • lesson04-简单回归案例实战(理论+代码)
  • C#·常用快捷键
  • 论文笔记:DreamDiffusion
  • DeepSeek进阶教程:实时数据分析与自动化决策系统
  • Web攻防-SQL注入增删改查盲注延时布尔报错有无回显错误处理
  • 【论文阅读】《PEACE: Empowering Geologic Map Holistic Understanding with MLLMs》
  • 模块化集成建筑(MiC建筑):颠覆传统的未来建造革命
  • 基于本地化大模型的智能编程助手全栈实践:从模型部署到IDE深度集成学习心得
  • 51c视觉~3D~合集3
  • 【SpringBoot】零基础全面解析SpringBoot配置文件
  • sass基础语法
  • Vite打包优化实践:从分包到性能提升
  • 自学嵌入式 day 25 - 系统编程 标准io 缓冲区 文件io
  • git+svn+sourcetree客户端下载和安装教程
  • DeepSeek R1开源模型的技术突破与AI产业格局的重构
  • Nacos | 三种方式的配置中心,整合Springboot3.x + yaml文件完成 0错误 自动刷新(亲测无误)
  • 单片机——keil5
  • WSL 开发环境搭建指南:Java 11 + 中间件全家桶安装实战
  • STM32开发全解析:从环境搭建到项目实战的技术文档撰写指南
  • 代谢组数据分析(二十五):代谢组与蛋白质组数据分析的异同
  • day13 leetcode-hot100-23(链表2)
  • xLSTM技术介绍
  • 技术文档写作大纲
  • JWT 不对外,Session ID 对外:构建安全可控的微服务认证架构
  • jenkins集成gitlab实现自动构建