什么是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-rendererrenderToString()。这些函数必须运行在 Node.js 环境中,且组件不能依赖浏览器全局对象(如 windowdocument)。

常见错误现象:

  • 直接在 SSR 中调用 useEffectcomponentDidMount 里的 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
  • localStoragenavigator.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 的 asyncDatafetch 钩子会在服务端和客户端都执行,但服务端执行结果会序列化进 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多对多关系及中间表数据存取【方法】  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?