服务端渲染之-ssr同构

什么是同构

一份代码,先通过服务端渲染(server-side rendering,ssr),生成html字符串以及初始化数据,客户端拿到后,通过对html的dom进行patch和事件绑定对dom进行客户端激活(client-side hydration,csh),这个整体的过程叫同构渲染。

同构产生的背景 / 同构能够解决单纯客户端渲染的哪些痛点?

1.客户端渲染带来的的首屏白屏时间过长:

         在 SPA 模式下,所有的数据请求和 Dom 渲染都在浏览器端完成,所以当我们第一次访问页面的时候很可能会存在“白屏”等待,而服务端渲染所有数据请求和 html内容已在服务端处理完成,浏览器收到的是完整的 html 内容,可以更快的看到渲染内容。

         2. 客户端渲染不利于SEO:

         由于现阶段大多搜索引擎采用的爬虫算法是直接抓取页面代码分析,而SPA应用只有一个入口文件而没实质内容,SEO性能差。

适用的场景?

          1.特别依赖搜索引擎流量的项目;

2.对首屏时间有特殊要求;

现有的的开源框架?

next.js、react server、Beidou(北斗) 、

核心原理及架构流程图?

          借助虚拟DOM的特性,将一份代码在服务端和客户端各执行一次:

1、服务端使用 react-dom包提供的 server端渲染api: renderToString (常用)或 renderToStaticMarkup直接渲染出包含页面信息的静态 html字符串。

          2、客户端根据渲染出的静态 html 进行二次渲染,做一些绑定事件等交互操作。

同构的缺点?    

          1.同构会增加服务器的负载,对此一般推荐对于首屏和个别页面进行SSR服务端的渲染,此外仍保持应用为客户端SPA,充分利用浏览器特点,达到最优性能。

          2.使原本简单的 React 项目变得非常复杂,项目的可维护性会降低,代码问题的追溯也会变得困难。所以,使用 SSR 在解决问题的同时,也会带来非常多的副作用,有的时候,这些副作用的伤害比起 SSR 技术带来的优势要大的多。

关键点?

 1.双端框架选择:

           客户端:react(v16+)

           服务器端:koa/express

2.环境区分

           同一套代码在客户端和服务端执行两次,但因为环境不同,有些对象是不自带的,要加以区分避免出现问题。像前端特有的 Window 对象,Ajax 请求 在后端是无法使用上的,后端需要去掉这些前端特有的对象            逻辑或使用对应的后端方案,如后端可以使用 http.request 替代 Ajax 请求,所以需要进行平台区分,主要有以下几种方式:

          1. 代码使用前后端通用的模块,如 isomorphic-fetch

          2. 前后端通过 webpack 配置 resolve.alias 对应不同的文件

          3. 使用 webpack.DefinePlugin 在构建时添加一个平台区分的值

  3.react服务端提供的渲染API

  React 之所以可以做到服务端渲染 就是因为react-dom/server提供了服务端渲染的API。

renderToString 同步地把一个react 元素转换成带html字符串,遇到复杂页面时用户等待时间也不短。

renderToNodeStream把渲染结果以‘流’的形式返回给浏览器端,用户体验更友好。

后续为了客户端在渲染组件时,最大限度地保留在服务端使用 renderToString 生成的内容结构,ReactDom 相应的在客户端提供了一个新的 API:hydrate。

4.路由同构

首先需要抽离出一份路由组件文件routes.js:

客户端使用 react-router-dom 下的 BrowserRouter 进行前端路由控制。

服务端使用 react-router-dom 下的 StaticRouter 进行静态路由控制。

使用 react-router-config 下的 matchRoutes 匹配后端路由,使用 renderRoutes 渲染匹配到的路由。

使用 react-router-dom/server 下的 renderToString 方法,渲染出 html 字符串,并返回给前端。

使用 StaticRouter 中通过 context 可以和前端页面通信,传参。

数据交互与状态同步?

可以选用redux实现数据状态的同步:在服务端通过组件的静态API方法获取接口数据后创建store,再通过 window.store= store 传递给前端;此时应用中的所有页面都可以共享使用store中的数据,可以使用dispatch方法进行交互。

双端打包差异?

客户端打包:

          服务端打包:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350