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

客户端渲染换为服务器端渲染

关于服务器与客户端应用程序渲染的讨论很多。 虽然没有“一刀切”的解决方案,但我将尝试从不同的角度主张客户端(特别是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服务器可以达到目的。 这种解耦使我们可以独立地开发后端和前端。 通过客户端渲染,浏览器是API使用者,就像Android,iPhone或桌面应用程序一样。

不需要服务器端编程语言的知识。 无论采用哪种方法(服务器或客户端渲染),都需要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

客户端渲染换为服务器端渲染

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3 array为什么不能放不同类型的数据_来自俄罗斯的凶猛彪悍的分析数据库ClickHouse...

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!ClickHouse相关文章推荐:战斗民族开源 | ClickHo…

php mysql 实现原理_PHP底层和mysql的通信原理

要清楚的几个概念:FPM进程:进程数在php-fpm.ini中设置。没有设置 max_requests ,那么进程是不会销毁的,也就是说当一个进程里面出现死循环或者内存溢出等导致进程僵死的情况出现的时候,处理的进程就会少一个。mysql连接…

通过READ-BEHIND CACHE来控制缓慢的生产者

在我们的互联世界中,我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利,他们的表现就会很好,每个人都会感到高兴。 但是太多次,我们不得不使用延迟小于最佳延迟的 API。 当然,答案是缓存该数据 。 但是&…

mysql用户名锁定_MySQL用户锁定

修改方式:set global log_warnings2;MySQL 5.5版本官方文档中,并没有用户锁的状态。因此不存在用户会被锁。。The account-locking capability depends on the presence of the account_locked column in themysql.user table. For upgrades to MySQL 5.…

python package和目录_PyCharm中Directory与Python package的区别

对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清…

mysql过滤器_MYSQL复制过滤器

vim /etc/my.cnf.d/mariadb-server.cnf[mysqld]binlog-do-dbdb1 #白名单模式,仅允许主服务器上生成db1的二进制日志,此选项不支持一行指定多个参数,需要每个参数写一行binlog-do-dbdb2重启服务systemctl restart mariadb.service主服务器…

mysql锁表查询_Mysql数据库锁情况下开启备份导致数据库无法访问处理分享

[背景简介]MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。mysql虽然功能未必很强大,但因为它的开源、广泛传播&#xf…

junit编写测试代码_编写数据访问代码测试-不测试框架

junit编写测试代码当我们向数据访问代码编写测试时,是否应该测试其公共API的每种方法? 一开始听起来很自然。 毕竟,如果我们不测试所有内容,那么如何知道我们的代码可以按预期工作? 这个问题为我们提供了重要的线索&…

mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式

windows 命令行中有2种执行 .sql 文件的方式:直接行文件 和 先进入mysql命令行然后执行文件。具体操作如下:1. 直接在windows命令行执行。打开windows命令行(winR打开运行窗口然后输入cmd,回车),进入mysql的本机地址,如果配置了环…

python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]

练习内容:判断多个坐标是否在同一条直线上完整代码和注释如下print(请输入几个点的横纵坐标,程序将会返回这几个点是否在同一条直线上)def coor_nums():#获得每个值的横纵坐标int_list[]#初始化坐标列表wrong_list[]#初始化错误列表judgement#判断是否需要修正坐标值while True…

Java大数据处理的流行框架

大数据挑战 在公司需要处理不断增长的数据量的各个领域中,对大数据的概念有不同的理解。 在大多数这些情况下,需要以某种方式设计所考虑的系统,以便能够处理该数据,而不会随着数据大小的增加而牺牲吞吐量。 从本质上讲&#xff0c…

工信部python证书多少钱_python requests SSL证书问题

错误信息如下:requests.exceptions.SSLError: ("bad handshake: Error([(SSL routines, tls_process_server_certificate, certificate verify failed)],)",)python做爬虫,对于有的网站,需要验证证书,比如:1…

mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复

[toc]1. 需求部分1.1 基于MySQL复制同步特性,尝试使用Replication的SQL线程来回放binlog,可基于以下逻辑模拟场景做全量xtrabackup备份模拟日常备份执行sysbench压测4张表,20个线程,压测10分钟,模拟大量binlog删除实例…

带有Prometheus的Spring Boot和测微表第6部分:保护指标

以前,我们使用Prometheus成功启动了Spring Boot应用程序。 Spring应用程序中的一个端点正在公开我们的指标数据,以便Prometheus能够检索它们。 想到的主要问题是如何保护此信息。 Spring已经为我们提供了强大的安全框架 因此,将其轻松用于…

列举python中常用的数据类型_列举Python常用数据类型并尽量多的写出其中的方法...

#1 把字符串的第一个字符大写string.capitalize()#2 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串string.center(width)#3 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数string.count(str, beg0, endl…

mysql 二元分词_MySQL 中文分词原理

一,首先我们来了解一下其他几个知识点:1. Mysql的索引意义?索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除…

python 元类 type_Python 使用元类type创建类对象常见应用详解

本文实例讲述了Python 使用元类type创建类对象。分享给大家供大家参考,具体如下:type("123") 可以查看变量的类型;同时 type("类名",(父类),{类属性:值,类属性2:值}) 可以创建一个类。在Python中不建议一个函数具有不同的功能(重载)…

使用AWS Elastic Beanstalk轻松进行Spring Boot部署

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认谁在发出请求&…

mysql报错乱码_连接mysql服务器报错时,出现乱码

页头用了header(content-type:text/html;charsetutf-8);try{$this->dbonew PDO($dsn,$dbuser,$dbpassword);}catch(Exception $e){echo $e->getMessage();}连接失败时会报错,但是乱码,IE下编码查看是UTF-8,但是是乱码,如果选…

自学python条件_自学Python2.8-条件(if、if...else)

自学Python2.8-条件(if、if...else)1.if 判断语句if语句是用来进行判断的,其使用格式如下:if 要判断的条件:条件成立时,要做的事情当“判断条件”成立(True)时,才执行语句;反之,则不执行。执行语句可以为多…