SSR

某个项目比较老那时候没有 next,而是自己实现的 SSR 框架

参考资料

概念

服务端渲染(Server-Side Rendering)是指由服务器直接生成完整的 HTML 页面并返回给浏览器,客户端(浏览器)接收到的是可直接渲染的静态内容,而非空页面或 JSON 数据。与客户端渲染(CSR)不同,SSR 的核心逻辑(如数据请求、模板拼接)在服务器端完成。

react的next,vue的nuxt都是SSR比较热门的框架

image.png

CSR的流程是返回简单的HTML,再下载JS文件去执行,去修改DOM节点,最后将页面呈现出来。

而SSR是服务器预先渲染好了,直接返回完整的HTML。所以有着更好的首屏加载

SSR的优点

  • 优化SEO
  • 更快的首屏加载
  • 性能优化,缓存,降低客户端压力
  • 兼容性 … …

react-dom/server的renderToString可以直接将jsx组件转化为string

asd;
// server/index.js
import express from 'express';
import { renderToString } from 'react-dom/server';
import Home from './containers/Home';

const app = express();
const content = renderToString(<Home />);
app.get('/', function (req, res) {
  res.send(
    `
    <html>
      <head>
        <title>ssr</title>
      </head>
      <body>
        <div id="root">${content}</div>
      </body>
    </html>
   `
  );
});
app.listen(3001, () => {
  console.log('listen:3001');
});

同构

同构是SSR相关的重要概念,可以简单理解为同一套代码在客户端和服务端执行的结果是一致的

为什么需要引入同构概念,如果我们的jsx代码上绑定了事件,如点击事件,你会发现readerToString返回的内容上没有事件绑定的。

这肯定是不行,解决的方案就是添加script标签,去帮我们处理

react这方面提供了hydrateRoot这个客户端api来处理

常见的一个error,就是水合错误,因为客户端和服务端的dom节点不同,导致可能挂载出现问题。 (与react的虚拟dom相关,待查证 可以往div加suppressHydrationWarning不显示该警告

同构带来的问题

路由

redux

image.png

对于store的连接操作,在同构项目中分两个部分,一个是与客户端store的连接,另一部分是与服务端store的连接。都是通过react-redux中的Provider来传递store的。

并且服务端的Store需要加处理,不然导出去都是同一个Store了

状态注入

初始化store,将state存到windows全局里面

数据的注水和脱水

异步数据请求处理……

多级路由渲染

node中间层

css 服务端渲染

SEO

react-helmet