写点什么

聊一聊服务端渲染和客户端渲染

  • 2017-05-08
  • 本文字数:1846 字

    阅读完需:约 6 分钟

我们在 walmart.com 网站上的大多数页面采用服务器端渲染(简称 SSR)方式。之所以选择服务器端渲染,主要出于以下两点考虑:

  • 能够为客户提供更理想的性能

  • 提供更为一致的 SEO 表现

正是由于 SSR 拥有上述优势,因此我们在将自有堆栈转换为 React 与 Node.js 时,投入了大量时间与精力以优化 SSR 性能。其中的一项关键性指标正在于页面内“明显位置”的渲染性能。我们发布的开源项目 Electrode 框架当中包含多种模块,能够有效提升 SSR 性能。感兴趣的朋友可以点击此处参阅我之前发布的各模块助益评述。

在发布Electrode 框架并强调其面向SSR 的设计思路之后,我收到了大量关于SSR 优势的疑问与评论。在今天的博文中,我将专门探讨使用SSR 在性能层面带来的改善效果——另外亦感谢 Andrew Farmer Patrick Hund 在 SEO 优势评述方面提供的协助。

理论性能收益

首先我们将通过下面这份简单的时间线图展示 SSR 与 CSR(即客户端渲染)之间的区别。

可以看到其中最大的区别在于,在使用 SSR 的情况下您的服务器对浏览器的响应结果属于已做好准备并可进行渲染的页面 HTML,而 CSR 的浏览器响应结果则属于链接至您 javascript 的空文档。这意味着您的浏览器将立足服务器进行 HTML 渲染,而无需等待全部 JavaSciprt 代码的下载与执行。在这两种情况下,我们都需要下载 React 并利用同样的流程构建一个虚拟 dom,而后附加各事件以实现页面交互——但在 SSR 方面,用户可在执行上述流程的同时查看到页面内容。而在 CSR 方面,大家则需要等待上述流程全部执行完成,而后方可进行查看。

现在,我们来了解以下注意事项:

  • 尽管在 SSR 方面,页面会提前进行渲染以帮助客户更早查看页面内容,但在 React 真正执行完成之后,查看到的内容并无法进行交互。如果客户在此期间点击某按钮,该操作亦需要等待 React 执行完成后方可起效 ;

  • SSR TTFB(即第一字节时间)速度比 CSR 更慢,因为您的服务器需要耗费时间为页面创建 HTML,而非直接发送相对较空的响应内容 ;

  • SSR 的服务器数据吞吐量要远低于 CSR 数据通量。以 React 为例,这种数据吞吐量的差异将造成显著区别。ReactDOMServer.renderToString 为一项同步 CPU 绑定调用,其中包含该事件循环,意味着服务器将无法在 ReactDOMServer.renderToString 完成之前处理其它请求。这里我们假定您的页面需要 500 毫秒进行 SSR,则意味着您每秒至多只能执行 2 项请求。请千万重视这一情况

实际用例

在下图当中,我们就 walmart.com 网站上的各生产应用对 SSR 与 CSR 进行渲染效果比对。

我们将三款应用(即主页、分类与搜索)分别立足 SSR 与 CSR 方式进行比较。相关结果来自 Chrome 浏览器所捕捉到的页面渲染时间指标。大家可能已经注意到,SSR 渲染速度要更快一些,而使用 CSR 则意味着加载过程中浏览器内将显示空白页面。大多数使用 CSR 的应用都会利用加载图标来取代这种难看的空白页面,但由于我们在正常操作中默认使用 SSR,因此在 CSR 测试中页面仍保持未经发动的空白样式。需要注意的是,上述结果皆为我们的设备在一天中特定时段内配合实际生产配置捕捉到的结果,因此经过定制化调整的方案也许在性能上有所区别——不过总体而言,其仍然足以反映一般性趋势。

上图为主页、分类与搜索页面的首次服务器响应对比。在这里我忽略掉了绿色指标条,因为其更多反映的是网络图中的其它元素。这里最值得关注的其实是文档大小与 TTFB。由于服务器会利用 HTML 对页面进行响应,因此大家可以看到 SSR 的文档总是相对较大。另外需要强调的是,正如前文中所提到,CSR 响应速度更快(除了主页,这是因为受到本次测试中某些因素的影响)。

这里再次向大家强调,上述测量指标会随着应用类型、延迟、服务器、位置以及多种其它变量的变化而有所浮动,因此请不要将其视为科学的客观事实——而仅用于反映一种普遍规律。

Electrode 框架

在我们对 SSR 与 CSR 进行 A/B 测试时,得出了以上总体趋势,而我们的数字也显示尽早进行渲染往往能够带来更理想的操作体验。

考虑到这些理由,我们的开源应用平台 Electrode 高度关注 SSR。其默认启用 SSR,而我们亦构建起多种模块以进一步提升 SSR 性能表现。感兴趣的朋友亦可点击此处参阅另一篇文章,我在其中展示了如何利用其中两款模块将RenderToString() 时间缩短达70%。

这里再次感谢Mayakumar 与Caoyang 协助我审查并调整了本篇博文的具体内容。


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-05-08 19:005052
用户头像

发布了 24 篇内容, 共 95252 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz AIGC 向量数据库

Android 实现APP可切换多语言

EquatorCoco

APP开发 Andriod开发

软件测试/人工智能|一文告诉你LangChain核心模块chains原理

霍格沃兹测试开发学社

如何使用1688店铺所有商品API接口

Noah

Footprint 的批量下载方案使交易回测更轻松

Footprint Analytics

区块链 回测

iZotope RX 10 for mac v10.4.2 激活版

Geek_幻墨成诗

iZotope RX 10下载 iZotope RX 10破解版 iZotope RX 10 mac iZotope RX 10

MindNode 5 for Mac(思维导图) v5.0.1中文激活版

mac

思维导图软件 苹果mac Windows软件 MindNode 5

软件测试/人工智能|LangChain核心模块Agents详解

霍格沃兹测试开发学社

PingCAP 被评为 Translytical Data Platforms 2023 全球技术领导者

PingCAP

数据库 TiDB

你知道Spring中BeanFactoryPostProcessors是如何执行的吗?

EquatorCoco

spring 后端 springboot

DAPP合约区块链技术项目系统开发

l8l259l3365

全力备战中国大学生计算机设计大赛!历年获奖作品正式上线和鲸社区

ModelWhale

Python 云计算 算法 数据分析 中国大学生计算机设计大赛

生成式AI与预测式AI的主要区别与实际应用

高端章鱼哥

生成式AI 预测式AI

上海统一运维管理平台推荐-行云管家

行云管家

IT运维 运维管理 统一运维

uniapp开发App从开发到上架全过程

雪奈椰子

BetterMouse for Mac中文激活版下载(鼠标增强软件)

iMac小白

软件测试/人工智能|为什么Python在人工智能时代异军突起

霍格沃兹测试开发学社

Rhinoceros 8 for Mac(犀牛8 mac版)激活版

Geek_幻墨成诗

Rhinoceros 7 Rhinoceros8

3D场景建模工具

3D建模设计

在线工具 3D场景建模 数字孪生场景

次世代建模纹理贴图怎么做?

3D建模设计

3D渲染 材质贴图 模型纹理

Redis Desktop Manager for Mac(Redis桌面管理工具)中文激活版

Geek_幻墨成诗

RESP

异常追踪与 JIRA 实现双向联动最佳实践

心有千千结

可观测性 Jira

都2023年了,你还不会 CI/CD 吗?

伤感汤姆布利柏

ci CD

WiFi7 IPQ9574-IPQ9554-QCN9274-QCN6274-space-time Block Code technology

wifi6-yiyi

ipq9574

Royal TSX for Mac(远程管理软件)6.0.2激活版

Geek_幻墨成诗

Royal TSX MacOS远程管理

「智造」第10期:浅谈工业互联网加速企业服务化转型

用友BIP

智能制造

速速报名!请查收 2023 龙蜥操作系统大会超全指南

OpenAnolis小助手

开源 龙蜥社区 北京 2023龙蜥操作系统大会

re:Invent 2023:PingCAP 荣获亚马逊云科技 2023 年度合作伙伴奖项

PingCAP

数据库 AWS TiDB 亚马逊云科技 pingCAP

Java 实现 MySQL 数据锁定策略

秃头小帅oi

JavaScript中的异步处理方法,

互联网工科生

JavaScript 异步处理

用行云管家实现IT统一运维管理,提高运维效率

行云管家

IT运维 行云管家 运维管理 统一运维

聊一聊服务端渲染和客户端渲染_语言 & 开发_Alex Grigoryan_InfoQ精选文章