Next.js 中的路由初学者指南,附有示例

使用 Next.js 有很多好处,但一个非常有用的特性是它的文件路由系统。这种架构显着简化了在网站内创建路由的过程。在本教程中,我们将学习如何设置 Next.js 项目以及 Next.js 中的文件路由系统如何工作。

我们还将学习如何:

  • 创建静态和动态页面
  • Link用, 以及它的一些 props实现页面转换
  • 使用useRouter()钩子从 URL 获取查询参数
  • 动态嵌套路由

……还有更多。

我们将通过构建一个投资组合页面来了解所有这些。

Next.js 功能

Next.js 是一个基于 React 的 Web 框架,构建在 Node.js 之上。由于它基于 React,它也遵循组件架构设计。

Next.js 可用于构建静态站点。这些网站的页面会在构建时预先呈现并提供给用户。简而言之,该页面甚至在用户请求之前就可以用。

它还允许使用服务器端渲染来生成动态网页(每次用户发出新请求时都会更改的页面)。

Next.js 中间的路由架构使得创建和连接页面变得非常容易。我们可以动态传递查询参数,并创建动态页面,而无需离开pages文件夹。

为什么使用 Next.js

Next.js 框架于 2016 年 10 月 25 日首次发布。从那时起,出于这几个原因,它继续成为最受欢迎的 Web 框架之一。

一方面,Next.js 本质上是 React。这对于来自 React 背景的庞大开发者社区来说是个好消息。开发人员仍然可以使用一些 React 特性,比如组件架构、JSX 等等。

其次是使用 Next预渲染页面的能力。默认情况下,Next.js 会提前生成所有页面,然后在每个用户请求中重复使用这些页面。由于该站点是预先生成的,因此搜索引擎爬虫可以正确索引该站点进行 SEO。

如前所述,Next.js 中文件路由系统是一个非常有用的功能,它显着简化了在网站内创建路由的过程。.js所以你基本上可以在一个名为 的文件夹中创建一堆文件pages,Next.js 将用于你的所有路由。它不仅有用,而且非常强大。

该项目

该站点将有两条简单的路线和两条动态路线(稍后我们将了解它们的含义)。

该Projects页面将呈现项目列表。单击查看更多后,我们将被定向到单个项目页面。

该页面将呈现博客文章列表,我们也可以通过单击阅读更多blog来查看单个博客页面。该页面将包含有关特定帖子的详细信息。

为了在 Next 中演示路由嵌套,我们还将/comments为每篇博文创建一个嵌套路由。例如,我们可以通过访问来查看第一篇文章的评论
localhost:3000/blog/first-post/comments。

这是该项目的实时预览:

您可以从其GitHub 存储库中获取代码,在您的机器上运行它并根据需要对其进行调整。您可以删除我的图像并将您的图像移动到/public文件夹中。您只需要更改标记中的文件名。

入门

要开始使用 Next,您需要在计算机上安装 Node.js。Node 的版本不应低于12.x. node -v您可以通过在命令终端上键入来检查版本。

如果你没有安装 Node.js,或者有旧版本,你可以从这里下载最新版本。

下载后,我们需要初始化我们的项目。我们可以自动或手动执行此操作。在本教程中,我们将使用create-next-app代码生成器自动为我们构建一个工作框架。

请导航到您希望项目所在的文件夹并输入以下命令:

cd your/path
npx create-next-app next-portfolio

最后,运行以下命令:

npm run dev

如果一切顺利,您应该在终端窗口上看到以下内容。

我们可以在 web 浏览器上的http://localhost:3000查看页面。

Next.js 中基于文件的路由架构

当我们运行该命令时,我们在next-portfolio当前目录中创建了一个名为的文件夹。在里面next-portfolio,你会发现一些重要的文件夹和文件。

我们最常使用的文件夹是pages. 在 Next 中,.js内部定义的每个文件都pages映射到一个类似命名的路由:

  • pages/about.js将映射到/about
  • pages/contact.js将映射到/contact
  • pages/blog.js将映射到/blog

这是典型 Next 项目中 pages 文件夹的高级表示:

my-site

└── pages

    └── api // API routes

    ├── _app.js // custom route (will **not** be used as a route)

    ├── index.js // index route (will be rendered at my-site.com)

    ├── about.js // predefined route (will be rendered at my-site.com/about)

    ├── contact.js // predefined route (will be rendered at my-site.com/contact)

    └── blog

        ├── index.js // index route for blog (will be rendered at my-site.com/blog) 

        ├── author.js // predefined route (will be rendered at my-site.com/blog/author)

        ├── [blog-id].js // handles dynamic route (will render dynamcially, based on the url parameter)

        └── [...slug].js // handles catch all route (will be rendered at all routes following my-site.com/blog)

每个 React 组件都将捆绑为一个.js文件,其中包含每个页面的标记和逻辑。

公共文件夹

Next.js 提供了一个公共文件夹,您可以在其中存储图像、自定义脚本和字体等静态资产,并从您的组件/代码中引用它们。

我们将在投资组合网站的各个页面中使用以下图片:

  • 一张个人照片。这将用于主页 ( index.js)。
  • 四个社交媒体图标。这将用于联系页面 ( contact.js)。

自定义页面

您可能已经注意到_app.js页面文件夹中的页面。此页面是自定义页面。Next.js不将自定义页面用作路由,它们的前缀是下划线 ( _)。

Next.js 使用_app.js来初始化网页。该组件初始化应用程序并传递pagePropsprop,这是我们网站中所有嵌套组件所需的数据。

作为根组件,我们可以定义一个我们想要在所有页面中持久化的布局。

我们还可以使用适用于所有元素的全局样式表,如下例所示:

//next-portfolio/pages/_app.js

import Layout from '../components/Layout'
import '../styles/globals.css'

function MyApp({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  ); 
}

export default MyApp

索引路线

my-site.com每当我们导航到诸如、my-site.com/blog或之类的索引路由(也称为主页)时my-site.com/projects,Next.js 都会从该目录中读取名为index.js.

所以本质上,pages/index.js返回主页的标记,显示在localhost:3000. pages/blog/index.js返回博客主页的标记,位于localhost:3000/blog.

在您的代码编辑器中,请转到索引页面并删除所有文件内容。以下标记用于测试目的:

// next-portfolio/pages/index.js

import Image from 'next/image'
import Link from 'next/link'

export default function Home() {
  return (
    <div className="container">
      <h1>Hello World</h1>
    </div>  
    )
}

注意:进入next-portfolio/styles您的文本编辑器,然后删除Home.module.css,因为我们根本不需要它。

现在保存文件更改并打开http://localhost:3000。索引文件中的更改将反映在索引路由上。

文件中将包含更多内容index.js。主页的顶部将包含导航链接。但是,在主页之前构建其他页面更直观,因此我们可以正确链接到它们。

出于这个原因,我们需要先创建一些其他页面,然后再构建我们的主页。

静态路由

首先,我们将为我们的投资组合网站创建两条静态路由。这些路由呈现静态数据:它们不使用 URL 中的查询参数来呈现数据。

我们将创建的两个静态路由是about.js和contact.js。这些文件将分别用于/about和/contact路由。

为此,请导航到next-portfolio/pages并创建一个名为about.js. 关于页面的标记将进入其中:

// next-portfolio/pages/About.js

export default function About() {
    return (
        <div className="container">
            <h1> About me </h1>
            <p> My name is Kingsley Ubah. I'm a 22-year-old web developer from Nigeria. I'm particularly interested in technical writing. When I'm not coding or writing, I read my favorite books and play some cool video games. I'm a huge fan of good movies and football. Also, don't play with my food!</p>
            <p>I'm skilled in front-end web development. I'm equally good at the back end. Technologies I work well with include React, Node.js, Vue, Next, Gatsby, OAuth, MongoDB, MySQL and many others. </p>
            <p>I could keep going on and on about my life but I can guarantee that you'll be bored in the end. So I'll just end it right here.</p>
        </div>
    )
}

注意:当然,如果您愿意,您可以根据自己的技能自定义内容!

现在请保存文件更改,转到
next-portfolio/styles/globals.css并输入以下样式:

@import url('https://fonts.googleapis.com/css2?family=Lato:wght@300&display=swap');

html,
body {
  padding: 0;
  margin: 0;
  font-family: "lato", sans-serif;
  font-size: 20px;
  background-color: #D7E5f0;  
}

* {
  box-sizing: border-box;
}

h1 {
  font-size: 60px;
}

.logo {
  font-weight: 600;
  font-size: 30px;
}

p {
  font-size: 20px;
  font-weight: 600;
  line-height: 1.2;
}

a {
  text-decoration: none;
  color: black;
}

.container {
  margin: 0 auto;
  max-width: 1200px;
}

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值