前端渲染HTML与后端渲染HTML的区别

·  阅读 4249

读书不是为了雄辩和驳斥,
也不是为了轻信和盲从,
而是为了思考和权衡。

        —— 培根
复制代码

两种渲染方式

  为什么会有后端渲染(服务器渲染SSR)与前端渲染(客户端渲染CSR)

首先理解服务器和浏览器客户端之间传递的是什么: HTML、CSS、JavaScript的文件以及数据载体json(xml)等文件。

  一开始,Web App 直接由若干 HTML、CSS、 JS 组成,每一个页面需要特殊的逻辑,因此随着App规模的扩大,后端网站目录下的代码文件就越来越多,而且,彼此之间是没有同步的。比如你改了站点的布局风格,那么你很可能需要改动成百上千的HTML文件,这劳动量太大了。既然如此多的HTML具有一定的逻辑联系,何不使用代码生成代码?于是后端模板语言诞生了,于是人们开始广泛使用模板语言代替手写HTML。

  目前接触到的模板语言有pug(jade)跟go template   

  • pug模板示例如下:

  • go template模板示例如下:

  通过后端渲染HTML,前端不需要配置路由那些步骤,只需要在需要填充内容的地方占位即可。需要对字段比较熟悉,还需要前后端一起联调。   

后端渲染

  互联网早期,用户使用浏览器浏览的都是一些没有复杂逻辑的、简单的页面,服务器进程从数据库获取数据后,后端的程序在把HTML页面吐给前端之前,先把HTML页面上的特定区域、特定符号,先用数据填充,将数据加载进来生成HTML,然后通过网络传输到用户的浏览器中解析成可见的页面。

所谓渲染,你可以理解一种修改,渲染这词最早来源于游戏领域,游戏领域又来源于现实画画,渲染嘛,拿着颜料往纸上涂便是。以前绝大部分服务器都是这个模式

前端渲染

  随着前端页面的复杂性提高,前端就不仅仅是普通的页面展示了,而可能添加了更多功能性的组件,复杂性更大,另外,彼时ajax的兴起,使得业界就开始推崇前后端分离的开发模式,即后端不提供完整的HTML页面,而是提供一些API使得前端可以获取到JSON数据,然后前端拿到JSON数据之后再在前端进行HTML页面的拼接,然后展示在浏览器上,这就是所谓的前端渲染。

  这样前端就可以专注UI的开发,后端专注于逻辑的开发。代表是现在流行的SPA单页面应用,例如Vue、React框架,只需要后端给我们提供接口API,前端UI、交互等全在前端进行,前后端只需要约定接口。

后端渲染和前端渲染最重要的区别在于数据填充上的区别,也就是究竟是谁来完成HTML文件的完整拼接,如果是在后端完成的,直接填充到HTML后传给前端,然后返回给客户端,就是后端渲染;而如果是前端做了更多的工作完成了HTML的拼接,通过ajax或者fetch从后台拿数据再自己填充或进行其他数据操作,则就是前端渲染

  下面几个是在网上搜到的网友对前后端渲染比较形象的比喻:

简单来说:
后端渲染html 叫吐或者喷,机器人可以看到完整的呈现源码
前端模板渲染html叫填,机器人看不到完整的呈现源码

比如画一张带房子的画:
后端渲染:后端都画好,前端直接拿来展示给你看
前端渲染:后端把画布,房子,房子位置等一系列数据发给前端,前端现场画一个给你看

前端渲染和后端渲染路线

前端渲染路线

    1. 请求一个HTML
    2. 服务端返回一个HTML
    3. 浏览器下载html里面的JS/CSS文件 
    4. 等待JS文件下载完成 
    5. 等待JS加载并初始化完成 
    6. JS代码终于可以运行,由JS代码向后端请求数据(ajax/fetch) 
    7. 等待后端数据返回 
    8. 客户端从无到完整地,把数据渲染为响应页面
复制代码

后端渲染路线

    1. 请求一个HTML
    2. 服务端请求数据(内网请求快)
    3. 服务器初始渲染(服务端性能,较快)
    4. 服务端返回已经有正确内容的HTML
    5. 客户端请求JS/CSS文件
    6. 等待JS文件下载完成
    7. 等待JS加载并初始化完成
    8. 客户端把剩下一部分渲染完成(内容小,渲染快)
复制代码

从后端渲染到前端渲染的变化

  • 计算任务转移
      原本由服务器执行的渲染任务转移给了客户端,这在大量用户访问的时候大大减轻后端的压力。让后端专注做后端应该做的事情,性能将大大提高,因为服务器做的事情确实减小了,而现在随着客户端软硬件的发展,也能处理好大多数的渲染工作了。

  • 放弃前端权限
      将整个UI逻辑交给客户端以后,一些有经验有能力的用户可能会劫持UI,使得他们能够看到一些不该看到的界面。这似乎违反了安全的原则。但是“一切在前端谈安全都是耍流氓”,后端不能轻信一切从前端传来的数据,切记一定要做好过滤与验证。只要使用SSL、屏蔽XSS、后端不出漏洞,想伪造身份劫持App还是难以做到的。

后端渲染与前端渲染的优缺点对比

后端渲染优缺点

  • 优点:

    • 前端耗时少,因为后端拼接完了HTML,不需要先下载一堆JS和CSS 后才能看到页面,浏览器只需要直接渲染出来
    • 搜索引擎优化,因为在后端有完整的HTML页面,所以爬虫更容易爬取获得信息,更有利于SEO
    • 无需占用客户端资源。即解析模板的工作完全交由后端来做,客户端只要解析标准的HTML页面即可,这样对于客户端的资源占用更少,尤其是移动端,也可以更省电
    • 后端生成静态化文件。即生成缓存片段,这样就可以减少数据库查询浪费的时间了,且对于数据变化不大的页面非常高效
  • 缺点:

    • 不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,则对于前端复杂度高的项目,不利于项目高效开发
    • 服务器端渲染,则前端一般就是写一个静态HTML文件,然后后端再修改为模板,这样是非常低效的,并且还常常需要前后端共同完成修改的动作
    • 如果后端改了模板,前端还需要根据改动的模板再调节CSS,这样使得前后端联调的时间增加
    • 占用服务器端资源,即服务器端完成HTML模板的解析,如果请求较多,会对服务器造成一定的访问压力。而如果使用前端渲染,就是把这些解析的压力分摊了前端,而这里确实完全交给了一个服务器

前端渲染优缺点

  • 优点:  

    • 前后端分离,前端专注于前端UI,后端专注于API开发,且前端有更多的选择性,而不需要遵循后端特定的模板
    • 体验更好,比如,我们将网站做成单页Web应用(single page web application,SPA,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序)或者部分内容做成SPA,这样,尤其是移动端,可以使体验更接近于原生APP
    • 局部刷新,无需每次都进行完整页面请求
    • 懒加载,如在页面初始时只加载可视区域内的数据,滚动后再加载其它数据,可以通过 react-lazyload 实现
    • 富交互,使用 JS 实现各种酷炫效果
    • 节约服务器成本,省电省钱,JS 支持 CDN 部署,且部署极其简单,只需要服务器支持静态文件即可
  • 缺点:

    • 前端响应较慢,如果是客户端渲染,前端还要进行拼接字符串的过程,需要耗费额外的时间,不如服务器端渲染速度快
    • 不利于SEO,目前比如百度、谷歌的爬虫对于SPA都是不认的,只是记录了一个页面,所以SEO很差

使用场景

  不谈业务场景而盲目选择使用何种渲染方式都是耍流氓。比如企业级网站,主要功能是展示而没有复杂的交互,并且需要良好的SEO,则这时我们就需要使用后端渲染;而类似后台管理页面,交互性比较强,不需要SEO的考虑,那么就可以使用前端渲染。

  另外,具体使用何种渲染方法并不是绝对的,比如现在一些网站采用了首屏后端渲染,即对于用户最开始打开的那个页面采用的是后端渲染,这样就保证了渲染速度,而其他的页面采用前端渲染,这样就完成了前后端分离。  

  • 后端渲染:相对模块化,非常适用于偏向展示性的页面,利于SEO。而且由于是在后端就已经渲染好,所以加载体验相对好,在网速差的时候表现明显。
  • 前端渲染:比较灵活,适用于dom操作比较频繁或者交互比较复杂的业务场景。可以很好地维护一份model,而不用反复请求。理论上更符合前后端分离。

为什么前端渲染不利于SEO

  如果进行了前后端分离,那么前端就是通过JS来修改DOM使得HTML拼接完全,然后再显示,或者是使用SPA,这样,SEO几乎没有。那么这种情况下如何做SEO优化呢?

SEO(Search Engine Optimization),中文一般译作:搜索引擎优化。SEO是一种通过了解搜索引擎的运作规则(如何抓取网站页面,如何索引以及如何根据特定的关键字展现搜索结果排序等)来调整网站,以提高该网站在搜索引擎中某些关键词的搜索结果排名

  前面我们谈到的SPA不利于SEO,因为就目前而言,部分搜索引擎如Google、bing等,它们的爬虫虽然已经支持执行JS甚至是通过AJAX获取数据了,但是对于异步数据的支持也还不足。   
  
  因为单页面的情况下的页面中的很多内容都是根据匹配到的路由动态生成并展示出来的,而且很多页面内容是通过ajax异步获取的,网络抓取工具并不会等待异步请求完成后再行抓取页面内容,对于网络抓取工来说去准确模拟相关的行为获取复合数据是很困难的,它们更擅长对静态资源的抓取和分析。

vue和react实现的路由不是新的页面,只是动态切换了页面内容,页面没有重载,也就没有网页爬虫爬去取数据的过程

  • 后端渲染爬虫看到的页面长这样:

可以看到是一个完整的HTML文件

  • 前端渲染爬虫看到的页面长这样:

可以看到除了title没有其他关键数据

参考资料:

  1. 前端后分离深入分析 ——浏览器渲染和服务器渲染区别
  2. 实现基于 Nuxt.js 的 SSR 应用
  3. 服务端渲染 vs 客户端渲染
分类:
前端
标签:
分类:
前端
标签: