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

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

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

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刪除
最新教學 更多>
  • 為什麼我的HTML頁面作為Google Chrome中的插件加載,而不是Firefox?
    為什麼我的HTML頁面作為Google Chrome中的插件加載,而不是Firefox?
    使用JavaScript將HTML頁面加載到DIV中:儘管簡單,但使用JavaScript將HTML頁面加載到DIV中,將HTML頁面加載到DIV中,有時使用JavaScript將HTML頁面加載到不同的挑戰中,尤其是在不同的browsers中。本文解決了使用對象標籤在Google Chrome中...
    程式設計 發佈於2025-03-25
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-03-25
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP將...
    程式設計 發佈於2025-03-25
  • 在GO JSON中漂浮時,如何保留尾隨的零?
    在GO JSON中漂浮時,如何保留尾隨的零?
    在JSON填充的浮點數問題:當將GO程序的值與尾隨零(例如40.0),JSON.MARSHAL(JOSON.MARSHAL()輸出無零(ESERO(例如40)的值時,如果外部程序期望使用落後零來期望浮點數數字。字節,錯誤){ 如果float64(f)== float64(int(f)){ ...
    程式設計 發佈於2025-03-25
  • 為什麼協方差不使用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(d...
    程式設計 發佈於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

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

Copyright© 2022 湘ICP备2022001581号-3