一文带你了解 Next Route理论到实战

Next Route 导图

  1. 基于文件系统的路由:通过pages目录中的文件结构自动创建路由。添加到pages目录的文件即成为一个可访问的路由。
  2. 页面与布局:可以创建第一个页面和共享布局。分页路由器(Pages Router)能够帮助你快速实现。
  3. 动态路由:允许你在URLs中添加自定义参数。通过创建特殊的文件和文件夹命名,可以捕获URL中的数据。
  4. 链接与导航:通过Link组件以及useRouter钩子来实现客户端的导航和跳转。
  5. 重定向:学会在Next.js中处理重定向的不同方式。
  6. 自定义App组件:通过覆盖Next.js默认的App组件,可以控制页面初始化,并为所有页面添加持久的布局。
  7. 自定义文档:扩展Next.js添加的默认文档标记。
  8. API路由:支持在Next.js应用内建立API,无需另行部署服务器或服务。
  9. 自定义错误处理:可以覆盖并扩展内建的错误页面,以处理自定义错误。
  10. 国际化:Next.js内置了对国际化路由和语言检测的支持。
  11. 中间件:学习如何使用中间件来在请求完成前运行代码。

画板

Next Route 基础知识

画板

自动路由映射

Next.js通过pages目录中的文件结构自动创建路由。例如,如果你在pages目录下创建了about.js,那么Next.js会自动将/about这个URL路由到这个文件对应的组件。

动态路由

Next.js支持通过文件名来创建动态路由。如果一个页面的文件名用方括号括起来,如[param].js,则表示这部分的URL是动态的,可以匹配任何值,并且这个值可以在页面组件内部通过useRouter钩子或getServerSideProps、getStaticProps等函数作为参数获取。

嵌套路由:

在有层级结构的页面中,可以通过创建嵌套文件夹来实现。例如,你想要创建一个/products/shoes的路由,你可以在pages目录下创建一个叫products的文件夹,然后在该文件夹中创建shoes.js文件。

链接与导航

在Next.js中,可以使用Link组件来创建客户端的路由跳转,这样可以实现页面的无刷新加载。Link组件避免了浏览器默认的全页刷新行为。

服务器端渲染和静态生成

Next.js支持两种预渲染形式—静态生成和服务器渲染。使用静态生成的页面在构建时生成并可重复使用,在服务器渲染中,每个请求都会渲染页面。

404

Next.js自动提供了一个404错误页面,当路由不匹配任何页面或文件时显示。开发者也可以自定义404页面,以匹配网站的整体风格。

路由守卫和中间件:

Next.js支持中间件,可以用来处理请求并在继续路由处理前运行一些代码,比如验证用户身份或日志记录。

路由目录

app目录

在Next.js的新版本中(从13版开始),引入了名为app的新目录。这个目录是为了容纳Next.js引入的新特性,如App Router,它支持共享布局、嵌套路由、加载状态和错误处理等。

pages目录

pages目录是Next.js中传统的路由机制,每个文件对应一个路由。系统会根据文件结构自动创建路由。例如,pages/about.js会对应/about这个URL路径。

注意

  • _App Router 优先于 Pages Router。_跨目录的路由不应解析为相同的 URL 路径,并且会导致生成时错误以防止冲突。
  • 默契情况下,内部组件是app 是 React 服务器组件. 官方解释这种是性能优化,不过也可以使用客户端组件。

页面和Layout

画板

页面

页面是通过创建page.js 来实现UI视图,例如你想创建一个 这样的访问URL http://localhost:3000/person 访问,那么需要再app文件夹目录下新建文件夹person,然后在创建page.tsx 即可。

注意

  • <font style="color:#000000;">.js</font><font style="color:#000000;">.jsx</font><font style="color:#000000;">.tsx</font> 文件扩展名可用于 Pages。
  • 默认情况下,页面是服务器组件,但可以设置为客户端组件.

布局Layout

布局是在多个路由之间共享的 UI。在导航时,布局会保留状态,保持交互性,并且不会重新呈现。布局也可以嵌套.

根布局

根布局在<font style="color:#000000;">app</font>目录并应用于所有路由。此布局是必需的,并且必须包含<font style="color:#000000;">html</font><font style="color:#000000;">body</font>标记,允许您修改从服务器返回的初始 HTML。

import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>{children}</body>
    </html>
  );
}

嵌套Layout

export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return <section>{children}</section>
}

注意

  • <font style="color:#000000;">.js</font><font style="color:#000000;">.jsx</font><font style="color:#000000;">.tsx</font> 文件扩展名可用于布局。
  • 只有根布局可以包含 <font style="color:#000000;"><html></font><font style="color:#000000;"><body></font> 标签。
  • 当在同一文件夹中定义 <font style="color:#000000;">layout.js</font><font style="color:#000000;">page.js</font> 文件时,布局将包裹页面。
  • 默认情况下,布局是服务器组件,但可以设置为客户端组件.
  • 布局无法访问其下方的路由段。要访问所有路由段,您可以使用useSelectedLayoutSegmentuseSelectedLayoutSegments在客户端组件中。

模板 template

元数据

可以修改<font style="color:#000000;"><head></font>HTML 元素。

通过导出metadata对象generateMetadata功能在一个layout.jspage.js文件。

import type { Metadata } from "next";

// 配置页面的元数据
export const metadata: Metadata = {
    // 页面标题
    title: "海军",
    // 页面描述
    description: "这是页面的描述信息,通常会出现在搜索引擎结果中。",
    // 关键词
    keywords: "工具网站, 关键词2, 关键词3",

    // Viewport 设置,用于响应式设计
    viewport: "width=device-width, initial-scale=1.0",

    // Open Graph 协议,用于社交分享
    openGraph: {
      title: "海军 - 网站名称",
      description: "这是页面的描述信息,通常会出现在搜索引擎结果中。",
      images: "/path/to/image.jpg",
      url: "https://www.example.com/page-url",
      type: "website",
    },
    // Twitter 卡片设置
    twitter: {
      card: "summary_large_image",
      title: "海军 - 网站名称",
      description: "这是页面的描述信息,通常会出现在搜索引擎结果中。",
      images: "/path/to/image.jpg",
    },
  };

路由链接和导航

画板

Link 组件

import Link from 'next/link'
 
export default function Page() {
  return <Link href="/dashboard">Dashboard</Link>
}
usePathname 钩子 检查激活的链接
'use client'
 
import { usePathname } from 'next/navigation'
import Link from 'next/link'
 
export function Links() {
  const pathname = usePathname()
 
  return (
    <nav>
      <ul>
        <li>
          <Link className={`link ${pathname === '/' ? 'active' : ''}`} href="/">
            Home
          </Link>
        </li>
        <li>
          <Link
            className={`link ${pathname === '/about' ? 'active' : ''}`}
            href="/about"
          >
            About
          </Link>
        </li>
      </ul>
    </nav>
  )
}

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>
  )
}

redirect 重定向

import { redirect } from 'next/navigation'
 
async function fetchTeam(id: string) {
  const res = await fetch('https://...')
  if (!res.ok) return undefined
  return res.json()
}
 
export default async function Profile({ params }: { params: { id: string } }) {
  const team = await fetchTeam(params.id)
  if (!team) {
    redirect('/login')
  }
 
  // ...
}

最后

文章分享就到此结束了,如果大家觉得文章不错的话,可以关注我:程序员海军,后续还会分享更多Web最新最全的动态。

LVS(Linux Virtual Server)是一种基于 Linux 系统的负载均衡集群技术,它主要用于将网络流量分发到多个服务器上,以提高系统的可靠性、可扩展性和性能。 LVS 集群一般包括四个组件:调度器(LVS 调度器)、前端服务器(负载均衡器)、后端服务器(真实服务器)和存储服务器(用于共享数据)。首先,调度器接收来自客户端的请求,然后根据配置的调度算法(如轮询、加权轮询、最小连接数等)将请求分发到多个前端服务器。前端服务器接收到请求后,通过相应的负载均衡算法将请求转发到后端的真实服务器上进行处理。在整个过程中,存储服务器用于存放共享的数据,以确保所有的真实服务器都能获取到相同的数据,并提供一致的服务。 LVS 集群的优点是能够提高网站的稳定性和可靠性,当某一台服务器出现故障时,调度器会自动将请求分发到其他可用的服务器上,从而保证服务的连续性。同时,LVS 集群还能够通过增加前端服务器和后端服务器的数量来提高系统的性能和吞吐量,以满足不断增长的用户需求。 在实际应用中,LVS 集群需要合理配置,包括选择合适的调度算法、调整每台服务器的权重、选择适当的硬件设备等。此外,还需要及时监控集群的运行状态,及时发现和解决故障,以确保整个系统的正常运行。 总的来说,LVS 负载均衡集群是一种强大而高效的集群技术,能够帮助企业提高系统的可靠性和性能,是现代互联网应用中不可或缺的重要组成部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值