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

性能优化之SSR、SSG

一、SSR和SSG介绍

        SSR(Server-Side Rendering,服务端渲染)和 SSG(Static Site Generation,静态站点生成)是现代前端框架(如 Next.js、Nuxt.js、Gatsby)的核心渲染策略,用于解决传统 CSR(客户端渲染)的 SEO 弱、首屏慢等问题。以下是关键对比与使用指南:


1、两者核心差异

特性SSR (服务端渲染)SSG (静态站点生成)
渲染时机每次请求时实时渲染构建时预渲染所有页面
数据实时性高(请求时获取最新数据)低(构建后数据即固定)
适用场景用户仪表盘、实时数据页博客、文档、营销页
服务器压力高(需处理每次渲染)极低(直接托管静态文件)
部署复杂度需 Node.js 服务器可托管至 CDN(如 Netlify/Vercel)
典型框架Next.js (getServerSideProps)Next.js (getStaticProps)、Gatsby

2、工作流程对比

 SSR 流程

SSG 流程

 

3、两者如何选择?

选 SSR 当:

  • 页面内容每次请求都变化(如用户个人中心)

  • 需要实时数据(股票行情、聊天消息)

  • 对 SEO 要求高且内容动态(电商商品详情页)

选 SSG 当:

  • 内容长期不变(技术文档、博客文章)

  • 追求极限加载速度(通过 CDN 全球分发)

  • 降低服务器成本(无服务器端计算)

 4、混合场景:动态静态化

现在的框架支持混合渲染模式,例如:

  • ISR (Incremental Static Regeneration,增量静态再生)
    (ISR 是由 Next.js 框架提出的核心功能,用于扩展 SSG(静态站点生成)的能力,实现动态内容与静态性能的平衡)
// 以Next.js 示例:每60秒重新生成页面
export async function getStaticProps() {const res = await fetch('https://api.example.com/data');return { props: { data: res.json() },revalidate: 60 // 秒};
}

👆🏻上面的代码 意思是:

首次访问 → 返回静态页面

60秒内新请求 → 立即返回旧静态页面(后台触发重新生成)

60秒后访问 → 返回新生成的页面

  • 按需生成 (On-demand Revalidation)
// 手动触发页面更新(如 CMS 内容变更时)
await res.revalidate('/path-to-update');

5、经典问题解决方案

问题SSR 方案SSG 方案
动态数据更新每次请求实时渲染ISR + 按需重新生成
百万级页面生成不适用惰性生成(仅生成被访问的页面)
用户登录状态处理在 getServerSideProps 读取 Cookie客户端渲染动态部分(如 useEffect
兼容旧版浏览器输出完整 HTML 无需客户端 JS同 SSR(预渲染 HTML 可降级使用)

6、性能优化技巧

  • SSR 优化

    • 使用流式渲染(React 18+ renderToPipeableStream

    • 缓存渲染结果(Varnish/Redis 缓存匿名用户页面)

  • SSG 优化

    • 代码分割(动态加载非关键组件)

    • 图片优化(自动转换为 WebP 格式)

    • 预取数据(<link rel="preload"> 关键接口)

7、框架推荐

  • React 生态:Next.js(SSR/SSG 最成熟)

  • Vue 生态:Nuxt.js(支持 nuxt generate 静态化)

  • 轻量化 SSG:Astro(按需激活交互,默认输出静态 HTML)

  • 内容驱动:Gatsby(GraphQL 数据层 + 强大插件库)

💡 技术决策口诀

  • 数据 → SSR

  • 数据 → SSG

  • 部分变/部分稳 → 混合渲染(ISR + SSR)


 

ps:知识学习记录,如有不严谨之处,欢迎交流! 

http://www.lqws.cn/news/160795.html

相关文章:

  • 【前端】vue3性能优化方案
  • sourcetree取消待推送
  • 《计算机是怎么跑起来的》第二章读后感
  • 算法题(162):火烧赤壁
  • 13.4 AI颠覆语言学习:预录制视频+GPT-4评估如何实现60%成本降低与40%留存飙升
  • Seata 分布式事务 AT 模式
  • 智慧供水运维管理系统
  • LeetCode 70 爬楼梯(Java)
  • 探索未知惊喜,盲盒抽卡机小程序系统开发新启航
  • 半监督学习:低密度分离假设 (Low-Density Separation Assumption)
  • mysql密码正确SpringBoot和Datagrip却连接不上
  • c++第七天--特殊运算符的重载练习
  • day20 leetcode-hot100-38(二叉树3)
  • 第二章支线八 ·CSS终式:Tailwind与原子风暴
  • 优雅的系统重试
  • 如何轻松将视频从安卓设备传输到电脑?
  • 检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线
  • 【SSM】SpringMVC学习笔记8:拦截器
  • qt ui 转python
  • YAML在自动化测试中的三大核心作用
  • C++11 尾随返回类型:从入门到精通
  • Linux服务器如何安装wps?
  • 【案例】电商系统的AI微服务架构设计
  • C语言输入函数
  • 使用Python提取照片元数据:方法与实战指南
  • 炫云:为驱动数字视觉产业升级保驾护航
  • 解锁Java线程池:性能优化的关键
  • 八皇后问题深度解析
  • 11 - ArcGIS For JavaScript -- 高程分析
  • 图像分类进阶:从基础到专业 (superior哥AI系列第10期)