nextjs的服务端渲染(SSR)

news/2025/2/22 14:35:32/文章来源:https://www.cnblogs.com/newbieking/p/18730858

Next.js的SSR

在 Next.js 中,服务器端渲染(Server-Side Rendering,SSR)是一项核心特性,它允许在服务器端生成 HTML 内容,然后将其发送到客户端

1. 常用的客户端渲染(CSR)

传统的客户端渲染(CSR)应用在初始加载时,浏览器先加载一个空白的 HTML 页面,然后下载 JavaScript 文件,在客户端执行这些脚本后才渲染出页面内容。

2. 服务端渲染(SSR)

服务器端渲染是在服务器端就把页面的 HTML 内容生成好,直接发送给浏览器,浏览器可以立即显示页面内容。

3. 服务端渲染的优点

  • 更好的 SEO:搜索引擎爬虫可以直接读取服务器端生成的 HTML 内容,有利于提高网站在搜索引擎中的排名。
  • 更快的初始加载速度:用户可以更快地看到页面内容,减少白屏时间,提升用户体验。
  • 兼容性好:即使浏览器不支持 JavaScript,也能正常显示页面内容。

4. 使用getServerSideProps实现SSR

getServerSideProps是一个异步函数,它会在每次请求页面时在服务器端执行。在这个函数中,我们可以进行数据获取操作,然后将获取到的数据作为props返回给页面组件。

// pages/index.js
import React from 'react';const HomePage = ({ data }) => {return (<div><h1>Server-Side Rendered Page</h1><p>{data}</p></div>);
};export async function getServerSideProps() {// 模拟从API获取数据const res = await fetch('https://api.example.com/data');const data = await res.text();return {props: {data}};
}export default HomePage;

5. SSR的工作流程

  1. 客户端请求页面
  2. 服务器执行getServerSideProps获取所需数据
  3. 服务端渲染页面
  4. 服务端发送HTML到客户端
  5. 客户端的Next.js 会将客户端的 JavaScript 代码与服务器端生成的 HTML 进行水合,使页面具有交互性。

6. 减少SSR开销的方法

为了优化性能和减少服务器负载,可以采用缓存机制静态生成(SSG)这两种重要的技术手段

6.1 内存缓存

可以使用 Node.js 的全局变量或第三方库(如 lru-cache)来实现内存缓存

npm install lru-cache
// pages/index.js
import React from 'react';
import LRU from 'lru-cache';// 初始化 LRU 缓存,设置最大缓存项为 100
const cache = new LRU({ max: 100 });const HomePage = ({ data }) => {return (<div><h1>Server-Side Rendered Page with Cache</h1><p>{data}</p></div>);
};export async function getServerSideProps() {const cacheKey = 'exampleData';// 检查缓存中是否存在数据if (cache.has(cacheKey)) {const cachedData = cache.get(cacheKey);return {props: {data: cachedData}};}// 若缓存中不存在数据,则从 API 获取const res = await fetch('https://api.example.com/data');const data = await res.text();// 将获取到的数据存入缓存cache.set(cacheKey, data);return {props: {data}};
}export default HomePage;

6.2 使用HTTP协议缓存

可以通过设置响应头来利用浏览器和 CDN 的 HTTP 缓存。在 getServerSideProps中可以设置 revalidate 属性来实现增量静态再生(ISR)

export async function getServerSideProps() {const res = await fetch('https://api.example.com/data');const data = await res.text();return {props: {data},revalidate: 60 // 每 60 秒重新验证一次页面};
}

6.3 静态生成(SSG)

静态生成是指在构建时生成 HTML 文件,而不是在每次请求时动态生成。这使得页面可以直接从 CDN 提供,从而实现更快的加载速度和更好的性能。

6.3.1 getStaticProps

当页面内容在构建时就可以确定,并且不需要在每次请求时更新时,使用 getStaticProps

// pages/index.js
import React from 'react';const HomePage = ({ data }) => {return (<div><h1>Static Generated Page</h1><p>{data}</p></div>);
};export async function getStaticProps() {const res = await fetch('https://api.example.com/data');const data = await res.text();return {props: {data},// 可选:设置页面的重新验证时间(以秒为单位)revalidate: 60 };
}export default HomePage;

6.3.2 getStaticPaths

当使用动态路由(如 [id].js)时,需要使用 getStaticPaths 来指定哪些路径需要在构建时生成静态页面。

// pages/posts/[id].js
import React from 'react';const PostPage = ({ post }) => {return (<div><h1>{post.title}</h1><p>{post.content}</p></div>);
};export async function getStaticPaths() {const res = await fetch('https://api.example.com/posts');const posts = await res.json();const paths = posts.map((post) => ({params: { id: post.id.toString() }}));return { paths, fallback: false };
}export async function getStaticProps(context) {const id = context.params.id;const res = await fetch(`https://api.example.com/posts/${id}`);const post = await res.json();return {props: {post}};
}export default PostPage;

getStaticPaths 函数返回一个包含所有需要生成静态页面的路径数组 paths。

fallback 属性用于指定当访问未在构建时生成的路径时的行为:当 fallback 设置为 false 时,果用户尝试访问未在构建时生成的路径,Next.js 会返回 404 页面;当 fallback 设置为 true 时,Next.js 会立即返回一个占位页面给用户,同时在后台异步生成该页面的静态内容。生成完成后,页面会自动更新为完整的内容,并且后续对该路径的访问将直接返回预先生成的静态页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888010.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《ESP32-S3使用指南—IDF版 V1.6》第八章 MENUCONFIG菜单配置

第八章 MENUCONFIG菜单配置 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/es…

已安装TortoiseGit,但是文件夹不显示相关图标

问题原因:注册表图标显示太靠后了,只有前15个生效,排序该前就行项目文件夹右键->settings->Overlay Handlers->Start register editor->一下文件重命名,前面多加点空格,保证排名在前面就行->任务栏右键任务管理器->Windows资源管理器->右键重新启动-…

用一个静态图片实现出怪路线提示

用一个静态图片实现下面的效果

Windows平台调试器原理与编写01.调试框架

调试器原理与编写01.调试框架-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 调试框架 调试器最基本功能: 断点,单步 断点分为三类软件断点 硬件断点 内存断点window提供了一套机制,帮助用户来实现一套3环的调试器 事件驱动 : 窗口的各种操作(外在的想要对窗…

本地部署DeepSeek-R1-AWQ

一、部署环境准备 系统信息:主机名为 10-200-3-23 IP 地址为 10.200.3.23 操作系统为 ubuntu 22.04 配备 8 卡 A100。二、驱动与桥接器安装安装 gcc执行命令 apt-get update -y apt install build-essential -y安装驱动下载驱动 wget https://us.download.nvidia.com/tesla/…

k8s部署nfs+sc

1.下载软件包nfs-subdir-external-provisioner-4.0.18.tgz 该软件包内文件截图 修改values.yaml 在目录内执行 helm install nfs-provisioner -f values.yaml . #老重要了2.查看执行是否成功 3.测试是否成功 编写yaml apiVersion: v1kind: PersistentVolumeClaimmetadata…

P2661 [NOIP 2015 提高组] 信息传递——染色做法

原题 本来想当水题刷的,结果被水题刷了。。。70到80到90到100,必须写个题解记录一下(doge) 题目分析一句话:求一个无权有向图中的最短环路(确保有环) tip:每一个点出度为一,那么必然有环,以样例为例如下。思路没必要每轮模拟全部的传送,只看某一个人的传送过程: 就…

有哪些好用的AI工具?(你想要的AI工具都在这)

1. 常见应用场景 1.1. 国内通用大模型模型名称 简介 官网地址DeepSeek 深度求索公司研发的高性能开源模型,以低成本、高推理能力著称,支持数学、代码等复杂任务。 https://chat.deepseek.com/豆包 字节跳动开发的智能语言模型,基于深度学习技术,支持多种自然语言处理任务。…

Kubernetes 集群上部署 Open WebUI

在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek-r1:7b,这篇博文记录一下 Open WebUI 的部署。还是用 helm 部署,添加 open-webui 的 helm repo,准备 helm 清单文件,通过 helm 命令在 ai 命名空间下进行部署在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek…

2025.2.22

Hehe_0 模拟赛内容随笔 [NOIP2015]金币1 2 3 4 。。。1 2-3 4-6 7-10 。。。观察数据范围1e4,暴力就行,然后可以去思考优化版本 由于已经把规律给出来了,所以可以提前离线处理出来,如果数据过大,可以预处理每一次金币变化的天数,然后根据提问二分找区间然后求和。这种数…

充电桩功能扩展,解决桩企内存不足的问题

OCPP(开放充电点协议)1.6是电动汽车充电基础设施中广泛使用的通信标准。尽管OCPP 1.6为充电桩与中央管理系统(CSMS)之间的交互提供了基本功能,但由于OCPP主板的内存资源有限,其能够实现的功能也受到了一定的限制。为了解决这一问题,OCPP协议网关作为OCPP主板的扩展,能够…

Spring复习-AOP

AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思…