服务端渲染

服务端渲染

SSR定义

服务端渲染简称SSR,全称是Server Side Render,是指一种传统的渲染方式,就是在浏览器请求页面 URL 的时候,服务端将我们需要的 HTML 文本组装好,并返回给浏览器,这个 HTML 文本被浏览器解析之后,不需要经过 JavaScript 脚本的执行,即可直接构建出希望的 DOM 树并展示到页面中。

CSR渲染流程 SSR渲染流程

SSR最适用于静态展示页面,如果页面动态数据较多时需要谨慎使用

SSR特点

CSR渲染的特点

  1. 优点
  • 前端负责渲染页面,后端负责实现接口,两者各司其职

  • 前端跳转时,无需请求后台,跳转性能高,用户体验好

  1. 缺点
  • 前端解析执行JS,搜索引擎无法爬取分析网页内容,不利于SEO

  • 页面渲染需要等待js解析执行、接口数据请求等,白屏时间过长

SSR渲染的特点

  1. 优点
  • 服务端直接输出HTML,SEO友好

  • 后端返回拼接好的HTML,首屏加载速度快,白屏时间短

  1. 缺点
  • 路由跳转需要访问服务器,用户体验较差

实现SSR渲染

renderToString是React代码在服务端渲染的常用方法。 renderToString、renderToStaticMarkup、renderToNodeStream、renderToStaticNodeStream四个方法能够将 React 组件渲染成静态的(HTML)标签,前两者能在客户端和服务端运行,后两者只能在服务端运行。

以React项目为例实现服务端渲染。

javascript 复制代码
import React from 'react';
const Home = () => {
  return (
    <div>
      <div>用于测试React服务端渲染的组件</div>
    </div>
  )
}
export default Home

需要安装Node.js和Express插件

javascript 复制代码
import express from 'express';
import { renderToString } from 'react-dom/server';
import App from './client/App';

const app = express();
// 利用renderToString,将 React 树渲染为一个 HTML 字符串。
const content = renderToString(<Home />);
// 将渲染后的React树,插入HTML结构中,并发给浏览器                               
app.get('/', function (req, res) {
   res.send(
   `
    <html>
      <head>
        <title>ssr</title>
      </head>
      <body>
        <div id="root">${content}</div>
      </body>
    </html>
   `
   );
})
app.listen(3000, () => {
  console.log('listen:3000')
})

同构渲染

同构渲染,就是一套代码在服务器上运行一次,在浏览器上再运行一次。服务器端负责完成页面结构,客户端负责渲染绑定事件。

代码在前端服务器上运行,生成HTML结构,并设置静态资源插入js文件,发给浏览器。浏览器通过加载js文件,绑定DOM事件。客户端接管页面,完成路由跳转。

代码同构的流程:

  • ReactDOMServer.renderToString:将React渲染为初始的HTML
ini 复制代码
const html = ReactDOMServer.renderToString(<App />);
  • ReactDom.hydrate:对HTML进行hydrate操作
javascript 复制代码
ReactDOM.hydrate(<App />, document.getElementById('root'));

同构防止多次渲染:

服务器返回的HTML元素上带有一个checksum属性,该属性是根据HTML内容生成的hash值。浏览器加载并执行JS代码后,在浏览器端构建一个虚拟DOM树,根据虚拟DOM树内容生成hash值,与服务端返回的进行对比,对比一致则不再进行下一步操作(将虚拟DOM转化为真实DOM)

相关推荐
敲代码的玉米C1 小时前
我修的那个 bug,制造了另一个 bug
前端·人工智能·架构
gis开发之家1 小时前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
Narrastory1 小时前
我用 Claude Code 写代码不到 2 小时,却花了 3 天做完这个软件—Vibe Coding 的正确姿势,是设计不是生成
前端·人工智能·github
Enaium1 小时前
我实现了KMP的SDL绑定并编写了高性能软光追
前端·kotlin
古夕1 小时前
本地正常线上白屏:一次路由切换后刷新恢复问题的排查与修复
前端·ai编程
栀鸢ouo2 小时前
解决Element Plus表格展开行横向溢出、滚动截断问题(项目实战方案)
前端·vue.js
用户39051332192882 小时前
写了5年JS,才发现这10个方法能少写一半代码
前端
平凡的阿泽2 小时前
我用TRAE Work手搓了一个「谁是卧底」小游戏
前端·javascript
一心只读圣贤书2 小时前
AI 辅助前端视觉回归治理:从截图基线到变更解释
前端·人工智能
嘟嘟07172 小时前
用单例模式管理弹窗:从一段原生 JS 理解 Singlet
前端·javascript·代码规范