什么是javascript服务端渲染_它与客户端渲染有何不同?
发布时间 - 2026-01-05 00:00:00 点击率:次服务端渲染(SSR)指服务器在请求时执行JS生成完整HTML返回,核心是renderToString等函数在Node.js中运行且组件须无浏览器依赖;CSR则仅返回空壳HTML,由浏览器下载JS后渲染,首屏慢、SEO差;SSR非必然更快,需严格同构、数据一致与环境隔离。
JavaScript 服务端渲染(SSR)不是指“用 Node.js 跑 React/Vue”,而是指:在用户请求页面时,服务器执行 JavaScript 渲染逻辑,生成完整的 HTML 字符串并返回,而不是只发一个空壳 index.html 让浏览器自己拉 JS、再渲染。
服务端渲染的核心是 renderToString 或等效函数
以 React 为例,关键动作是调用 ReactDOMServer.renderToString()(或 renderToPipeableStream()),把组件树同步/流式转成 HTML 字符串;Vue 则用 vue-server-renderer 的 renderToString()。这些函数必须运行在 Node.js 环境中,且组件不能依赖浏览器全局对象(如 window、document)。
常见错误现象:
- 直接在 SSR 中调用
useEffect或componentDidMount里的 DOM 操作 —— 会报ReferenceError: document is not defined - 在
renderToString前未正确注入初始数据(如 Redux state、路由匹配结果),导致首屏 HTML 缺内容 - 使用了不支持 SSR 的第三方组件(比如某些图表库硬绑
canvas)
客户端渲染(CSR)的典型流程是静态 HTML + 挂载
传统 CSR 应用打包后只有一个极简的 index.html,里面只有 和一个 标签。浏览器下载 JS 后才开始解析组件、发起 API 请求、构建 DOM —— 这意味着首屏白屏时间长、SEO 不友好、首屏无法直出内容。
关键差异点:
- CSR 的
ReactDOM.hydrateRoot()(或旧版hydrate())只是“激活”已存在的 HTML,不做真实渲染;而 SSR 的renderToString()是真渲染 - CSR 中所有副作用(数据获取、动画初始化)都发生在浏览器端;SSR 要求数据获取提前到服务端完成(如 Next.js 的
getServerSideProps) - CSR 的路由跳转基本不触发完整页面刷新;SSR 每次 HTTP 请求都可能对应一次服务端渲染(除非配合客户端路由接管)
SSR 不等于“更快”,它引入了新的瓶颈和约束
SSR 把渲染压力从用户设备转移到服务器,但换来的是更复杂的部署、更高的内存/CPU 开销、以及对代码同构性的严苛要求。比如:
- Node.js 进程渲染一个复杂页面可能耗时 100–300ms,而 CSR 首屏 JS 加载+执行可能只要 80ms(取决于网络和设备)
- 你必须确保服务端和客户端使用完全相同的组件版本、相同的 props、相同的初始状态,否则会触发 React 的 hydration mismatch 警告甚至错误(
Text content does not match) - 像
localStorage、navigator.geolocation这类纯浏览器 API,不能在 SSR 阶段访问 —— 必须包裹在if (typeof window !== 'undefined')或生命周期钩子中
if (typeof window !== 'undefined') {
// 这里才能安全使用 localStorage
const savedTheme = localStorage.getItem('theme');
}
现代框架如何降低 SSR 使用门槛
Next.js、Nuxt、Remix 等框架封装了服务端渲染的底层细节,但它们仍强制你区分“服务端可执行”和“仅客户端可用”的代码位置:
- Next.js 中,
getServerSideProps函数内可以发请求、读文件、连接数据库;但它不能包含任何浏览器 API 调用 - Nuxt 的
asyncData和fetch钩子会在
服务端和客户端都执行,但服务端执行结果会序列化进 HTML 的 ,避免客户端重复请求 - Remix 的
loader函数天然只运行在服务端,数据不会泄漏到客户端,安全性更高
真正难的不是“怎么开启 SSR”,而是怎么让组件既能在 Node.js 里跑通,又能在浏览器里正确 hydrate —— 很多 bug 都藏在数据一致性、副作用时机、环境判断漏判里。
# vue
# react
# javascript
# java
# html
# js
# node.js
# node
# seo
# 浏览器
# 路由
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
,在苏州找工作,上哪个网站比较好?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Python结构化数据采集_字段抽取解析【教程】
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
网站制作壁纸教程视频,电脑壁纸网站?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
图册素材网站设计制作软件,图册的导出方式有几种?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
微信推文制作网站有哪些,怎么做微信推文,急?
使用spring连接及操作mongodb3.0实例
如何在腾讯云免费申请建站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel怎么上传文件_Laravel图片上传及存储配置
如何在Windows环境下新建FTP站点并设置权限?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
SQL查询语句优化的实用方法总结
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
HTML 中动态设置元素 name 属性的正确语法详解
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
焦点电影公司作品,电影焦点结局是什么?
轻松掌握MySQL函数中的last_insert_id()
Laravel如何使用Eloquent进行子查询
装修招标网站设计制作流程,装修招标流程?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
jquery插件bootstrapValidator表单验证详解
网站制作免费,什么网站能看正片电影?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
jQuery validate插件功能与用法详解
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何为不同团队 ID 动态生成多个独立按钮
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Linux系统命令中screen命令详解
Laravel如何配置任务调度?(Cron Job示例)
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何用搬瓦工VPS快速搭建个人网站?
网站制作软件有哪些,制图软件有哪些?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel如何自定义分页视图?(Pagination示例)
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?


服务端和客户端都执行,但服务端执行结果会序列化进 HTML 的