”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化

Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化

发布于2024-11-09
浏览:647

SSR in Next.js  What’s New in App Routing Compared to Page Routing

介绍

Next.js 长期以来一直是构建服务器渲染 React 应用程序的流行选择。凭借其对服务器端渲染 (SSR) 的内置支持,开发人员可以创建动态、SEO 友好的应用程序。然而,Next.js 13 中 App Router 的引入以及 Next.js 14 中的改进显着简化和增强了 SSR。

在这篇博文中,我们将探讨传统页面路由系统和较新的应用程序路由系统之间 SSR 的差异,重点介绍 SSR 的工作原理以及它如何随着新的路由范例而发生变化。

页面路由中的 SSR (Pre-Next.js 13)

在引入 App Router 之前,SSR 是在页面路由系统中使用 getServerSideProps 等特定函数来处理的。每个请求都会调用此函数,允许开发人员在渲染页面之前获取服务器端的数据。

使用 getServerSideProps 的页面路由中的 SSR 示例:

export default function Blogs({ data }) {
  // Render the fetched data
  return (
    
{data.map((item) => (

{item.title}

{item.content}

))}
); } // This function runs on every request export async function getServerSideProps() { // Fetch data from an external API const res = await fetch('https://api.example.com/blogs'); const data = await res.json(); // Pass the data as props to the page component return { props: { data } }; }

这里,getServerSideProps是Page Routing系统中SSR的关键。它允许您在每次请求时从 API(或任何其他数据源)获取数据,并将其作为 props 传递给页面组件。这种模式虽然功能强大,但在处理大量服务器端逻辑和不同的路由时可能会导致复杂的代码库。

Next.js 中的应用程序路由和 SSR 14

在 Next.js 14 中,SSR 变得更加简化并集成到应用程序路由系统中。这个新系统引入了服务器组件和客户端组件,其中 SSR 更加直观。

在应用程序路由中,您现在可以直接获取组件内部的数据,而不需要 getServerSideProps 等特殊函数。您可以通过使用服务器操作来实现此目的,这使得代码更简单且更易于维护。

带有服务器组件的应用程序路由中的 SSR 示例:

"use server";

export async function getBlogs() {
  try {
    const response = await fetch('https://api.example.com/posts');
    return response.json();
  } catch (error) {
    return { error: error.message };
  }
}

// This component runs on the server and fetches data
export default async function Blog() {
  const blogs = await getBlogs();

  return (
    
{(blogs || []).map((blog) => (

{blog.name}

{blog.content}

))}
); }

在此应用程序路由示例中,我们使用服务器组件通过 use server 直接在组件文件内获取数据。这样就不再需要单独的 API 路由或函数,例如 getServerSideProps.

服务器操作的力量
Next.js 14 通过引入服务器操作简化了流程。这些操作允许您直接获取和处理组件文件中的数据,从而降低复杂性并使您的代码库更易于维护。

服务器操作的主要优点:

更简洁的代码:您可以将所有内容保留在一个地方,而不是将服务器端逻辑分散在单独的文件或函数中。
提高可维护性:移动部件更少意味着需要管理的代码更少,从而使您的应用程序更易于维护。
更好的性能:借助智能缓存机制,您可以微调服务器端逻辑以获得最佳性能。

SSR in Next.js  What’s New in App Routing Compared to Page Routing

Next.js 中的水合作用

在 Next.js 和服务器端渲染 (SSR) 的上下文中,水化是指将静态渲染的 HTML 页面(从服务器发送)转换为浏览器中完全交互式 React 应用程序的过程。它使用 React 的客户端 JavaScript “水合”静态 HTML,使页面具有交互性。

应用程序路由与页面路由中的水合

在页面路由中,页面上的每个组件都需要水合作用,使其在客户端具有交互性。这意味着交互所需的所有 JavaScript 都会发送到客户端,这可能会随着应用程序的扩展而导致性能瓶颈。

在应用程序路由中,对于服务器组件,只有客户端组件(处理交互性的组件)被水化。这种选择性水合作用减少了发送到客户端的 JavaScript 量,从而提高了性能。

应用程序路由中的客户端组件示例:

'use client';  // Mark this as a client component

export default function Button() {
  return (
    
  );
}

这里,按钮组件被标记为带有“use client”的客户端组件。它允许交互并在客户端运行,而其他非交互组件仍保留为服务器组件,从而提高性能。

有关 App Routing 中水合作用的更多信息

其工作原理如下:

作为服务器组件的父组件:

父组件(通常是更高级别的组件或整个页面组件)通常是服务器组件。它们在服务器上运行并处理诸如数据获取、呈现静态 HTML 以及将该数据传递给子组件之类的事情。
由于这些是服务器渲染的,因此它们不包含客户端上的任何 JavaScript,并且它们不是交互式的。

用于交互的客户端组件:

处理交互性(如按钮、表单等)的子组件是客户端组件。这些组件可以使用 React hooks(useState、useEffect 等)并在客户端进行水合。
服务器组件通过 props 将数据传递给这些客户端组件。
一旦 HTML 加载到浏览器中,Next.js 就会合并客户端组件,附加必要的事件侦听器并使页面具有交互性。

// Server Component (Parent Component)
export default async function ParentComponent() {
  // Fetch data on the server
  const data = await fetch('https://api.example.com/data').then(res => res.json());

  return (
    

This is Server-Side Rendered

); } // Client Component (Child Component) 'use client'; import { useState } from 'react'; function ClientComponent({ data }) { const [count, setCount] = useState(0); return (

Data from server: {JSON.stringify(data)}

Client-side counter: {count}

); }

结论

Next.js 14 通过在 App Router 中引入服务器操作,使服务器端渲染 (SSR) 变得更简单、更强大。通过允许开发人员直接在组件文件内获取数据,这个新系统简化了服务器端逻辑,简化了代码库,并减少了对单独 API 路由的需求。与选择性水合相结合,Next.js 14 中的 SSR 现在更快、更高效,可帮助您轻松构建高度动态且 SEO 友好的应用程序。

通过利用这些服务器操作,您可以提高应用程序的性能,同时保持代码整洁和可维护。从页面路由到使用服务器和客户端组件的应用程序路由的转变代表了构建可扩展 Web 应用程序的重大飞跃。

SSR in Next.js  What’s New in App Routing Compared to Page Routing

版本声明 本文转载于:https://dev.to/asim_khan_cbe65e41bcbbc65/understanding-nextjs-page-routing-vs-app-routing-and-ssr-changes-in-nextjs-14-2cge?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么协方差不使用C#中的价值类型?
    为什么协方差不使用C#中的价值类型?
    [2 [2 ienumerable 在C#展示协方差中的接口,允许将派生类型引用分配给基本类型引用。 但是,这不适用于价值类型。 分配 iEnumosere 此限制源于拳击和拆箱。拳击将值类型转换为参考类型(对象),而拆箱会反转。 iEnumerable 's type pa...
    编程 发布于2025-03-25
  • 何时使用===在JavaScript中使用===的时间?
    何时使用===在JavaScript中使用===的时间?
    在Javascript中检查字符串等式:在比较JavaScript中的字符串时,发现最佳实践在Javascript中进行比较时,有两个操作员:= = ==和====。使用哪一个可能是混乱的根源。本指南将澄清检查字符串等效的正确方法,并深入研究其背后的原因。推荐方法:use === ,直到您彻底掌握...
    编程 发布于2025-03-25
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-03-25
  • 在Python中命名元组:它们是什么类型?
    在Python中命名元组:它们是什么类型?
    在python中名为“元组”是内置元组数据类型的扩展,使您可以将有意义的名称命名为元素的元素。在其他话语中,命名的元组是具有命名属性的元组。那不是很酷吗? 它们是集合模块的一部分,并提供了一种以更简单的方式定义简单,不变的的方法。等等,类? 是的,类。 命名元素本质上是不变的类。 让我们看看这是如...
    编程 发布于2025-03-24
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-24
  • 如何将mysql时间戳转换为“ yyyy-mm-dd”日期?
    如何将mysql时间戳转换为“ yyyy-mm-dd”日期?
    Converting Timestamps to Dates in MySQL QueriesWhen working with timestamps in MySQL queries, it can often be necessary to convert them into a more hu...
    编程 发布于2025-03-24
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-03-24
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-03-24
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-24
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-24
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-03-24
  • 如何在GO中有效读取二进制文件?
    如何在GO中有效读取二进制文件?
    读取二进制文件:综合指南如果您是新手,并且需要阅读二进制文件,则本指南将带您完成此任务的步骤。例如:通过调用 *os.file对象上的关闭方法完成读取后,请记住要关闭文件。将bytes读入buffer ,有几种方法可以将BYTE读取为go中的buffer。界面:使用缓冲读取器: bufio.read...
    编程 发布于2025-03-24
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制,控制元素的滚动行为对于确保用户体验和可访问性是必不可少的。一种这样的方案涉及限制动态大小的父元素中元素的滚动范围。问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期...
    编程 发布于2025-03-24
  • 在Java中压缩和解压缩文件
    在Java中压缩和解压缩文件
    [2 本文探讨了Java中的文件压缩和解压缩,重点介绍了 fordaterinputStream 类。 这些类提供有效的方法来处理压缩数据。 [2 Java提供了内置支持,用于使用 package来压缩和解压缩文件。 deflateroutputstream 将数据压缩到缩放格式中(通常在z...
    编程 发布于2025-03-24
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-03-24

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3