」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Next.js 中的 SSR 應用程式路由與頁面路由相比有何新變化

Next.js 中的 SSR 應用程式路由與頁面路由相比有何新變化

發佈於2024-11-09
瀏覽:642

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如有侵犯,請聯絡study_golang @163.com刪除
最新教學 更多>
  • 帶有管理面板的輕量級 Rest Api,可輕鬆管理食物食譜。
    帶有管理面板的輕量級 Rest Api,可輕鬆管理食物食譜。
    你好, ?所有這篇文章都是關於我剛剛在 Github 上發布的 Django Rest Framework API。 如果您正在尋找一些簡單且高效的 API 來從管理面板管理食物食譜並將其返回以供客戶端使用,那麼此儲存庫適合您。 該程式碼是輕量級的,可以在任何低功耗迷你 PC(如 Raspbe...
    程式設計 發佈於2024-11-09
  • 如何在Java中使用堆疊將算術表達式解析為樹結構?
    如何在Java中使用堆疊將算術表達式解析為樹結構?
    在Java 中將算術表達式解析為樹結構從算術表達式創建自定義樹可能是一項具有挑戰性的任務,特別是在確保樹結構時準確反映表達式的操作和優先順序。 要實現這一點,一種有效的方法是使用堆疊。以下是該過程的逐步描述:初始化:從空堆疊開始。 處理令牌:迭代表達式中的每個標記:如果標記是左括號,則將其壓入堆疊。...
    程式設計 發佈於2024-11-09
  • 如何使用正規表示式來匹配帶有或不帶有可選 HTTP 和 WWW 前綴的 URL?
    如何使用正規表示式來匹配帶有或不帶有可選 HTTP 和 WWW 前綴的 URL?
    使用可選 HTTP 和 WWW 前綴匹配 URL正則表達式是執行複雜模式匹配任務的強大工具。當涉及到符合 URL 時,格式通常會有所不同,例如是否包含「http://www」。 使用正規表示式的解決方案匹配帶或不帶「http://www」的 URL。前綴,可以使用以下正規表示式:((https?|f...
    程式設計 發佈於2024-11-09
  • 如何在不依賴副檔名的情況下確定檔案類型?
    如何在不依賴副檔名的情況下確定檔案類型?
    如何在不依賴副檔名的情況下偵測檔案類型除了檢查檔案的副檔名之外,確定檔案是mp3 還是圖像格式是很有價值的程式設計中的任務。這是一個不依賴擴充的全面解決方案:PHP >= 5.3:$mimetype = finfo_fopen(fopen($filename, 'r'), FILEINFO_MIME...
    程式設計 發佈於2024-11-09
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-09
  • 在 JavaScript 中實作斐波那契數列:常見方法和變體
    在 JavaScript 中實作斐波那契數列:常見方法和變體
    作為開發人員,您可能遇到過編寫函數來計算斐波那契數列中的值的任務。這個經典問題經常出現在程式設計面試中,通常要求遞歸實現。然而,面試官有時可能會要求具體的方法。在本文中,我們將探討 JavaScript 中最常見的斐波那契數列實作。 什麼是斐波那契數列? 首先,讓我們回顧一下。斐波...
    程式設計 發佈於2024-11-09
  • 如何使用 .htaccess 更改共享伺服器上的 PHP 版本?
    如何使用 .htaccess 更改共享伺服器上的 PHP 版本?
    在共享伺服器上透過.htaccess 更改PHP 版本如果您正在操作共享伺服器並且需要更改PHP 版本,可以透過.htaccess文件來做到這一點。這允許您為您的網站運行特定的 PHP 版本,同時伺服器維護其預設版本。 要切換 PHP 版本,請按照下列步驟操作:找到 . htaccess 檔案: 該...
    程式設計 發佈於2024-11-09
  • 如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax資料載入過程中顯示進度條?
    如何在Ajax 資料載入期間顯示進度條處理使用者觸發的事件(例如從下拉方塊中選擇值)時,通常會使用非同步擷取資料阿賈克斯。在獲取數據時,向用戶提供正在發生某事的視覺指示是有益的。本文探討了一種在 Ajax 請求期間顯示進度條的方法。 使用 Ajax 實作進度條要建立一個準確追蹤 Ajax 呼叫進度的...
    程式設計 發佈於2024-11-09
  • TCJavaScript 更新、TypeScript Beta、Node.js 等等
    TCJavaScript 更新、TypeScript Beta、Node.js 等等
    歡迎來到新一期的「JavaScript 本週」! 今天,我們從 TC39、Deno 2 正式版本、TypeScript 5.7 Beta 等方面獲得了一些針對 JavaScript 語言的巨大新更新,所以讓我們開始吧! TC39 更新:JavaScript 有何變化? 最近在東京...
    程式設計 發佈於2024-11-09
  • 為什麼 Bootstrap 用戶應該在下一個專案中考慮使用 Tailwind CSS?
    為什麼 Bootstrap 用戶應該在下一個專案中考慮使用 Tailwind CSS?
    Tailwind CSS 入门 Bootstrap 用户指南 大家好! ?如果您是 Bootstrap 的长期用户,并且对过渡到 Tailwind CSS 感到好奇,那么本指南适合您。 Tailwind 是一个实用程序优先的 CSS 框架,与 Bootstrap 基于组件的结构相比...
    程式設計 發佈於2024-11-09
  • 組合與繼承
    組合與繼承
    介绍 继承和组合是面向对象编程(OOP)中的两个基本概念,但它们的用法不同并且具有不同的目的。这篇文章的目的是回顾这些目的,以及选择它们时要记住的一些事情。 继承的概念 当我们考虑在设计中应用继承时,我们必须了解: 定义:在继承中,一个类(称为派生类或子类)可以从另...
    程式設計 發佈於2024-11-09
  • 如何在 JavaScript 中將浮點數轉換為整數?
    如何在 JavaScript 中將浮點數轉換為整數?
    如何在 JavaScript 中將浮點數轉換為整數要將浮點數轉換為整數,您可以使用 JavaScript內建數學物件。 Math 物件提供了多種處理數學運算的方法,包括舍入和截斷。 方法:1。截斷:截斷去除數字的小數部分。要截斷浮點數,請使用 Math.floor()。此方法向下舍入到小於或等於原始...
    程式設計 發佈於2024-11-09
  • 標準字串實作中的 c_str() 和 data() 是否有顯著差異?
    標準字串實作中的 c_str() 和 data() 是否有顯著差異?
    標準字串實作中的c_str()與data()STL中c_str()和data()函數的區別人們普遍認為類似的實作是基於空終止的。據推測,c_str() 總是提供以 null 結尾的字串,而 data() 則不然。 然而,在實踐中,實作經常透過讓 data() 在內部呼叫 c_str() 來消除這種區...
    程式設計 發佈於2024-11-09
  • C/C++ 中的類型轉換如何運作以及程式設計師應該注意哪些陷阱?
    C/C++ 中的類型轉換如何運作以及程式設計師應該注意哪些陷阱?
    了解C/C 中的類型轉換型別轉換是C 和C 程式設計的一個重要方面,涉及將資料從一種類型轉換為另一種類型。它在記憶體管理、資料操作和不同類型之間的互通性方面發揮著重要作用。然而,了解類型轉換的工作原理及其限制對於防止潛在錯誤至關重要。 明確型別轉換使用 (type) 語法執行的明確型別轉換可讓程式設...
    程式設計 發佈於2024-11-09
  • 我們如何在 Golang 中為不同的資料類型建立通用函數?
    我們如何在 Golang 中為不同的資料類型建立通用函數?
    Golang 中的通用方法參數在 Go 中,一個常見的需求是有一個對不同類型的資料進行操作的函數。以計算特定類型切片中元素數量的函數為例。如何設計這個函數來處理任何類型的數據,而不僅僅是它最初設計的特定類型? 一種方法是使用接口,它本質上是定義類型必須的一組方法的契約實現以符合接口。透過使用介面作為...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3