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

万字长文解析:深入理解服务端渲染(SSR)架构与全栈实践指南

一、SSR核心原理深度剖析

1.1 技术定义与演进历程

服务端渲染(Server-Side Rendering)指在服务器端完成页面DOM构建的技术方案。其发展历程可分为三个阶段:

阶段时期典型技术
传统SSR2000-2010JSP/PHP
现代SSR2015-2020Next.js/Nuxt.js
混合渲染2020-至今Qwik/Astro

1.2 核心工作流程解析

Client Server DB HTTP Request Data Query Return Data Render HTML Full HTML Hydration Client Server DB

1.3 原生Node.js实现示例

const express = require('express');
const React = require('react');
const { renderToString } = require('react-dom/server');const app = express();// 服务端路由处理
app.get('/ssr-demo', (req, res) => {const reactApp = renderToString(<App />);const htmlTemplate = `<!DOCTYPE html><html><head><title>SSR Demo</title><script defer src="/static/client.bundle.js"></script></head><body><div id="root">${reactApp}</div></body></html>`;res.send(htmlTemplate);
});app.listen(3000, () => {console.log('SSR Server running on port 3000');
});

二、SSR与CSR性能对比实测

2.1 Lighthouse性能指标对比

指标SSR方案CSR方案提升幅度
FCP1.2s3.8s316%
TTI2.1s1.9s-9.5%
SEO评分9865+33分

2.2 首屏加载过程对比

客户端渲染(CSR)流程:

  1. 请求HTML文档
  2. 下载JS Bundle
  3. 执行React/Vue框架
  4. 发起API请求
  5. 渲染DOM

服务端渲染(SSR)流程:

  1. 请求HTML文档
  2. 返回完整DOM结构
  3. 并行下载JS/CSS
  4. 执行Hydration

三、多框架SSR实现方案对比

3.1 主流框架支持情况

框架,类型,SSR方案, hydration方式,流式渲染
Next.js,React,内置,渐进式 hydration,支持
Nuxt.js,Vue,内置,组件级 hydration,支持
Angular Universal,Angular,独立包,整体 hydration,不支持
SvelteKit,Svelte,内置,选择性 hydration,支持

3.2 Next.js深度实践

3.2.1 应用目录结构

/my-app
├── app
│   ├── layout.tsx
│   ├── page.tsx
│   └── api
│       └── data/route.ts
├── public
│   └── static
└── package.json

3.2.2 服务端组件示例

// app/page.tsx
async function fetchData() {const res = await fetch('https://api.example.com/data');return res.json();
}export default async function Page() {const data = await fetchData();return (<main><h1>{data.title}</h1><p>{data.content}</p></main>)
}

四、生产环境部署方案

4.1 高性能部署架构

               +-----------------+|   CDN Edge      ||   (缓存HTML)     |+--------+--------+|+--------v--------+|  Load Balancer  |+--------+--------+|+---------------+---------------+|               |               |
+-------v-------+ +-----v------+ +------v------+
|  Node.js      | | Node.js    | | Node.js    |
|  SSR Server   | | SSR Server | | SSR Server |
+---------------+ +------------+ +------------+

4.2 缓存策略配置

# Nginx配置示例
location / {proxy_cache ssr_cache;proxy_pass http://ssr_backend;proxy_cache_valid 200 302 10m;proxy_cache_key "$scheme$request_method$host$request_uri";add_header X-Cache-Status $upstream_cache_status;
}

五、企业级最佳实践

5.1 性能优化方案

  • 组件级缓存:对静态组件实施LRU缓存
  • 流式传输:使用renderToNodeStream提升TTFB
  • 客户端预取:通过<link rel="preload">预加载资源

5.2 错误处理机制

// 全局错误边界
class SSRErrorBoundary extends React.Component {componentDidCatch(error) {sendErrorToMonitoring(error);this.setState({ hasError: true });}render() {if (this.state.hasError) {return <FallbackUI />;}return this.props.children; }
}

六、技术选型指南

6.1 选型决策树

Yes
No
Yes
No
React
Vue
Angular
需要SEO?
选择SSR
需要即时交互?
选择CSR
SSG静态生成
技术栈?
Next.js
Nuxt.js
Angular Universal

6.2 推荐方案矩阵

场景推荐方案核心优势
电商详情页Next.js + CDN缓存SEO友好 + 高并发承载
管理后台Vite + CSR开发效率高 + 交互流畅
文档站点Astro + 部分SSR按需水合 + 极速加载
高交互Web应用Qwik + 延迟加载瞬时交互 + 极低TTI

高频问题解答

Q:SSR如何实现用户状态同步?
A:推荐采用Cookie + 服务端状态注入方案:

// 服务端获取状态
const cookies = parseCookies(req);
const store = createStore({ user: cookies.user });// 客户端同步
window.__INITIAL_STATE__ = ${JSON.stringify(store.getState())};

Q:如何处理SSR中的异步依赖?
A:使用@loadable/component实现按需加载:

import loadable from '@loadable/component';const AsyncComponent = loadable(() => import('./HeavyComponent'), {fallback: <Loading />
});

相关文章:

万字长文解析:深入理解服务端渲染(SSR)架构与全栈实践指南

一、SSR核心原理深度剖析 1.1 技术定义与演进历程 服务端渲染&#xff08;Server-Side Rendering&#xff09;指在服务器端完成页面DOM构建的技术方案。其发展历程可分为三个阶段&#xff1a; 阶段时期典型技术传统SSR2000-2010JSP/PHP现代SSR2015-2020Next.js/Nuxt.js混合渲…...

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中&#xff0c;我们熟悉了Spring声明式事务的AOP原理&#xff0c;以及事务执行的大体流程。 本文中&#xff0c;介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中&#xff0c;我们将结合案例&#xff0c;来讲解实战中有关事务的易…...

SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)

目录 一、引言二、集成ToolContext示例步骤1: 在`@Tool`标注的工具方法中集成`ToolConext`参数步骤2:`ChatClient`运行时动态设置`ToolContext`参数三、填坑一、引言 在使用AI大模型的工具调用机制时,工具参数都是由大模型解析用户输入上下文获取的,由大模型提供参数给本地…...

本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6

部署MindSearch到 hugging face Spaces上——L2G6 任务1 在 官方的MindSearch页面 复制Spaces应用到自己的Spaces下&#xff0c;Space 名称中需要包含 MindSearch 关键词&#xff0c;请在必要的步骤以及成功的对话测试结果当中 实现过程如下&#xff1a; 2.1 MindSearch 简…...

MyBatis Plus扩展功能

一、代码生成器 二、逻辑删除 三、枚举处理器 像状态字段我们一般会定义一个枚举&#xff0c;做业务判断的时候就可以直接基于枚举做比较。但是我们数据库采用的是int类型&#xff0c;对应的PO也是Integer。因此业务操作时必须手动把枚举与Integer转换&#xff0c;非常麻烦。 …...

深度学习之自然语言处理CBOW预测及模型的保存

自然语言处理CBOW预测及模型的保存 目录 自然语言处理CBOW预测及模型的保存1 自然语言处理1.1 概念1.2 词向量1.2.1 one-hot编码1.2.2 词嵌入1.2.3 常见的词嵌入模型 2 CBOW预测模型搭建2.1 数据及模型确定2.1.1 数据2.1.2 CBOW模型2.1.3 词嵌入降维 2.2 数据预处理2.3 模型搭建…...

qt项目配置部署

Test项目: 子项目testFileHelper 1.新建一个test项目的子项目:取名testFileHelper 2.编写测试用例 3.pro文件中引入qosbrowser 4.引入测试对象的cpp和头文件 2.在项目中引入资源文件testfile.txt,在其中输入abc 实现thrid目录复用 移动thrid 将thrild目录统一放在章…...

java方法学习

java 方法 在Java中&#xff0c;方法是类&#xff08;或对象&#xff09;的行为或功能的实现。&#xff08;一起实现一个功能&#xff09;java的方法类似于其他语言的函数&#xff0c;是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…...

基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)

第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示&#xff1a; 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台&#xff0c;所以对信息的安全和稳定要求非常高。为了解决本问题&#xff0c;采用前端…...

解析CV/多模态算法的要点及技术特点,弥补单模态信息不足的多模态应用的哪些场景中?

CV&#xff08;计算机视觉&#xff09;多模态算法是计算机科学领域的重要研究方向&#xff0c;融合了多种模态的数据来提升对视觉信息的理解和处理能力。 以下是一个结合自动驾驶行业的多模态大模型算法示例&#xff0c;采用特征级融合策略&#xff0c;结合摄像头图像和激光雷…...

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…...

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 VMware 开源&#xff0c;其通过添加一些企业必需的功能特性&#xff0c;例…...

Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)

------★Python练手项目源码★------- Python项目32&#xff1a;订单销售额管理系统1.0&#xff08;TkinterCSV&#xff09; Python项目31&#xff1a;初学者也能看懂的聊天机器人1.0源码&#xff08;命令行界面Re正则表达式&#xff09; Python项目源码30&#xff1a;待办事…...

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…...

SpringBoot3中跨域问题解决

问题 SpringBoot3 中处理跨域请求 异常 浏览器在 localhost:3000 地址请求后端 http://127.0.0.1:8080 时, 报错提示 CORS 问题. 默认使用 Get 请求正常, 其他会提示. 使用 SpringBoot 3.4.2 版本配合 SpringSecurity 配置 Access to fetch at http://127.0.0.1:8080/todo-…...

kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题

一、问题描述和分析 结构体的字段的属性为静态&#xff0c; 意味着该类的所有对象共享同一个属性&#xff0c;所以尽管集合里存的是不同的对象&#xff0c;但是对象的属性还是同一个值 修改其中任何一个&#xff0c;其他的也会“被修改”。使用kotlin语言时候&#xff0c;经常…...

力扣-回溯-51 N皇后

思路 在棋盘上放皇后在回溯方法的树上来说&#xff0c;深度就是每一行放的皇后&#xff0c;宽度就是for循环里遍历放皇后&#xff0c;还有个问题是需要判断当前位置是否允许放皇后 代码 class Solution { public:vector< vector<string> > result;vector<str…...

flink-cdc同步数据到doris中

1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题&#xff0c;因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…...

Git命令行入门

诸神缄默不语-个人CSDN博文目录 之前写过一篇VSCode Git的博文&#xff1a;VSCode上的Git使用手记&#xff08;持续更新ing…&#xff09; 现在随着开发经历增加&#xff0c;感觉用到命令行之类复杂功能的机会越来越多了&#xff0c;所以我专门再写一篇Git命令行的文章。 G…...

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...

关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明

1. 问题描述 BK3633 SDK 版本&#xff1a;BK3633_DesignKit_V06_2310 使用 BK3633 UART2 与指纹模块进行通讯&#xff0c;为了降低功耗&#xff0c;通过 GPIO 控制了指纹模块的供电电源。但每次给整个系统板子上电时&#xff0c;BK3633 很大概率会实际而无法正常运行程序&…...

Redis7——基础篇(六)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;虽然不属于 GoF 23 种经典设计模式&#xff0c;但在实际开发中非常常用&#xff0c;尤其是在 Spring Boot 项目中。它提供了一种简单的方式来创建对象&#xff0c;将对象的创建逻辑集中到一个工厂类中。 一、简单工…...

Python简单使用MinerU

Python简单使用MinerU 1 简介 MinerU是国产的一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。目前支持图像&#xff08;.jpg及.png&#xff09;、PDF、Word&#xff08;.doc及.docx&#xff09;、以及P…...

使用AI创建流程图和图表的 3 种简单方法

你可能已经尝试过使用 LLMs 生成图像&#xff0c;但你有没有想过用它们来创建 流程图和图表&#xff1f;这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常&#xff0c;在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗&#xff1f;你可以使用 LLMs 通过简…...

ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘

错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案&#xff1a; 1. 检查 pytest 版本 首先&#xff0c;确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集&#xff1a;聚类算法——发现数据中的隐藏模式 在机器学习中&#xff0c;聚类&#xff08;Clustering&#xff09; 是一种无监督学习方法&#xff0c;用于发现数据中的隐藏模式或分组。与分类任务不同&#xff0c;聚类不需要标签&#xff0c;而是根据数据的相似性将其划…...

z-score算法

z-score算法原理参考网址 https://blog.csdn.net/m0_59596937/article/details/128378641 具体实现代码如下&#xff1a; import numpy as npclass ZScoreOutlierDetector:def __init__(self, threshold3):"""构造函数"""self.threshold thre…...

企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow

企业级 RAG GitHub 开源项目深度分享&#xff1a;Quivr、MaxKB、Dify、FastGPT、RagFlow 及私有化 LLM 部署建议 随着生成式 AI 技术的成熟&#xff0c;检索增强生成&#xff08;RAG&#xff09;已成为企业构建智能应用的关键技术。RAG 技术能够有效地将大型语言模型&#xff…...

open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题

项目地址&#xff1a;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 选择了docker部署 如果 Ollama 在您的计算机上&#xff0c;请使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…...