HOW - React NextJS 的同構機制

文章目錄

  • 一、什么是 Next.js 的同構?
  • 二、核心目錄結構
  • 三、關鍵函數:如何實現不同渲染方式?
    • 1. getServerSideProps —— 實現 SSR(每次請求動態獲取數據)
    • 2. getStaticProps + getStaticPaths —— 實現 SSG(構建時生成)
  • 四、Hydration:服務端渲染 + 客戶端交互
  • 五、客戶端/服務端代碼混用的注意點
  • 六、完整例子:同構頁面流程圖
  • 七、總結

在如下文章我們介紹了同構和三大渲染場景:

  • WHAT - 前端同構 Isomorphic Javascript
  • WHAT - SSR vs SSG vs ISR

接下來我們主要去深入了解 React 的同構實現,Next.js 是最好的起點。它為你封裝好了復雜的同構邏輯,讓你專注于構建組件和頁面。

下面我會幫你系統性地理解 Next.js 的同構機制,包括目錄結構、渲染方式(SSR/SSG/ISR)、客戶端與服務端代碼共存的原理。

一、什么是 Next.js 的同構?

在 Next.js 中,“同構”意味著:

  • 你的 React 頁面可以在服務端渲染出 HTML
  • 然后發送給瀏覽器,并在瀏覽器上"水合"成可交互的 React 應用。

一套代碼,同時運行在服務器和瀏覽器,頁面內容和結構一致。


二、核心目錄結構

my-next-app/
├── pages/               # 路由頁面(同構重點)
│   ├── index.tsx        # 首頁(自動匹配 / 路由)
│   ├── about.tsx        # /about 頁面
│   └── [id].tsx         # 動態路由頁面 /xxx
├── public/              # 靜態資源
├── components/          # 可復用的 React 組件
├── styles/              # 樣式文件
└── next.config.js       # 配置文件

每個 pages/xxx.tsx 頁面都會被 Next.js 編譯為同構頁面 —— 即同時具有 SSR/CSR 能力。


三、關鍵函數:如何實現不同渲染方式?

1. getServerSideProps —— 實現 SSR(每次請求動態獲取數據)

// pages/post/[id].tsx
export async function getServerSideProps(context) {const res = await fetch(`https://api.example.com/post/${context.params.id}`);const data = await res.json();return { props: { data } };
}
  • 每次請求服務器都會運行這段邏輯,返回 HTML。

2. getStaticProps + getStaticPaths —— 實現 SSG(構建時生成)

// pages/post/[id].tsx
export async function getStaticPaths() {const res = await fetch('https://api.example.com/posts');const posts = await res.json();return {paths: posts.map(post => ({ params: { id: post.id.toString() } })),fallback: false, // or 'blocking' for ISR};
}export async function getStaticProps({ params }) {const res = await fetch(`https://api.example.com/post/${params.id}`);const data = await res.json();return { props: { data }, revalidate: 60 }; // ISR:60秒更新一次
}
  • 初始構建時預生成頁面,后續請求直接返回靜態 HTML。
  • 使用 revalidate 支持增量靜態更新(ISR)。

四、Hydration:服務端渲染 + 客戶端交互

  1. 服務端階段

    • Next.js 在 Node.js 環境執行頁面組件。
    • 使用 react-dom/server 渲染為 HTML。
    • 將 HTML 和頁面初始數據一同發送給瀏覽器。
  2. 客戶端階段

    • React 在瀏覽器中調用 hydrate 方法,把 HTML “接管”。
    • 綁定事件、狀態等功能,實現交互。

這就是同構的本質:HTML 是 SSR 渲染的,交互是 CSR 接管的。


五、客戶端/服務端代碼混用的注意點

在 Next.js 中你可以寫出這樣的代碼:

import { useEffect } from 'react';export default function Page() {useEffect(() => {console.log('只在瀏覽器中執行');}, []);return <div>Hello World</div>;
}

? 這段代碼在 SSR 階段會忽略 useEffect,只渲染 HTML
? 到瀏覽器中后,useEffect 會執行,實現動態行為。

如果你需要只在服務端運行邏輯,可以用:

if (typeof window === 'undefined') {// 服務端環境
}

六、完整例子:同構頁面流程圖

User 請求頁面 ──> 服務器運行 React 頁面(SSR) ──> HTML 返回給瀏覽器│帶上初始數據(props)↓瀏覽器加載 React、hydrate 成交互頁面

七、總結

項目是否同構渲染方式SEO 支持首屏速度
React CRA?CSR?
Next.js SSR?服務端渲染?
Next.js SSG?靜態生成?非常快
Next.js ISR?靜態 + 動態混合?快且智能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81101.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SkyWalking的工作原理和搭建過程

SkyWalking 是一個開源的 應用性能監控系統&#xff08;APM&#xff09;&#xff0c;專為云原生、微服務架構設計。其核心原理基于 分布式追蹤&#xff08;Distributed Tracing&#xff09;、指標收集&#xff08;Metrics Collection&#xff09; 和 日志關聯&#xff08;Log C…

軟考 系統架構設計師系列知識點之雜項集萃(57)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;56&#xff09; 第93題 美國著名的卡內基梅隆大學軟件工程學研究所針對軟件工程的工程管理能力與水平進行了充分研究&#xff0c;提出了5級管理能力的模式&#xff0c;包括臨時湊合階段、簡單模仿…

Java 泛型與類型擦除:為什么解析對象時能保留泛型信息?

引言&#xff1a;泛型的“魔術”與類型擦除的困境 在 Java 中&#xff0c;泛型為開發者提供了類型安全的集合操作&#xff0c;但其背后的**類型擦除&#xff08;Type Erasure&#xff09;**機制卻常常讓人困惑。你是否遇到過這樣的場景&#xff1f; List<String> list …

【gRPC】HTTP/2協議,HTTP/1.x中線頭阻塞問題由來,及HTTP/2中的解決方案,RPC、Protobuf、HTTP/2 的關系及核心知識點匯總

HTTP/2協議特點 gRPC基于HTTP/2協議&#xff0c;原因&#xff1a; 多路復用&#xff1a;允許在同一個TCP連接上并行傳輸多個請求和響應&#xff0c;即多個gRPC調用可以通過同一個連接同時進行&#xff0c;避免了HTTP/1.x中常見的線頭阻塞問題&#xff0c;減少了連接建立和關閉…

PCIe Switch 問題點

系列文章目錄 文章目錄 系列文章目錄完善PCIe Retimer Overview Document OutlineSwitch 維度BroadComMicroChipAsmedia 祥碩Cyan其他 完善 Functional block diagram&#xff0c;功能框圖Key Features and Benefits&#xff0c;主要功能和優點Fabric 鏈路Multi-root PCIe Re…

vue復雜數據類型多層嵌套的監聽

vue復雜數據類型多層嵌套的監聽 本來看前輩的做法是watch的嵌套&#xff0c;遇到這種復雜的數據結構還是不多&#xff0c;分享一下前輩的做法 let stopChildWatchList [] // 用于存放每個子監聽器watch(() > data,(val) > {// 清除舊監聽stopChildWatchList.forEach(…

來一個復古的技術FTP

背景 10年前的老代碼&#xff0c;需要升級springboot框架&#xff0c;在升級過程中&#xff0c;測試業務流程里&#xff0c;有FTP的下載業務&#xff0c;不管測試環境如何測試&#xff0c;都沒有成功&#xff0c;最后只能自己搭建一個FTP服務器&#xff0c;寫一個ftp-demo來測試…

MyBatis-Flex配置Druid(德魯伊數據庫連接池):Spring Boot 3 集成 MyBatis-Flex 配置 Druid 連接池指南

Spring Boot 3 集成 MyBatis-Flex 配置 Druid 連接池指南 前言 本文詳細講解在 Spring Boot 3 項目中集成 MyBatis-Flex 框架后&#xff0c;如何正確配置 Druid 數據庫連接池。針對開發者常見的配置缺失導致啟動失敗的場景&#xff0c;提供完整的解決方案和原理分析。 前置知識…

安全生產調度管理系統的核心功能模塊

安全生產調度管理系統是運用現代信息技術構建的智能化管理平臺&#xff0c;旨在實現生產安全風險的全面管控和應急資源的優化調度。該系統通過整合物聯網、大數據、人工智能等前沿技術&#xff0c;建立起覆蓋風險監測、預警預測、指揮調度、決策支持的全鏈條安全管理體系。 一…

桃芯ingchips——windows HID鍵盤例程無法同時連接兩個,但是安卓手機可以的問題

目錄 環境 現象 原理及解決辦法 環境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的開發板&#xff0c;DB870CC1A 現象 連接安卓手機時并不會出現該現象&#xff0c;兩個開發板都可以當做鍵盤給手機發按…

JavaScript - JavaScript 運算符之圓括號運算符與方括號運算符(圓括號運算符概述、圓括號運算符用法、方括號運算符概述、方括號運算符用法)

一、圓括號運算符概述 圓括號運算符&#xff08;()&#xff09;主要用于函數調用、表達式分組、多種語法結構登 二、圓括號運算符用法 調用函數 function greet() {console.log("Hello!"); }greet();# 輸出結果Hello!當箭頭函數有多個參數或零個參數時需要括號 c…

AG-UI 協議:重構多模態交互,開啟智能應用新紀元

一、協議誕生的時代背景&#xff1a;填補 AI 生態最后一塊拼圖 在人工智能技術飛速發展的今天&#xff0c;AI 代理&#xff08;Agent&#xff09;作為能夠主動執行復雜任務的智能實體&#xff0c;正從實驗室走向生產環境&#xff0c;重塑各個行業的工作流程。然而&#xff0c;…

嵌入式學習的第二十天-數據結構-調試+鏈表的一般操作

一、調試 1.一般調試 2.找段錯誤 二、鏈表的一般操作 1.單鏈表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.單鏈表的銷毀 int D…

如何同時管理不同平臺的多個賬號?

在當今數字營銷、電商運營、跨境貿易盛行的時代&#xff0c;同時管理多個平臺的賬號幾乎成了從業者的標配。無論是做社媒營銷的廣告主&#xff0c;還是操作亞馬遜、eBay、Shopee 等平臺的跨境賣家&#xff0c;多賬號運營都是提升曝光、分散風險、擴大收益的重要方式。 然而&am…

STM32外設AD/DA-基礎及CubeMX配置

STM32外設AD/DA-基礎及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基礎概念1&#xff0c;模擬 vs 數字2&#xff0c;AD轉換1&#xff0c;分辨率 (Resolution)2&#xff0c;參考電壓 (Reference Voltage, Vref)3&#xff0c;采樣率 (Sampling Rate) 3&#xff0c;DA轉換…

【軟考 霍夫曼編碼的文檔壓縮比】

霍夫曼編碼的文檔壓縮比計算基于字符頻率的最優編碼分配&#xff0c;以下是詳細步驟及相關案例&#xff1a; 一、壓縮比計算公式 [ \text{壓縮比} \frac{\text{壓縮前總比特數}}{\text{壓縮后總比特數 編碼表存儲開銷}} ] 通常以 比率&#xff08;如 3:1&#xff09; 或 百分…

關閉VSCode 自動更新

參考&#xff1a;關閉VSCode 自動更新_vscode關閉自動更新-CSDN博客 vscode的設置 Update: Mode Update: Enable Windows Background Updates Extensions: Auto Check Updates Extensions: Auto Update

Flask框架搭建

1、安裝Flask 打開終端運行以下命令&#xff1a; pip install Flask 2、創建項目目錄 在Windows上&#xff1a; venv\Scripts\activate 執行 3、創建 app.py 文件 可以在windows終端上創建app.py文件 &#xff08;1&#xff09;終端中創建 使用echo命令 echo "fr…

5G-A和未來6G技術下的操作系統與移動設備變革:云端化與輕量化的發展趨勢

目錄 5G技術帶來的革命性變革 云端化操作系統的實現路徑 完全云端化模式 過渡性解決方案 未來操作系統的發展方向 功能架構演進 安全機制強化 移動設備的形態變革 終端設備輕量化 物聯網設備簡化 實施挑戰與應對策略 技術挑戰 商業模式創新 總結與展望 5G技術作為…

【漫話機器學習系列】261.工具變量(Instrumental Variables)

工具變量&#xff08;Instrumental Variables&#xff09;通俗圖解&#xff1a;破解內生性困境的利器 在數據建模與因果推斷過程中&#xff0c;我們經常遇到一個棘手問題&#xff1a;內生性&#xff08;Endogeneity&#xff09;。它會導致模型估計產生偏差&#xff0c;進而誤導…