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

next实现原理

Next.js 是一个基于 React 的 服务器端渲染(SSR)静态生成(SSG) 框架,它的实现原理涉及多个关键技术点,包括 服务端渲染(SSR)静态生成(SSG)客户端渲染(CSR)增量静态再生(ISR)API 路由 等。


1. Next.js 核心实现原理

1.1. 页面预渲染(SSR 和 SSG)

Next.js 通过 预渲染(Pre-rendering) 提前生成 HTML,而不是像 React 传统的客户端渲染那样在浏览器中执行 JavaScript 后再渲染。

(1) 服务器端渲染(SSR)
  • 函数getServerSideProps
  • 原理
    • 每次请求都会在服务器上执行 getServerSideProps,返回数据后再渲染 HTML。
    • 适用于需要实时数据的页面(如用户个性化页面、动态数据请求)。
    • 示例
      export async function getServerSideProps(context) {const res = await fetch('https://api.example.com/data');const data = await res.json();return { props: { data } };
      }
      
    • 流程
      1. 用户请求页面。
      2. Next.js 服务器执行 getServerSideProps 获取数据。
      3. 服务器返回 HTML,浏览器解析并显示。
(2) 静态生成(SSG)
  • 函数getStaticProps
  • 原理
    • 构建时(Build Time) 预先生成 HTML。
    • 适用于数据不频繁变化的页面(如博客文章、文档)。
    • 示例
      export async function getStaticProps() {const res = await fetch('https://api.example.com/data');const data = await res.json();return { props: { data } };
      }
      
    • 流程
      1. next build 阶段预渲染 HTML。
      2. 访问时直接返回 HTML,速度极快。
(3) 增量静态再生(ISR)
  • 函数getStaticProps + revalidate
  • 原理
    • 在 SSG 基础上,支持 定期重新生成 页面,不需要重新部署。
    • 示例
      export async function getStaticProps() {const res = await fetch('https://api.example.com/data');const data = await res.json();return { props: { data }, revalidate: 10 }; // 10秒后重新生成
      }
      
    • 流程
      1. 初次访问使用缓存的 HTML。
      2. revalidate 时间后,Next.js 触发 后台再生(不会影响当前用户)。
      3. 重新生成 HTML 并更新缓存。

2. Next.js 的路由机制

2.1. 文件系统路由

  • 通过 pages 目录自动生成路由:
    pages/
    ├── index.tsx      # 访问 `/`
    ├── about.tsx      # 访问 `/about`
    ├── blog/
    │   ├── index.tsx  # 访问 `/blog`
    │   ├── [id].tsx   # 动态路由 `/blog/:id`
    
  • 动态路由
    function BlogPost({ id }) {return <h1>Blog Post {id}</h1>;
    }export async function getStaticPaths() {return {paths: [{ params: { id: '1' } }, { params: { id: '2' } }],fallback: false,};
    }export async function getStaticProps({ params }) {return { props: { id: params.id } };
    }
    
    原理
    • getStaticPaths 预定义可能的路由。
    • getStaticProps 预取数据并生成静态页面。

3. 数据获取方式

Next.js 提供 四种 数据获取方式:

方法执行时机适用场景
getStaticProps构建时(Build Time)静态页面(如博客、文档)
getServerSideProps请求时(Request Time)需要实时数据(如用户个性化页面)
getStaticPaths构建时(Build Time)预定义动态路由(如博客详情)
API 路由 (pages/api)服务器端 API处理后端请求,如数据库交互

4. API 路由

  • Next.js 允许创建 API 端点,无需额外搭建后端:
    pages/api/
    ├── hello.ts  # 访问 `/api/hello`
    
  • 示例
    export default function handler(req, res) {res.status(200).json({ message: "Hello from API" });
    }
    
  • 应用
    • 作为 BFF(Backend For Frontend),连接数据库或第三方 API。

5. 中间层架构

Next.js 既可以:

  • 作为 前端框架(纯前端渲染)。
  • 作为 后端服务器(支持 API 和 SSR)。
  • 通过 边缘计算(Edge Functions) 实现更快的响应。

6. Next.js 的优化

6.1. 自动代码拆分

  • 只加载 当前页面 需要的代码,减少初次加载时间。
  • 通过 动态导入(dynamic import) 进一步优化:
    import dynamic from "next/dynamic";
    const HeavyComponent = dynamic(() => import("../components/Heavy"), { ssr: false });
    

6.2. 图片优化

  • 内置 next/image 组件,自动 懒加载CDN 加速
    import Image from 'next/image';<Image src="/logo.png" width={200} height={100} alt="Logo" />
    

6.3. SEO 友好

  • next/head 提供 自定义 Meta 标签
    import Head from 'next/head';function HomePage() {return (<><Head><title>My Next.js App</title><meta name="description" content="Next.js is awesome!" /></Head><h1>Welcome to Next.js</h1></>);
    }
    

总结

功能Next.js 方案作用
SSRgetServerSideProps实时数据,适用于动态页面
SSGgetStaticProps预渲染静态页面,适用于博客、文档
ISRrevalidate静态+动态结合,适用于经常变更但无需实时的页面
APIpages/api服务器端 API,后端功能
动态路由[id].tsx生成动态页面
图片优化next/image自动懒加载、CDN
代码拆分dynamic import仅加载必要代码

Next.js 通过 SSR、SSG、ISR、API 路由等功能,大大提高了 渲染性能、SEO 友好性和开发体验,是现代 Web 开发的首选框架之一。 🚀

相关文章:

next实现原理

Next.js 是一个基于 React 的 服务器端渲染&#xff08;SSR&#xff09; 和 静态生成&#xff08;SSG&#xff09; 框架&#xff0c;它的实现原理涉及多个关键技术点&#xff0c;包括 服务端渲染&#xff08;SSR&#xff09;、静态生成&#xff08;SSG&#xff09;、客户端渲染…...

LeetCode 热题 100 53. 最大子数组和

LeetCode 热题 100 | 53. 最大子数组和 大家好&#xff0c;今天我们来解决一道经典的算法题——最大子数组和。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求我们找出一个具有最大和的连续子数组&#xff0c;并返回其最大和。下面我将详细讲解解题思路&#xff0c;并…...

DeepSeek 与大数据治理:AI 赋能数据管理的未来

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在当今数字化时代&#xff0c;数据已成为企业和机构的重要资产&#xff0c;而大数据治理&#xff08;Big Data Governan…...

【时时三省】(C语言基础)浮点型数据

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 浮点型数据 浮点型数据是用来表示具有小数点的实数的&#xff0c;为什么在C中把实数称为浮点数呢?在C语言中&#xff0c;实数是以指数正式存放在在储单元中的。一个实数表示为指数可以有不…...

【大模型】Ollama本地部署DeepSeek大模型:打造专属AI助手

【大模型】Ollama本地部署DeepSeek大模型&#xff1a;打造专属AI助手 Ollama本地部署DeepSeek大模型&#xff1a;打造专属AI助手一、Ollama简介二、硬件需求三、部署步骤1. 下载并安装Ollama&#xff08;1&#xff09;访问Ollama官网&#xff08;2&#xff09;安装Ollama 2. 配…...

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊&#xff1a; Water Resource…...

数据集笔记:新加坡 地铁(MRT)和轻轨(LRT)票价

数据连接 data.gov.sg 2024 年 12 月 28 日起生效的新加坡地铁票价 该数据集包含 MRT 和 LRT 票价的信息&#xff0c;包括&#xff1a; 票价类型&#xff08;Fare Type&#xff09;&#xff1a;成人票、学生票、老年人票、残障人士票等。适用时间&#xff08;Applicable Tim…...

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?

TSINGSEE青犀推出的智能分析网关V4&#xff0c;是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器&#xff0c;主频可高达2.3GHz&#xff0c;INT8峰值算力更是达到了惊人的17.6Tops。此外&#xff0c;该硬件还预装了近40种AI算法模型&#xf…...

Java 大视界 -- 基于 Java 的大数据分布式缓存一致性维护策略解析(109)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题&#xff0c;报错说参数位置不正确 修改代码后&#xff0c;运行如下图&#xff1a; 结果&#xff1a; 希望各位也能顺利解决问题&#xff0c;祝你好运&#xff01;...

Ruby基础

一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串&#xff0c;并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串&#xff0c;&#xff08;&#xff09;内可以是任何数&#xff0c;自动转义双引号%Q("aaaaa"…...

JMeter 断言最佳实践

JMeter 断言最佳实践 一、引言 在使用 JMeter 进行性能测试或功能测试时&#xff0c;断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期&#xff0c;确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践&#xff…...

【Android】类加载器热修复-随记(二)

1. 背景 在【Android】类加载器&热修复-随记一文中了解了类加载,要完成完整的热修复过程,我们需要构建出差量jar包。而这构建差量包分为两个步骤: 原包,注解解析和插桩;变更后,差量包构建;在这两步过程中会涉及到较多的字节码操作,这里我们需要了解下。我们都听过…...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表

简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…...

Linux网络 TCP全连接队列与tcpdump抓包

TCP全连接队列 在 Linux 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…...

水滴tabbar canvas实现思路

废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…...

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中&#xff0c;某个文件的右下角有一把锁的标志是什么意思&#xff1f; 在 Ubuntu&#xff08;或其他基于 GNOME 文件管理器的 Linux 发行版&#xff09;中&#xff0c;文件或文件夹的右下角出现一把“锁”标志&#xff0c;通常表示 你当前的用户没有该文件/文件夹的写…...

7.1.1 计算机网络的组成

文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统&#xff0c;便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…...

使用 Docker 部署 RabbitMQ 的详细指南

使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中&#xff0c;消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。本文将详细介绍如何使用 Docker 部署 RabbitMQ&#xf…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...