Skip to content
字数
2016 字
阅读时间
8 分钟

浏览器 -> Next.js API Routes -> 后端服务器 (客户端请求) Next.js SSR -> 后端服务器 (服务端渲染请求)

nextjs中, 最核心的概念是 api 路由,next 能 自动生成后端路由和后端接受前端参数的api方法 next是全栈框架

Next.js 中,有几个关键概念和特性,能够帮助开发者高效地构建现代的 React 应用。这些概念包括了页面渲染方式、路由、数据获取等,下面是 Next.js 中的一些重要概念:

1. 页面和路由系统 (Pages and Routing)

Next.js 使用基于文件系统的路由系统。每个 pages 目录下的文件都会自动成为一个路由,文件名决定了其对应的 URL 路径。

  • 文件路由:在 pages 文件夹内创建的每个文件都会对应一个路由。
    • 例如,pages/index.js 对应 / 路径,pages/about.js 对应 /about 路径。
  • 动态路由:通过文件名中的方括号定义动态路由。
    • 例如,pages/posts/[id].js 会匹配 /posts/:id,其中 id 是动态参数。
    • 你可以通过 useRoutergetServerSideProps 来访问路由参数。

2. 预渲染 (Pre-rendering)

Next.js 支持两种渲染方式:静态生成 (Static Generation) 和 服务器端渲染 (Server-side Rendering)。它会默认进行页面预渲染,以提高性能和 SEO。

  • 静态生成 (Static Generation):在构建时生成 HTML,适用于不需要实时更新的页面。可以使用 getStaticProps 获取数据并进行静态生成。

    • 适用于内容不频繁变化的页面,比如博客文章、产品详情等。
    • 可以与 getStaticPaths 配合使用,来支持动态路由的静态生成。
  • 服务器端渲染 (SSR):每次请求时在服务器端生成页面。适用于需要实时更新的数据或页面。

    • 通过 getServerSideProps 来在服务器端获取数据,并渲染页面。

3. 数据获取方法 (Data Fetching)

Next.js 提供了几种不同的数据获取方法,允许你根据不同的需求选择合适的方式:

  • getStaticProps:用于静态生成的页面,可以在构建时获取数据,并将数据传递给页面组件。适合不经常更新的数据。

  • getServerSideProps:用于服务器端渲染的页面,在每次请求时从服务器获取数据。适合需要实时数据的页面。

  • getStaticPaths:与 getStaticProps 一起使用,帮助生成动态路由页面的静态内容。通常用于有动态参数(如 id)的页面。

  • useSWR:一个用于客户端数据获取的 React Hook。适用于需要在客户端动态获取数据并且能够缓存的场景。

4. API 路由 (API Routes)

Next.js 允许你在项目中创建 API 路由,这些路由会自动处理 HTTP 请求。API 路由文件放在 pages/api 目录下,每个文件对应一个 API 端点。

  • 例如,pages/api/user.js 可以处理 /api/user 的请求。
  • API 路由是一个内置的后端功能,适合处理数据请求、身份验证等。

结合 Next.js 的情况:

  • 如果你使用的是 Next.js API 路由,表单提交通常会通过 AJAX 请求调用 Next.js 的 API 路由。
    • 例如,客户端使用 fetch 发送 POST 请求到 pages/api/xxx.js,并且服务器处理表单数据后返回响应。这个过程是 客户端请求到 Next.js API 路由,通常通过 AJAX 处理,页面不会刷新,数据通常会动态更新。
  • 如果你使用 SSR(服务端渲染)静态生成(SSG),表单提交并不会直接触发页面的重新渲染,而是触发一个 HTTP 请求。这通常是使用表单提交直接触发的 POST 请求,提交的表单数据会被服务器处理,并可能根据返回结果重定向或返回一个新页面。

getServerSideProps是什么方法

ChatGPT said:

ChatGPT

getServerSidePropsNext.js 中用于服务器端渲染(SSR,Server-Side Rendering)的一种方法。它允许你在页面渲染之前,服务器端获取数据并将这些数据传递给页面组件。这样,页面在发送到客户端之前就已经包含了所需的数据,从而提高了页面加载速度和 SEO 效果。

getServerSideProps 允许你接收前端传递的参数(如 查询参数路径参数 等),并且基于这些参数在 服务器端 获取数据,生成页面内容,然后将其作为 props 返回给页面组件,最终渲染出完整的 HTML 页面。

getServerSideProps 接受前端参数,返回服务器页面

关键流程:

  1. 页面加载时,Next.js 会自动调用 getServerSideProps,并传入 context 参数,包含请求的详细信息。
  2. getServerSideProps 获取数据,比如从 API 获取产品信息。
  3. 返回的数据(例如 product)会作为 props 传递给 ProductPage 页面组件。
  4. 页面组件 ProductPage 使用传递给它的 props 渲染页面。
  5. 当用户访问 /product/123?search=phone 页面时,getServerSideProps 会被执行
    • 不需要手动调用 ProductPage。Next.js 会在服务器端运行 getServerSideProps,并将结果作为 props 自动传递给页面组件(如 ProductPage)。
  • 页面组件会根据接收到的 props 渲染内容,最终呈现给用户的页面是已经渲染好的 HTML。

next怎么知道我是声明一个函数还是返回一个页面. 每个文件下必须有且只有一个ProductPage 吗

在 Next.js 中,页面组件函数的区分由 文件结构默认导出(export default 来决定。Next.js 通过文件路径和模块的默认导出方式来知道你要创建一个页面组件,还是仅仅声明一个函数或者模块。

1. 如何区分函数和页面组件

Next.js 通过页面的 文件路径默认导出 来自动确定页面组件。每个 页面 都是一个 React 组件,并且必须在页面文件中 默认导出

  • 文件路径:Next.js 会将 pages 目录下的每一个文件视为一个页面。当你在 pages 目录下创建一个 JavaScript 文件时,它会自动将该文件映射为一个 路由。比如 pages/index.js 会映射为根路由 /pages/product/[id].js 会映射为动态路由 /product/:id

  • 默认导出:页面组件必须通过 默认导出 导出。例如,export default function MyPage() { ... }。Next.js 会自动将文件中的默认导出视为该页面的组件。

2. 每个文件下必须有且只有一个页面组件(例如 ProductPage)吗?

  • 是的,通常情况下,每个页面文件只能有一个 默认导出的页面组件,并且该组件会对应一个 URL 路径。

    • 例如:pages/index.js 只能导出一个默认组件,这个组件对应路由 /
    • 例如:pages/product/[id].js 会导出一个默认组件,作为动态路由 /product/:id 的页面。
  • 但你可以在同一个页面文件中包含多个函数,只要只有一个默认导出的页面组件。其他函数可以作为页面组件的辅助函数、API 函数或其他工具函数存在。

贡献者

The avatar of contributor named as sunchengzhi sunchengzhi

文件历史

撰写