【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践
关于Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的实践内容方面,我们按下面几点进行阐述。
1. 原理
- 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面,然后发送给客户端。这使得用户在首次访问时能够看到一个完整的页面,而不是等待JavaScript加载后再显示内容。
- 客户端渲染 (CSR): 页面初始加载时通常是一个空壳或简单的HTML结构,所有内容通过JavaScript动态加载和渲染。
2. 构建方式
-
SSR:
getServerSideProps
: 用于在每个请求时获取数据,并在服务器端渲染页面。适用于需要频繁更新的数据。// pages/index.js export async function getServerSideProps(context) {const res = await fetch(`https://api.example.com/data`);const data = await res.json();return {props: {data,},}; }function HomePage({ data }) {return (<div><h1>Welcome to the Home Page</h1><p>Data: {JSON.stringify(data)}</p></div>); }export default HomePage;
getStaticProps
: 用于在构建时预渲染页面,并且可以设置定时重新验证以更新静态生成的页面。适用于不经常变化的数据。// pages/about.js export async function getStaticProps() {const res = await fetch(`https://api.example.com/static-data`);const data = await res.json();return {props: {data,},revalidate: 60, // 每60秒重新验证一次}; }function AboutPage({ data }) {return (<div><h1>About Us</h1><p>Data: {JSON.stringify(data)}</p></div>); }export default AboutPage;
getInitialProps
: 用于自定义服务器端渲染逻辑,但建议使用getServerSideProps
或getStaticProps
,因为它们提供了更好的性能和灵活性。
-
CSR:
- 初始页面加载后,通过API调用或从本地存储中获取数据,并使用React或其他前端框架进行渲染。
- 客户端需要支持JavaScript以正确显示页面内容。
// pages/profile.js import { useEffect, useState } from 'react';function ProfilePage() {const [data, setData] = useState(null);useEffect(() => {fetch('/api/profile').then((res) => res.json()).then((data) => setData(data));}, []);if (!data) {return <div>Loading...</div>;}return (<div><h1>Profile Page</h1><p>Name: {data.name}</p><p>Email: {data.email}</p></div>); }export default ProfilePage;
3. 性能
- SSR:
- 优点:
- 提供了更快的首屏加载时间,因为浏览器接收到的是完整的HTML页面。
- 改善用户体验,特别是对于网络条件较差的用户。
- 有利于SEO,搜索引擎可以直接读取到完整的HTML内容。
- 缺点:
- 每次请求都需要服务器处理,对于高并发场景可能造成性能瓶颈。
- 需要更多的服务器资源来处理请求。
- 优点:
- CSR:
- 优点:
- 一旦页面加载完成,后续的交互可以非常快,因为大部分工作由客户端承担。
- 适合单页应用(SPA),提供流畅的用户体验。
- 缺点:
- 初始加载时间较长,特别是当应用依赖于大量JavaScript资源时。
- 对于低性能设备或网络条件较差的用户,体验可能不佳。
- 优点:
4. 安全
- SSR:
- 更容易实现SEO优化,因为搜索引擎可以直接读取到完整的HTML内容。
- 可以在服务器端对敏感操作进行安全检查,如身份验证、权限控制等。
- 减少XSS攻击的风险,因为大部分内容是在服务器端生成的。
- CSR:
- 对于一些需要即时响应的应用来说,安全性可能更高,因为很多逻辑可以在客户端执行。
- 但同时,也需要更加小心地处理客户端的安全问题,如XSS攻击、CSRF攻击等。
- 需要确保API的安全性,防止未授权访问。
5. 学习成本
- SSR:
- 需要了解服务器端编程以及如何处理异步数据获取。
- 如果使用Next.js,学习曲线相对较低,因为它提供了许多内置功能来简化开发过程。
- 需要熟悉Node.js环境和服务器配置。
- CSR:
- 主要集中在前端技术栈的学习,如React、Vue等。
- 对于初学者来说,可能更容易上手,尤其是那些已经熟悉JavaScript和现代前端框架的人。
- 不需要深入了解服务器端编程,但需要掌握前端状态管理和路由管理。
6. 优势
- SSR:
- 良好的SEO表现。
- 更快的首屏加载速度。
- 支持更复杂的业务逻辑直接在服务器端处理。
- 适合需要频繁更新数据的应用。
- CSR:
- 优秀的用户体验,特别是在单页应用(SPA)中。
- 更加灵活的数据更新机制。
- 简化了前后端分离的架构设计。
- 适合需要复杂交互的应用。
7. 监测
- SSR:
- 可以利用传统的Web日志分析工具来监控服务器性能。
- 需要注意服务器负载和响应时间。
- 使用工具如New Relic、Datadog等进行性能监控。
- CSR:
- 侧重于前端性能监测,如页面加载时间、JavaScript执行效率等。
- 可以使用Google Lighthouse等工具来进行综合评估。
- 使用工具如Sentry、LogRocket等进行错误跟踪和用户体验监控。
8. 最佳实践
-
SSR:
- 减少服务器端渲染的内容:只渲染必要的部分,避免不必要的计算和数据传输。
- 合理使用缓存策略:使用
getStaticProps
结合revalidate
选项来实现静态生成并按需更新。 - 优化图片和其他静态资源的加载:使用CDN、压缩图片、懒加载等技术。
- 避免阻塞渲染:确保关键路径上的资源尽快加载,例如CSS和JavaScript文件。
- 代码分割:将代码分割成多个小块,按需加载,提高性能。
// next.config.js module.exports = {experimental: {modern: true,},webpack(config) {config.optimization.splitChunks({chunks: 'all',});return config;}, };
-
CSR:
- 实现懒加载组件:只有当它们进入视口时才加载。
// components/LazyImage.js import { useEffect, useState } from 'react';function LazyImage({ src, alt }) {const [isLoaded, setIsLoaded] = useState(false);useEffect(() => {const img = new Image();img.src = src;img.onload = () => setIsLoaded(true);}, [src]);return isLoaded ? <img src={src} alt={alt} /> : null; }export default LazyImage;
- 使用代码分割:减少初始加载时间。
// pages/lazy-loaded-page.js import dynamic from 'next/dynamic';const DynamicComponent = dynamic(() => import('../components/DynamicComponent'), {ssr: false, });function LazyLoadedPage() {return (<div><h1>Lazy Loaded Page</h1><DynamicComponent /></div>); }export default LazyLoadedPage;
- 优化JavaScript打包大小:去除不必要的库和代码。
// package.json "scripts": {"analyze": "cross-env ANALYZE=true next build" }
- 使用性能分析工具:如Webpack Bundle Analyzer来分析和优化打包结果。
npm run analyze
- 实现懒加载组件:只有当它们进入视口时才加载。
9. 结合使用
- 在实际项目中,通常会根据需求结合使用SSR和CSR。例如,首页和其他重要页面可以采用SSR以提供更好的SEO和初始加载体验;而其他交互性较强的部分则可以使用CSR来提高用户体验。
- 混合模式:在同一个页面中,可以部分使用SSR,部分使用CSR。
// pages/mixed-mode.js import { useEffect, useState } from 'react';export async function getServerSideProps(context) {const res = await fetch(`https://api.example.com/initial-data`);const initialData = await res.json();return {props: {initialData,},}; }function MixedModePage({ initialData }) {const [dynamicData, setDynamicData] = useState(initialData);useEffect(() => {fetch('/api/dynamic-data').then((res) => res.json()).then((data) => setDynamicData(data));}, []);return (<div><h1>Mixed Mode Page</h1><p>Initial Data: {JSON.stringify(initialData)}</p><p>Dynamic Data: {JSON.stringify(dynamicData)}</p></div>); }export default MixedModePage;
总结
通过上述详细说明和示例代码,我们可以更好地理解Next.js中的服务器端渲染(SSR)与客户端渲染(CSR)的区别及其最佳实践。选择合适的渲染方式取决于具体的应用场景和需求。在实际开发中,通常会结合使用两种方式,以达到最佳的性能和用户体验。此外,通过合理的架构设计、代码优化和性能监控,可以进一步提升应用的整体质量和用户体验。
相关文章:
【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践
关于Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的实践内容方面,我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面,然后发送给客户端。这使得用户在首次访问时能够…...
路径规划之启发式算法之一:A-Star(A*)算法
A*算法是一种启发式搜索算法,常用于解决路径规划问题。 一、A*算法的定义与原理 A*算法是一种用于在图形或网格中查找最短路径的算法。它在搜索过程中综合考虑了每个节点的实际距离(g值)和预估距离(h值),以…...
Android复习代码1-4章
public class RudioButton extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rudio_button);// 找到RadioGroup和TextView的实例RadioGroup radioGrou…...
【问题】webdriver.Chrome()设置参数executable_path报不存在
场景1: 标红报错unresolved reference executable_path 场景2: 执行报错TypeError: __init__() got an unexpected keyword argument executable_path 原因: 上述两种场景是因为selenium4开始不再支持某些初始化参数。比如executable_path 解决: 方案…...
win10系统安装docker-desktop
1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术,它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…...
小程序-基于java+SpringBoot+Vue的乡村研学旅行平台设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
组件A底部栏(position: fixed )事件使用$emit更新内容失败bug解决
今天遇到一个很离奇的bug,记录一下 问题:在组件内底部栏使用$emit触发按钮事件但打印出来的值是初始化的值,更新的值被重置导致更新失败 原因:组件内底部使用了 position: fixed; 固定, 导致组件内插槽 this 与 保存按…...
数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!
文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序,使用栈的数据结构非递归实现快排,优化快排(三路…...
C++的类功能整合
1. 类的基本概念 类是面向对象编程的核心,它封装了数据和操作数据的函数。 #include <iostream> using namespace std;class MyClass { public:int publicData;void publicFunction() {cout << "Public function" << endl;}private:i…...
《String类》
目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法:按照字典序比较 4.1.3 int compareTo(Strin…...
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
Window 安装 Nginx
参考链接 Windows 环境nginx安装使用及目录结构详解_windows 安装nginx-CSDN博客 Nginx 安装及配置教程(Windows)【安装】_nginx下载安装-CSDN博客 安装 1)下载 nginx: download 2)解压 3)启动 3.1)方…...
replace (regexp|substr, newSubstr|function)替换字符串中的指定部分
replace 方法用于替换字符串中的指定部分。它可以接受一个子字符串或正则表达式作为第一个参数,第二个参数是替换的内容。 用法示例 基本替换 let str "Hello, world!"; let newStr str.replace("world", "everyone"); console.lo…...
【ROS2】Ubuntu22.04安装ROS humble
一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。ROS的核心思想就是将机器人的软件功能做…...
cesium 3Dtiles变量
原本有一个变亮的属性luminanceAtZenith,但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…...
配置泛微e9后端开发环境
配置泛微e9的后端开发环境 1.安装jdk1.8(请自行安装并设置环境变量) 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…...
【Stable Diffusion】安装教程
目录 一、python 安装教程 二、windows cuda安装教程 三、Stable Diffusion下载 四、Stable Diffusion部署(重点) 一、python 安装教程 (1)第一步下载 打开python下载页面,找到python3.10.9,点击右边…...
USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验
在追求高效与便捷的时代,启明智显USB Type-C一线通扩展屏方案正以其独特的优势,成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性,更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡ÿ…...
【力扣】541.反转字符串2
问题描述 思路解析 每当字符达到2*k的时候,判断,同时若剩余字符>k,只对前k个进行判断(这是重点)因为字符串是不可变变量,所以将其转化为字符串数组,最后才将结果重新转变为字符串 字符串->字符数组 …...
什么是防抖与节流
防抖(Debouncing)与节流(Throttling) 在前端开发中,尤其是在处理用户输入、窗口调整大小、滚动事件等高频率触发的事件时,防抖和节流是两种常用的技术手段。它们可以帮助我们优化性能,减少不必…...
springboot vue 开源 会员收银系统 (12)购物车关联服务人员 订单计算提成
前言 完整版演示 http://120.26.95.195/ 开发版演示 http://120.26.95.195:8889/ 在之前的开发进程中,我们完成订单的挂单和取单功能,今天我们完成购物车关联服务人员,用户计算门店服务人员的提成。 1.商品关联服务人员 服务人员可以选择 一…...
FFmpeg 推流给 FreeSWITCH
FFmpeg 推流,貌似不难,网上有很多资料, 接到一个任务,推流给 FreeSWITCH,最开始以为很容易, 实则不然,FreeSWITCH uuid_debug_media <uuid>, 一直没人任何反应 仔细一查,Fr…...
.npmrc文件的用途
.npmrc 文件是 npm(Node.js 的包管理工具)用于配置项目或用户的设置文件。它可以存储与 npm 相关的配置信息,如注册表地址、认证信息、代理设置、安装路径等。.npmrc 文件可以出现在不同的地方,具有不同的作用范围,通常…...
C++游戏开发入门:如何从零开始实现自己的游戏项目?
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C游戏开发的相关内容! 关于【…...
Redis设计与实现第16章 -- Sentinel 总结1(初始化、主从服务器获取信息、发送信息、接收信息)
Sentinel是Redis的高可用解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主…...
Windows10+VirtualBox+Ubuntu:安装虚拟机VirtualBox,虚拟机中安装Ubuntu
一、需求 在Windows10系统中,安装虚拟机VirtualBox,VirtualBox中安装Ubuntu桌面版。 二、环境准备 系统环境 Windows10 内存:8G 虚拟化 虚拟机的运行,如果需要Windows系统开启虚拟化,可以通过BIOS设置。 “虚拟…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
C底层 函数栈帧
文章目录 一,什么是寄存器 二,栈和帧 前言 我们在学习c语言程序的时候,是不是有很多的疑问,如 1,为什么形参不可以改变实参 2,为什么我们编写程序的时候会出现烫烫烫......这个乱码 3,那些局…...
【模块一】kubernetes容器编排进阶业务容器化案例
Kubernetes 实战案例 Kubernetes实战案例-规划(基于nerdctl buildkitdcontainerd构建容器镜像) 业务容器化优势: ① 提高资源利用率、节约部署IT成本。 ② 提高部署效率,基于kubernetes实现微服务的快速部署与交付、容器的批量调度与秒级启动。 ③…...
可视化建模以及UML期末复习篇----相关软件安装
作为一个过来人,我的建议是别过来。 一、可视化建模 <1>定义: 官方:一种使用图形符号来表示系统结构和行为的建模技术。 我:其实说白了就是把工作流程用图形画出来。懂不? <2>作用: 提高理解和分析复杂系统的能力。促…...
免费发布信息网站大全注册/英文seo外链发布工具
2019独角兽企业重金招聘Python工程师标准>>> 环境说明 程序版本JRE1.8Tomcat7.0maven3.1.1Intellij IDEA14.0.3一、新建一个Project ★ 打开IDEA,Create New Project ★ 通过Maven建立Project,但不使用模板 ★ 填写Project相关命名࿰…...
教室室内设计平面图/台州网站优化公司
1.介绍(Introduction) 1.1 为什么要有编码规范(WhyHave Code Conventions) 编码规范对于程序员而言尤为重要,有以下几个原因: - 一个软件的生命周期中,80%的花费在于维护 - 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 - 编码规范可以改善软件…...
淄博网站建设淄博/福州百度开户多少钱
题目 给出一棵带边权的树,求一个排列\(p\),使得\(\sum_{i1}^{n}{dis(i, p_i)}\)的值最大,其中\(dis(v, u)\)表示\(v\)到\(u\)的距离。 算法 这题的思路非常巧妙,又是和重心有关的题目!记得ydc的大树这题的ydc的做法有异…...
网站改版思路/网站推广包括
所需依赖org.bouncycastlebcprov-jdk15on1.65true加解密工具类/*** 国密SM4加解密** author zhangjian* date 2020-11-05*/public class SM4Helper {static {//加入BouncyCastleProvider的支持 BouncyCastle->开源密码包,扩充密码算法支持Security.addProvider(n…...
网站制作小常识/网站推广优化是什么意思
研究xcat时随手用RHEL6.2搭了DNS,却发现本地域名正常却无法解析外部域名,日志里报错 Jan 7 09:04:50 xCat named[3163]: error (no valid RRSIG) resolving cn/DS/IN: 202.106.0.20#53 Jan 7 09:04:50 xCat named[3163]: error (no valid RRSIG) resol…...
为什么做域名跳转网站样式不见了/seo优化 搜 盈seo公司
字符串格式符: 符 号 描述 %c 格式化字符及其ASCII码 %s 格式化字符串 %d 格式化整数 %u 格式化无符号整型 %o 格式化无符号八进制数 %x 格式化无符号十六进制数 %X 格式化无符号十六进制数(大写) %f 格式化浮点数ÿ…...