当前位置: 首页 > news >正文

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 CRACSR
Next.js SSR服务端渲染
Next.js SSG静态生成非常快
Next.js ISR静态 + 动态混合快且智能
http://www.xdnf.cn/news/489727.html

相关文章:

  • Dify中使用插件LocalAI配置模型供应商报错
  • Spring Cloud深度实践:从服务发现到弹性智能API网关全景解析
  • Day29 -JS开发02 -两个实例:dom树(存在dom-xss) 加密及基础的js逆向(明文加密)
  • SAP-ABAP:SAP DMS(文档管理系统)的详细说明,涵盖其核心功能、架构、配置及实际应用
  • spring学习->sprintboot
  • Room数据库
  • Matrix-Game:键鼠实时控制、实时生成的游戏生成模型(论文代码详细解读)
  • Java并发编程-线程池(四)
  • Reth(冗余以太网接口) 和Bridge-Aggregation(链路聚合接口)区别
  • 一个进程中可以有多个 WebView2 控件,它们各自有独立的用户数据目录,COOKIE共享
  • 内存泄漏系列专题分析之十六:高通相机CamX内存泄漏内存占用分析--chi-cdk部分ION内存拆解方法
  • 跳转传参的使用
  • Java生产环境设限参数教学
  • 第六章 进阶10 实习生的焦虑
  • 一文讲透面向对象编程OOP特点及应用场景
  • 深入探索Java微服务架构:Spring Cloud与Kubernetes的整合实践
  • 敏感数据加密和模糊匹配
  • 使用CherryStudio +SiliconFlow 部署独立的deepseek+知识库
  • 文本数据词汇级增强
  • Python 之类型注解
  • MCU开发学习记录16* - 看门狗学习与实践(HAL库) - IWDG与WWDG -STM32CubeMX
  • java加强 -IO流
  • 基于React的高德地图api教程005:圆形标记的绘制、删除、修改
  • 【AI学习】AI大模型技术发展研究月报的生成提示词
  • 【Linux】序列化与反序列化、会话与进程组、守护进程
  • 投影仪基础知识及选购方向小记③
  • 曝光融合(Exposure Fusion)
  • 【大模型系列篇】驱动编码助手Cursor与Windsurf工作的隐藏算法解读
  • 小结:jvm 类加载过程
  • 车道线检测----Lane-ATT