服务器端渲染基础

概念

  • 随着前端技术栈和工具链的迭代成熟,前端工程化,模块化成为了当下主流技术方案,在这比技术浪潮中,涌现了诸如Anfular,React,Vue等基于客户端渲染的前端框架,这类框架所构建的SPA单页面应用的优缺点如下
  1. 优点
    1.1 用户体验好
    1.2 开发效率高
    1.3渲染性能好
    1.4可维护性好
  2. 缺点
    2.1 首屏渲染时间长 => 与传统服务器端渲染直接获取服务端直接渲染好的HTML不同,单页面应用使用js在客户端生成HTML来呈现网页内容,用户需要等待客户端js解析执行完才能看到页面,这样就使得首屏加载时间长,从而影响用户体验
    2.2 不利于SEO=>因为当搜索引擎爬虫网站HTML文件的时候,单页面的html是没有内容的,因为它需要通过客户端js解析执行完才能够生成网页内容,而目前的主流搜索引擎对于这一部分内容的抓取还不是很好
  • 为了解决是上面的两个缺陷,业界借鉴了传统的服务器端直出HTML的方案提出在服务器端执行前端框架代码来生成网页内容,然后将渲染好的网页内容返回给客户端,客户端只需要展示就可以了
    在这里插入图片描述
  • 当然,不仅如此,为了更好的用户体验以及页面的交互,同时会在客户端将来自服务端渲染的内容激活为一个SPA应用,也就是说之后的页面中的交互都是通过客户端渲染来进行处理的
    在这里插入图片描述
    同构应用
  • 通过服务端渲染首屏直出,解决SPA应用首屏渲染慢以及不利于SEO问题
  • 通过客户端渲染接管页面内容交互得到更好的用户体验
  • 这种方式通常称之为现代化的服务端渲染,也叫同构渲染
  • 这种方式构建的应用称之为服务端渲染应用或者同构应用

相关概念

  • 什么是渲染
  • 传统的服务端渲染
  • 客户端渲染
  • 现代化的服务端渲染(同构渲染)

什么是渲染

  • 渲染:把数据+模板拼接到一起
    在这里插入图片描述
  • 渲染的本质是字符串的解析替换

传统的服务端渲染

  • 早期的Web页面渲染都是在服务端进行的,服务端在运行的过程中,把所需要的页面数据结合模板渲染的html,然后响应给浏览器,所以浏览器呈现出来的直接就是包含内容的页面
    在这里插入图片描述
  • 以上最重要的是第四步

通过Node.js演示传统的服务器端渲染模式

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)
  // 4. 把渲染结果发送给客户端
  res.send(template)
})
app.listen(3000, () => {
  console.log("启动服务器成功")
})

优点:

  • 适用于应用不复杂的页面

缺点:

  • 前后端代码完全耦合在一起,不利于开发和维护
  • 服务端压力大
  • 用户体验一般(想看到其他的页面,必须刷新请求一个新的页面)

客户端渲染

  • 服务器端渲染的缺点随着客户端Ajax技术的普及得到有效的解决
  • Ajax使得客户端动态获取数据成为可能,服务端渲染工作 => 来到的客户端
  • 解决了服务端渲染的问题
  1. 前后端代码完全耦合在一起,不利于开发和维护 => 页面的渲染放到客户端渲染处理,这样的话代码及人员的职责就可以实现划分,也就是说后端只需要负责数据的处理,给前端提供接口,而前端主要负责视图渲染的处理,这样的话我们就能极大提高项目的开发效率及可维护性
  2. 服务端压力大 => 渲染的工作分散到客户端
  3. 用户体验一般 => 传统的服务端渲染,我们要查看不同的页面,那么每个页面都要去完整的刷新,体验不够友好,客户端渲染的话,单页面SPA这种无刷新体验相比传统的服务端渲染体验好很多
  • 客户端渲染的流程
    在这里插入图片描述
  • 后端:负责处理数据接口
  • 前端:负责将接口数据渲染到页面中

客户端解决了服务器端渲染的问题,但也存在一些明显的不足

  • 首屏渲染慢:客户端渲染从服务端返回的是空白的HTML和相关的js代码,只有等js代码完全执行完成后才能看到完整的内容(至少发送两个http请求,html和js),而服务端渲染时直接返回拼接好的HTML(一个http请求)
  • 不利于SEO:因为返回的是空白的HTML,页面的内容是由js代码生成,SEO只会搜索HTML字符串中的内容,不会像浏览器一样去解析js代码,空白的HTML,SEO信息就是空白的

现代化的服务端渲染

前面了解到客户端渲染有两个比较突出的缺点

  • 首屏渲染慢
  • 不利于SEO

解决办法:现代化的服务端渲染 => 同构渲染
同构渲染 = 后端渲染 + 前端渲染

  • 基于React,Vue等框架,客户端渲染和服务器端渲染的结合

    • 在服务器端执行一次,用于实现服务器端渲染(首屏直出)
    • 在客户端再执行一次,用户接管页面交互
  • 核心解决SEO和首屏渲染慢的问题

  • 拥有传统服务端渲染的优点,也有客户端渲染的优点
    在这里插入图片描述
    如何实现同构渲染

  • 使用Vue,React等框架的官方解决方案

    • 优点:有助于理解原理
    • 缺点:需要搭建环境,比较麻烦
  • 使用第三方解决方案

    • React生态的Next.js
    • Vue生态的Nuxt.js
  • 接下来我们以Vue生态中的Nuxt.js为例演示同构渲染应用

同构渲染的问题

  • 开发条件有限

    • 浏览器特定的代码只能在某些生命周期钩子函数中使用
    • 一些外部扩展库可能需要特殊处理才能在服务端渲染应用中运行
    • 不能在服务端渲染期间操作DOM
    • 某些代码操作需要区分运行环境
  • 涉及构建和部署的要求更多
    在这里插入图片描述

  • 更多的服务端负载

    • 在Node中渲染完整的应用程序,相比仅仅提供静态文件的服务器,需要占用大量的CPU资源
    • 如果在高流量环境下使用,需要准备相应的服务器负载
    • 需要更多的服务端渲染优化工作处理

服务端渲染使用建议

  • 首屏渲染速度是否真的重要
  • 是否真的需求SEO
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值