1、为什么会有服务器渲染与客户端渲染?

  首先理解服务器和浏览器客户端之间传递的是什么——HTML,CSS,JavaScript的文件以及数据载体json(xml)等文件,而文件都是静态,之所以动态是应为浏览器运行脚本之后产生的动态。这也是为什么JavaScript是脚本语言。

  一开始,Web App 直接由若干 HTML,CSS, JS 组成,每一个页面需要特殊的逻辑,因此随着App规模的扩大,后端网站目录下的代码文件就越来越多,而且,彼此之间是没有同步的,比如你改了站点的布局风格。那么你很可能需要改动成百上千的HTML文件,这谁能忍?

  聪明的工程师们想到,既然如此多的HTML具有一定的逻辑联系,何不使用代码生成代码?于是后端模板语言诞生了,这可是前端狗的一大痛点啊,于是人们开始广泛使用模板语言代替手写HTML。我认为,模板语言的成功源于它成功地减少了前端工程师的工作量

  后端模板渲染的思路应该是源自“如何管理数以千计的存储于后端的前端页面的版本一致?”这个问题的。通过代码生成代码,本质上是编译,他们基于HTML等基础语言作了更高层次的抽象封装,增强了易用性。各种模板语言大同小异,但大多都有模板中的模板这样的性质来完成继承这样的面向对象特性,用后端的思想来说,返回的页面中其实每个页面都是大同小异,其中只是html 发生少许变化,因此将页面抽象 ,根据业务数据渲染出不同特性的新的html返回浏览器。

  当时工程师们没有考虑前端渲染的一大原因是 以JavaScript为代表的前端技术尚未崛起。后面随着谷歌 Google V8 引擎发布, JavaScript随之崛起 前端工程师们也开始考虑借鉴后端模板的思想,引入模板概念,也是后面各大框架中的组件(Component) 。减少向服务器请求重复的页面,特别是在Node.js出现以后 JS 工程师维护后端的成本大大降低。在这之中兴起了Angular,React,Vue ,他们对自己在Web App 的定位也不一样。 具体情况可以自己去了解,这并不是本文的重点。

2、浏览器渲染和服务器渲染路线

 互联网早期,用户使用浏览器浏览的都是一些没有复杂逻辑的、简单的页面,这些页面都是在后端将html拼接好的然后将之返回给前端完整的html文件,浏览器拿到这个html文件之后就可以直接解析展示了,而这也就是所谓的服务器端渲染了。而随着前端页面的复杂性提高,前端就不仅仅是普通的页面展示了,而可能添加了更多功能性的组件,复杂性更大,另外,彼时ajax的兴起,使得业界就开始推崇前后端分离的开发模式,即后端不提供完整的html页面,而是提供一些api使得前端可以获取到json数据,然后前端拿到json数据之后再在前端进行html页面的拼接,然后展示在浏览器上,这就是所谓的客户端渲染了,这样前端就可以专注UI的开发,后端专注于逻辑的开发

  客户端渲染和服务器端渲染的最重要的区别就是究竟是谁来完成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. 服务端返回已经有正确内容的页面 -> 5. 客户端请求js/css文件 -> 6. 等待js文件下载完成 -> 7. 等待js加载并初始化完成 -> 8. 客户端把剩下一部分渲染完成( 内容小,渲染快 )

3、从 后端渲染到前端渲染,发生了什么变化?

  • 计算任务转移

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

  • 放弃前端权限

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

4、服务器端渲染的优缺点是怎样的?

  • 优点:
  1. 前端耗时少。因为后端拼接完了html,浏览器只需要直接渲染出来

  2. 有利于SEO(搜索引擎优化)。因为在后端有完整的html页面,所以爬虫更容易爬取获得信息,更有利于seo。

  3. 无需占用客户端资源。即解析模板的工作完全交由后端来做,客户端只要解析标准的html页面即可,这样对于客户端的资源占用更少,尤其是移动端,也可以更省电。

  4. 后端生成静态化文件。即生成缓存片段,这样就可以减少数据库查询浪费的时间了,且对于数据变化不大的页面非常高效 。

  • 缺点:
  1. 不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,则对于前端复杂度高的项目,不利于项目高效开发。另外,如果是服务器端渲染,则前端一般就是写一个静态html文件,然后后端再修改为模板,这样是非常低效的,并且还常常需要前后端共同完成修改的动作; 或者是前端直接完成html模板,然后交由后端。另外,如果后端改了模板,前端还需要根据改动的模板再调节css,这样使得前后端联调的时间增加。

  2. 占用服务器端资源。即服务器端完成html模板的解析,如果请求较多,会对服务器造成一定的访问压力。而如果使用前端渲染,就是把这些解析的压力分摊了前端,而这里确实完全交给了一个服务器。

5、客户端渲染的优缺点是怎样的?

  • 优点:  

  1. 前后端分离。前端专注于前端UI,后端专注于api开发,且前端有更多的选择性,而不需要遵循后端特定的模板。

  2. 体验更好。比如,我们将网站做成单页Web应用(single page web application,SPA,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序)或者部分内容做成SPA,这样,尤其是移动端,可以使体验更接近于原生app。

  • 缺点:

  1. 前端响应较慢。如果是客户端渲染,前端还要进行拼接字符串的过程,需要耗费额外的时间,不如服务器端渲染速度快。

  2. 不利于SEO。目前比如百度、谷歌的爬虫对于SPA都是不认的,只是记录了一个页面,所以SEO很差。因为服务器端可能没有保存完整的html,而是前端通过js进行dom的拼接,那么爬虫无法爬取信息。 除非搜索引擎的SEO可以增加对于JavaScript的爬取能力,这才能保证SEO。

5、使用服务器端渲染还是客户端渲染?

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

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

6、对于前后端分离,如果进行seo优化?

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

  我们可以自行提交sitemap让蜘蛛主动去爬取,但是遇到了sitemap中的url,达到指定页面之后只有元js怎么办呢?这是我们可以使用<noscript>标签来进行简单的优化,比如打印出当前页面信息的一些关键的信息点,但是正常用户并不需要这些,会造成额外的负担,且前端可以判断是否支持JavaScript,而后段不行,只好根据百度的spider做UA(用户代理)判断,使用phantomjs或者nginx代理,来对spider访问的页面进行特殊的处理,达到被收录的效果。但这种效果还是不好。。。

  而目前的react和vue都提供了SSR,即服务器端渲染,这也就是提供SEO不好的解决方式了。

7、究竟如何理解前后端分离?

  实际上,时至今日,前后端分离一定是必然或者趋势,因为早期在web1.0时代的网页就是简单的网页,而如今的网页越来越朝向app前进,而前后端分离就是实现app的必然的结果。所以,我们可以认为html、css、JavaScript组成了这个app,然后浏览器作为虚拟机来运行这些程序,即浏览器成为了app的运行环境,成了客户端,总的来说就是当前的前端越来越朝向桌面应用或者说是手机上的app发展了,而比如说电脑上的qq可以服务器端渲染吗?肯定不能!所以前后端分离也就成了必然。而我们目前接触额前端工程化、编译(转译)、各种MVC/MVVM框架、依赖工具、npm、bable、webpack等等看似很新鲜、创新的东西实际上都是传动桌面开发所形成的概念,只是近年来前端发展较快而借鉴过来的。

8、如何理解互联网(高并发)的前后端分离?

  在高并发下,所有公司的应用都会出现并发瓶颈,笔者所理解的分布离 ,从物理分离,物理分离考虑到服务器本身磁盘的读写有限 ,将前端项目交给I/0处理优势的node 处理 ,前端项目和后端的项目直接在物理机上分离 ,让node访问其他物理机的后台接口,拿到数据进行页面渲染,返回给浏览器,node 所在的前端项目 ,完全处理路由 和 权限资源 ,静态资源的分发,达到真正的分离 ,后端完全无状态提供数据就行。

 

转载于:https://www.cnblogs.com/yuan-jianfeng/p/10790910.html

前端后分离深入分析 ——浏览器渲染和服务器渲染区别相关推荐

  1. python 服务端渲染_客户端渲染和服务器渲染的区别

    我们都知道,网页上的很多内容之所以能那么丰富,是因为大量的css.js去渲染出这个页面.那么他们是如何渲染的呢?那么就要说到我们本文的两种渲染方式了,即客户端渲染和服务端渲染. 正文 本文将分别讲述两 ...

  2. 客户端渲染和服务器渲染的区别

    客户端渲染和服务器渲染的区别 前言 正文 一.客户端渲染 图片讲解 文字讲解 真实的客户端渲染案例 优点 缺点 二.服务器渲染 图片讲解 文字讲解 真实的服务器渲染案例 优点 缺点 三.如何区分客户端 ...

  3. 计网 | 服务器到底是什么?浏览器和Web服务器的区别

    服务器:我是谁 可能有很多网友不清楚,服务器和普通电脑到底有什么区别?对于普通用户而言,确实对服务器感觉很神秘,不知道服务器到底是个什么东东. 首先可以很明确的告诉你,服务器也是电脑,服务器是为电脑提 ...

  4. Springboot+Vue实现简单的前端后分离数据交互

    目录 一,前后端分离介绍 二,与传统单体结构的比较 2.1,传统单体结构开发 2.2,前后端分离结构开发 三,简单实现前后端数据交互 1,准备的环境及工具 2,开发步骤 2.1,后端部分 2.2,前端 ...

  5. 浏览器渲染和服务器渲染区别

    何为渲染? 如果我们只是想显示一堆不变的数据,那么我们直接写一个a.html丢到服务器上让客户端访问就可以了.但这是基本不可能的事情,数据一般是变化的.你不可能为每套数据写一个视图,所以我们需要分离数 ...

  6. 前端:客户端渲染 vs 服务器渲染

    渲染工作应该由谁完成? 时下,前端 UI 设计越来越复杂,可谓"XX与XX齐飞,XX共XX一色". 越来越复杂的 UI 意味着越来越重的 渲染工作. 目前通常有两种选择:服务器渲染 ...

  7. 前端渲染:服务器渲染 or 客户端渲染

    渲染工作应该由谁完成? 时下,前端 UI 设计越来越复杂,可谓"XX与XX齐飞,XX共XX一色". 越来越复杂的 UI 意味着越来越重的 渲染工作. 目前通常有两种选择:服务器渲染 ...

  8. ajax 请求_前端后分离Ajax跨域请求保证Session一致

    JAVA码牛牛,程序员学习指南 前后端分离的项目,使用Ajax请求一般都出现跨域的问题. 跨域的时候所创建的session是不会被浏览器保存下来的.所以每次进行跨域请求时,服务器都认为不是同一个浏览器 ...

  9. 一文搞懂什么是前端渲染和后端渲染以及两者的区别

    一.什么是后端渲染? 我们都知道现在的网页都由html+css+js组成,但是在比较早的时候是没有js(JavaScript)的.所以那时候网页开发一般都是用html+css+jsp(java ser ...

最新文章

  1. Windows CMD控制台默认编码设置为UTF-8的方法介绍
  2. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 (zz)
  3. 【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的
  4. NS 802.11函数分析(一)
  5. python怎么返回上一行代码_一行Python代码能做出哪些神器的事情
  6. opencv复杂变换cvPyrDown [6]
  7. NVIDIA的python-GPU算法生态 ︱ RAPIDS 0.10
  8. 【kindeditor】kindeditor的使用
  9. 鸿翼上线DMSTMS管理系统,助力智飞龙科马打造数字化质量安全生命线
  10. 智慧环卫车辆监控管理系统方案
  11. 搭建frp进行内网穿透
  12. 8个接私活的网站,只要你有码,那“我”就有钱
  13. 12000 颗卫星为地球织网!马斯克昨夜踏上改变世界的第6个征程
  14. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.4 您要在Web上做什么
  15. 新一代亚马逊电子书阅读器Kindle Paperwhite全球同步上市
  16. java ctor_.ctor,.cctor 以及 对象的构造过程
  17. 学习一下windows系统的的目录结构,对比一下Linux系统的目录结构
  18. Fedora进行ffmpeg+nginx+rtmp服务器配置局域网推流
  19. css中浮动-----梅花
  20. IC设计中时钟偏斜对延时的影响

热门文章

  1. Python创建单例模式的5种方法
  2. python人工智能——机器学习——分类算法-k近邻算法
  3. 【ARM】Programmers Model
  4. 【Tiny4412】使用dnw烧写内核
  5. 【Linux】一步一步学Linux——atrm命令(140)
  6. 类属性的特征java_java定义类、属性、方法
  7. c语言调用函数计算分段函数值,输入x,计算并输出下列分段函数f(x)的值(保留2位小数) c语言...
  8. json schema如何约束为小数_如何使用jsonschema进行接口响应断言
  9. 新疆大学OJ(ACM) 1047: string 字符串排序
  10. 东莞市初中生中考计算机内容,2019年广东东莞市中考考试科目及内容