服务端渲染基础

  什么是渲染

  一般而言大家提到“渲染”,可能会说:“凡是从服务器返回的 HTML 页面,均算作是服务端渲染。”这可能让不少人还是觉得迷惑,简单说渲染就是“数据”和“模板”拼接到一起。举个例子:我们前端开发最常见的一个场景,请求后端接口数据,然后将数据通过模板绑定语法绑定到页面中,最终呈现给用户。这个过程就是我们这里所指的渲染。

  总结来说,渲染本质其实是字符串的解析替换,实现方式有很多种。但是我们这里要关注的并不是如何渲染,而是在哪里渲染的问题。

  传统的服务端渲染

  最早期,Web 页面渲染都是在服务端完成的,即服务端运行过程中将所需的数据结合页面模板渲染为

  HTML 响应给客户端浏览器。所以浏览器呈现出来的是直接包含内容的页面。

  服务端渲染工作流程

  这种方式对于没有玩过后端开发的同学来说可能会比较陌生,所以下面通过我们前端同学比较熟悉的 Node.js 来了解一下这种方式。

  安装依赖:

  // 创建 http 服务

  npm i express

  // 服务端模板引擎

  npm i art-template express-art-template

  服务端代码部分,我们可以在基本的 Web 服务,使用模板引擎,然后渲染一个页面,具体如下:'

  const express = require('express')

  const fs = require('fs')

  const template = require('art-template')

  const app = express()

  app.get('/', (req, res) => {

  // 1. 得到模板内容

  const templateStr = fs.readFileSync('./index.html', 'utf-8')

  // 2. 得到数据

  const data = JSON.parse(fs.readFileSync('./data.json', 'utf-8'))

  // 3. 渲染:数据 + 模板 = 完整结果

  const html = template.render(templateStr, data)

  console.log(html)

  // 4. 把渲染结果发送给客户端

  res.send(html)

  )}

  app.listen(3000, () => console.log('running...'))

  客户端代码:

  <!DOCTYPE html>

  <html lang="en">

  <head>

  <meta charset="UTF-8" />

  <title>Document</title>

  </head>

  <body>

  <h1>{{ message }}</h1>

  <ul>

  {{ each todos }}

  <li>{{ $value.title }}</li>

  {{ /each }}

  </ul>

  </body>

  </html>

  这是最早的网页渲染方式,也是动态网站的核心工作步骤。

  缺点:

  前后端代码完全耦合在一起,不利于开发和维护;

  前端没有足够的发挥空间;

  服务端的压力较大;

  用户体验一般;

  但是不得不说,在网页应用并不复杂的情况下,这种方式也是可取的。

  客户端渲染

  传统的服务端渲染的有很多问题,而这些问题客户端 Ajax 技术可以有效解决。Ajax 技术使得客户端动态获取数据变为可能,也就是说原本服务端渲染这件事也可以拿到客户端做了。

  下图是基于客户端渲染的 SPA 应用的基本工作流程:

  我们以一个 Vue.js 创建的单页面应用为例,简单了解一下这种方式的渲染过程。

  通过这个示例了解到我们可以把【数据处理】和【页面渲染】这两件事分开了。由后端负责处理数据接口,而前端只负责将接口数据渲染到页面中,这让前端不再受限于后端,更为独立。

  缺点:

  首屏渲染慢

  不利于 SEO

  现代化服务端渲染

  现代化服务器端一般会选择同构渲染,也就是一份代码,在服务器端执行一次,用于实现服务器端渲染(首屏直出),然后在在客户端再执行一次,用于接管页面交互。简单来说,同构渲染就是“后端渲染”和“前端渲染”的结合,同构渲染同时拥有传统服务端渲染和客户端渲染的优点,可以有效解决 SEO 和首屏渲染慢的核心问题。

  同构渲染流程图

  客户端发起请求

  服务端渲染首屏内容 + 生成客户端 SPA 相关资源

  服务端将生成的首屏资源发送给客户端

  客户端直接展示服务端渲染好的首屏内容

  首屏中的 SPA 相关资源执行之后会激活客户端 Vue

  之后客户端所有的交互都由客户端 SPA 处理

  如何使用同构渲染

  如何使用同构渲染有两种方式,一种是官方解决方案,一种是使用第三方的方案。

  使用 Vue、React 等框架的官方解决方案:

  优点:有利于理解原理

  缺点:需要搭建环境比较麻烦

  使用第三方解决方案:

  React 生态中的 Next.js

  Vue 生态中的 Nuxt.js

  Angular 生态中的 Angular Universal

  同构渲染应用的问题

  同构渲染在应用上也存在以下问题:

  开发条件有限

  涉及构建设置和部署的要求更高

  更多的服务端负载

  以上就是我对于服务端渲染的一些浅谈,希望能够对大家有所帮助。

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

推荐阅读更多精彩内容