关于服务器与客户端应用程序渲染的讨论很多。 虽然没有“一刀切”的解决方案,但我将尝试从不同的角度主张客户端(特别是AngularJS)。 首先是建筑。

建筑

做得好的架构已经明确定义了关注点分离(SoS) 。 在大多数情况下,最少的高级配置为:

  • 数据存储
  • 服务
  • API
  • 介绍

这些层中的每一层都应仅具有上述知识的最少知识。 服务需要知道在哪里存储数据,API需要知道要调用什么服务,并且表示层只能通过API与其余的服务进行通信。 这里要注意的重要一点是,应该不存在有关下面各层的知识。 例如,API不应该知道谁或什么消费它。 它不应该具有表示层的知识。

对于这些层中的每一层都应该说更多,“现实世界”中的情况要比这复杂得多。 但是,对于本文的其余部分,重要的要点是,表示层通过API与服务器进行通信,而API对“外界”一无所知。 随着越来越多的机器和设备类型(笔记本电脑,移动设备,平板电脑,台式机),这种分离变得越来越重要。 后端应仅提供业务逻辑和数据。

技能专长

考虑开发人员的技能是该体系结构的重要方面。 例如,如果开发人员习惯于使用Java工作,则除非设计有明显的优势,否则不应该设计基于C#的系统。 这并不意味着不应使用新语言(谁说Scala和Clojure?)来提高技能。 只是必须考虑团队的生产力,并且编程语言的知识是重要的要素。

无论现有知识如何,应用程序的类型都需要一些技能。 例如,如果应用程序将网站作为表示层,则必须具有HTML,CSS和JavaScript知识。 有一些框架可以用来避免对该知识的需求(即Vaadin )。 但是,这些框架的使用只会推迟不可避免的事情:接受HTML,CSS和JS是一种浏览器可以理解的语言。 问题仅在于您是直接采用它们还是使用其他方式(即Java或C#)为您编写它们。 后一种情况可能会给人以更快的速度做事的印象,但是在许多情况下,当需要做那些“翻译”所不支持的事情时,需要付出一些代价。

服务器端更容易应对。 对于每种技能,都有更多选择,并且有好的(如果不是很好的话)解决方案。 我们可能会争论Scala是否比Java更好,但是两者都能提供足够好的结果,并且学习新语言的决定要困难得多(尽管我认为开发人员应该通过尝试新的语言和框架来不断扩展自己的知识)。 可以使用Java,Scala,C#,Clojure,JavaScript / NodeJS等对后端进行编码。我们在浏览器中没有那么奢侈的地方。 Adobe Flash已死, Silverlight从未升空。 Vaadin之类的工具最初旨在缓解JavaScript带来的痛苦,这是由于我们看到HTML和JavaScript的不断改进而逐渐失去了作用。 “浏览器”世界瞬息万变,情况与不久前大不相同。 欢迎来到HTML5的世界。

可以说对于移动设备的开发也是如此。 没有一种语言能适合所有人。 我们无法使用Java开发iPhone应用程序。 尽管在某些情况下HTML是解决方案,但在另一些情况下则需要进行“本机”开发。

唯一的常数是,无论是Web,移动设备,台式机还是Google Glass ,它们都应使用API​​与系统的其余部分进行通信。

我要提出的观点是,在完成工作所需的语言采用与每个新项目中切换到新语言之间必须保持平衡。 有些语言是必须的,有些是很好的(但不是强制性的)。 使用Web时,HTML,CSS和JavaScript是必须的。

服务器与客户端渲染

由于我们已经确定,在网站(谁说应用程序?)的情况下,带有CSS和JavaScriptHTML是必须的,而试图为我们创建HTML的工具是“邪恶的”,因此问题仍然是谁呈现HTML。 对于浏览器的大多数历史记录,我们习惯于在服务器中呈现HTML并将其发送给浏览器。 有很强的理由。 前端技术和框架还很年轻且不成熟,浏览器存在严重的兼容性问题,并且通常来说,使用JavaScript会很痛苦。 那张照片不再有效。 Google向我们展示了在许多情况下浏览器与台式机一样好。 JQuery通过让我们以相对简单的方式来操作DOM,彻底改变了我们使用JavaScript的方式。 发布了许多其他的JS框架和库。 但是,直到最近,还没有什么可以替代旧的模型视图控制器(MVC)模式。

对于所有小型站点,服务器呈现都是必须的。 还是? AngularJS改变了我们感知MVC的方式(实际上,它是模型视图的,但是我们不要被束之高阁)。 可以在客户端中完成,而不会牺牲生产力。 我认为,在许多情况下,随着AngularJS生产率的提高。 还有其他客户端MVC,例如BackboneJS和EmberJS 。 但是,就我的经验来看,AngularJS没有什么比这更好的了。

AngularJS并非没有问题。 让我们看一下客户端与服务器端页面渲染的优缺点。 在客户端,我假设使用AngularJS。 为了进行比较,服务器端可以是任何东西(Java,C#等)。

AngularJS缺点

页面呈现速度较慢,因为浏览器需要执行DOM操作的额外工作,监视绑定数据的变化,向服务器执行其他REST请求等。第一次打开应用程序时,它需要下载所有JavaScript文件。 根据应用程序的复杂性,这可能是问题,也可能不是问题。 现代计算机完全有能力接管额外的工作。 移动设备比旧计算机功能更强大。 在大多数情况下,客户不会注意到浏览器需要做的工作量增加。

与旧版浏览器的兼容性很难实现。 需要在服务器上呈现其他页面。 该参数的权重取决于您是否关心(非常)旧的浏览器。 罪魁祸首是Internet Explorer。 如果应用了其他指令,则版本8可以工作(以某种方式)。 不支持早期版本。 将来的AngularJS版本将放弃对Internet Explorer 8的支持。您可以决定是否对IE8及更早版本的支持很重要。 如果是这样,则需要提供替代页面,这将导致额外的开发时间。 根据应用程序的复杂性,非AngularJS开发中可能会存在相同的问题。

搜索引擎优化(SEO)可能是最大的问题。 目前,缓解此问题的最常用技术是在服务器上预渲染页面。 这是一个相对简单的过程,需要少量代码即可在任何屏幕上使用。 有关更多信息,请参见如何创建HTML快照? 和Prerender.io 。 2014年5月,出现了一篇关于“了解网页”的更好的文章,这给我们带来了一个好消息,那就是Google能够执行JavaScript,从而解决(或正在解决)严重依赖JS的网站的SEO问题。

AngularJS专业人士

如果性能良好(更好地使用JSON,客户端缓存等), 服务器性能将提高。 客户端和服务器之间的通信量减少了。 服务器本身不需要在将页面发送给客户端之前创建页面。 它只需要提供静态文件并使用JSON响应API调用。 减少了流量和服务器工作量。

AngularJS的设计考虑了测试需求。 连同依赖注入,模拟对象,服务和功能,编写测试非常容易(比我所使用的大多数其他情况更容易)。 单元测试和端到端测试都可以编写并快速运行。

正如架构部分所建议的,前端(几乎)完全与后端分离 。 AngularJS需要了解REST API。 服务器仍然需要传递静态文件(HTML,CSS和JavaScript),并在爬网程序访问时预渲染屏幕。 但是,这两项工作不需要系统其余部分的任何内部知识,并且可以在同一或完全不同的服务器上完成。 简单的NodeJS HTTP服务器可以达到目的。 这种解耦使我们可以独立地开发后端和前端。 通过客户端渲染,浏览器就像是Android,iPhone或桌面应用程序一样,是API使用者。

不需要服务器端编程语言的知识。 无论采用哪种方法(服务器或客户端渲染),都需要HTML / CSS / JavaScript。 不将服务器端混入此图中,将使前端开发人员的生活变得更加轻松。

Google对Angular的支持是一个加号。 像Google这样的支持者更有可能继续全力以赴地提供支持和未来的改进。

一旦习惯了AngularJS的工作方式, 开发速度就会提高。 可以大大减少代码量。 由于无需重新编译后端代码,因此我们几乎可以立即看到前端的更改。

摘要

客户端与服务器端渲染的这种视图应谨慎对待。 没有“一刀切”的解决方案。 根据使用的需求和解决方案,上面列出的许多优点和缺点都是无效的,或者也可以应用于服务器端渲染。

在许多情况下,选择服务器端渲染是为了避免陷入HTML,CSS和JavaScript。 它使习惯于使用服务器端编程语言(Java,C#等)的开发人员更加轻松地认为无需学习“浏览器”语言。 而且,在许多情况下,它会与后端代码产生(通常是无意的)耦合。 两种情况都应避免。 我并不是说服务器端渲染不可避免地会导致这些情况,而是使它们更有可能发生。

这是一个勇敢的新世界。 客户端编程与以前完全不同。 至少有很多原因可以尝试一下。 无论做出何种决定,都应使用足够的信息,只有通过实际经验才能获得这些信息。 尝试一下,不要放弃第一个障碍(会有很多障碍)。 如果您选择不采用此路线,请做出明智的决定。

像AngularJS这样的客户端MVC远非完美。 他们还比较年轻,还有很长的路要走。 许多改进即将到来,我坚信Web的未来将朝着这个方向发展。

翻译自: https://www.javacodegeeks.com/2014/07/server-vs-client-side-rendering-angularjs-vs-server-side-mvc.html

服务器与客户端渲染(AngularJS与服务器端MVC)相关推荐

  1. 客户端渲染换为服务器端渲染_服务器与客户端渲染(AngularJS与服务器端MVC)

    客户端渲染换为服务器端渲染 关于服务器与客户端应用程序渲染的讨论很多. 虽然没有"一刀切"的解决方案,但我将尝试从不同的角度主张客户端(特别是AngularJS). 首先是建筑. ...

  2. 客户端渲染换为服务器端渲染_客户端与服务器端渲染:为什么不是全部都是黑白的

    客户端渲染换为服务器端渲染 Since the dawn of time, the conventional method for getting your HTML up onto a screen ...

  3. 客户端渲染CSR、服务器端渲染SSR、预渲染Prerendering

    什么是客户端渲染 CSR 在进行SPA(单页面应用)开发时,大多数都会选择Vue.js.默认情况下,会生成vue组件,输出到浏览器,进行生成 DOM 和操作 DOM.使用vue.js开发的项目在浏览器 ...

  4. 修改软件服务器json返回数据格式,AngularJS处理服务器端返回的JSON数据的格式问题...

    用ng的$http服务发起ajax请求,php返回的JSON数据格式要正确! 一开始我的php页面是这样返回数据的: if($result){ $oid = mysqli_insert_id($con ...

  5. vnc服务器和客户端怎么配置文件,VNC服务器端与客户端配置

    环境: server:ubuntu client:Win7或ubuntu 服务器端 ubuntu 1:在VNC官网下载安装包 VNC for linux:VNC-5.0.5-Linux-x86-ANY ...

  6. 服务器端渲染(SSR)和客户端渲染

    什么是服务器端渲染和客户端渲染? 互联网早期,用户使用浏览器浏览的都是一些没有复杂逻辑的.简单的页面,这些页面都是在后端将html拼接好的然后将之返回给前端完整的html文件,浏览器拿到这个html文 ...

  7. 【SSR服务端渲染+CSR客户端渲染+post请求+get请求+总结】三种开启服务器的方法总结

    SSR服务端渲染 get请求方式 get.html文件 <form action="http://10.9.46.253:4002" target="_self&q ...

  8. 服务端渲染和客户端渲染区别?

    首先,介绍一下 SPA.SEO.SSR 三者的区别 SPA(single page application) 单页面应用,是前后端分离时提出的一种解决方案. 优点:页面之间切换快:减少了服务器压力: ...

  9. 【SSR和CSR】服务端渲染和客户端渲染区别?如何快速分辨页面是SSR还是CSR?

    首先,介绍一下 SPA.SEO.SSR 三者的区别 SPA(single page application)单页面应用,是前后端分离时提出的一种解决方案. 优点:页面之间切换快:减少了服务器压力: 缺 ...

最新文章

  1. Vivado下几条 Verilog 综合规则
  2. HDU 6070 Dirt Ratio(线段树、二分)
  3. Android按比例布局之layout_weight和weightSum的使用
  4. 【C语言基础】C语言异常捕获机制 - assert
  5. java 8 Optional解决空指针异常问题
  6. 网络摄像头转usb接口_同时读取多个摄像头数据(包括海康网络摄像头和USB摄像头)...
  7. android分享到新浪微博,认证+发送微博,
  8. SwiftyJSON用法详解
  9. android手机如何设置提高网速,安卓手机设置网络速度的详细操作步骤
  10. 双android手机同步工具,手机同步软件Android Manager使用图文教程
  11. Securing Gateways with HTTPS(0.8)
  12. 表面氨基/羧基/巯基/甲氨基功能化修饰的Fe3O4磁性纳米颗粒
  13. Variable Declarations
  14. 【经验贴】小汽车科目二科目三 经验
  15. 万能素材库_2016万能高考作文素材大全
  16. tidyverse笔记——tidyr包
  17. 华二紫竹2021年高考成绩查询时间,2019年华二紫竹升学数据分析!
  18. Baxter工作站建立及简单使用
  19. [Swift]LeetCode61. 旋转链表 | Rotate List
  20. linux如何彻底删除mysql_Linux下如何彻底删除MySQL

热门文章

  1. mysql group和order_mysql 用 group by 和 order by同时使用
  2. perform指标分析_performace 监控统计
  3. 日期相减 python_如果将excel的数字转化为日期(高级教程)
  4. 段描述符表(GDT+LDT)的有感
  5. 以Linux系统(Ubuntu)开发生活(一)
  6. Spring boot(十二):Spring boot 如何测试、打包、部署
  7. jdk 1.8 内存可见性_JDK 14中的常规,安全和确定性外部内存访问
  8. gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
  9. 将MongoDB集成到您的Spring项目中
  10. 侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器