《Ember.js实战》——1.2 从静态页面到Ajax、再到全功能Web应用

1.2 从静态页面到Ajax、再到全功能Web应用

从20世纪90年代中期引入万维网(WWW或W3),到21世纪00年代中期Ajax出现之前,大多数的网站本质上是静态网站。服务器端通过一个HTTP响应来应答所有HTTP页面请求,该响应包含了显示一个完整页面所需的全部HTML、CSS和JavaScript代码,如图1-3左半部分所示。

虽然许多网站仍然如图1-3左半部分所示那样,依赖于整页刷新的方式,但越来越多的开发者都在创建动态内容。今天,用户希望在体验网站时能够做到页面不要刷新。

1.2.1 异步Web应用的兴起
随着异步调用功能的引入,其提供了为每个响应发送特定内容的能力。客户端有专门接受这个响应的JavaScript代码,并会替换网站中所有相关的HTML元素内容,如图1-3右半部分所示。这看起来很好,但这种方式存在一个很大的问题。

在服务器端实现一个服务是很容易的事情:给出一个元素类型,呈现元素的新内容,并以原子级的完整方式返回给浏览器。如果这就是富Web应用用户所需,那就没那么多麻烦了。但问题是用户极少一次只更新一个元素。

比如,当你浏览在线商店的时候,会搜索商品项并将其添加到个人的购物车中。但添加一项商品到购物车时,你理所当然希望商品数量以及购物车商品总金额也相应更新。这样你才知道购物车里的商品总数以及总金额到底有多少。

由于服务器端在每个Ajax响应中应该明确包含哪些元素的规则很难定义,大多数服务器端框架都直接发送整个页面给客户端。同时,客户端知道应该用哪个元素替换/互换对应的HTML元素。

如你猜到的,这种方式效率很低,其意味着增加了大量客户端发送到服务器端的HTTP请求,而这正是Ember.js的用武之地。作为一名开发者,你或许理解图1-3所示模型的问题所在,服务器端为页面上单个元素返回更新过的标记,而要更新多个元素,你就需要采取以下的某种方式。

  • 要求浏览器为每个要更新的元素触发额外的Ajax请求。
  • 时刻记住——同时在客户端和服务器端——针对用户在应用中执行的每个操作,都要相应更新元素。

第一种方式增加了HTTP调用服务器端的次数;第二种方式需要你在客户端和服务器端同时管理用户状态。因此,这大大增加了HTTP请求的次数,导致服务器端负担加重,但又无法减少服务器端处理每个请求的工作量。别误解了,这种模型下,通过判断元素标识符来替代元素,以及挑选出服务器端所返回完整标记中的特定元素,是可以支持局部页面更新的。但如你所想,这种模式同时浪费了服务器端和客户端的资源。图1-4说明了这种结构。

理想情况下,我们希望只在初始时服务器端将完整应用一次性传送给客户端。当整个应用加载后,客户端只需提交数据请求。伴随这种想法让我们进入Ember.js使用的模型。

1.2.2 Ember.js模型
以往,大多数网站忽视在服务器端与客户端间传递标记,而更关注数据传递。这正是Ember.js擅长的领域,如图1-5所示。

在图1-5中,用户在初次请求发出后一次性接收完整的网站。这将导致两件事情发生:增加初次加载的时间,但也意味着随后每次用户操作时性能得到提升。

实际上,图1-5所示的模型与可追溯到20世纪70年代的传统客户端/服务器端模型类似,但有两个重要的区别:初始请求充当客户端应用程序高度可行且可定制的分发渠道,同时确保所有客户端遵循一套通用的 Web 标准(HTML、CSS、JavaScript和其他)。

随着客户端/服务器端模型提出,涉及用户交互的业务逻辑、GUI(图形用户界面),以及执行逻辑已从服务器端转移到了客户端来处理。对特定部署而言这种转移会带来一定的安全问题,但在通常情况下,只要服务器端控制着所请求数据的访问权,安全事宜就可以委托给所属的服务器。随着客户端和服务器端职责的清晰分离,客户端和服务器端就可以各司其职——分别关注用户界面和数据处理。

现在你理解了通过Ember.js创建的Web应用程序的类型,接下来将进入到Ember.js内部。

时间: 2024-07-31 11:56:37

《Ember.js实战》——1.2 从静态页面到Ajax、再到全功能Web应用的相关文章

《Ember.js实战》——导读

前言 2006年起,我已经以某种方式进行Web应用开发.我开始为挪威最大的零售商开发Web应用,先是使用JavaServer Pages(JSP)技术,之后换成JavaServer Faces(JSF).当时这些技术很不错,并能让使用者达到使用目的.在那时(Ajax流行之前),HTTP的请求-响应周期要求将大多数处理逻辑放在服务器端,服务器端在每次请求中传递所有标记.脚本和样式表给浏览器. 虽然以服务器端方式开发Web应用也能行之有效,但状态问题总是绕不开的.由于服务器端要求记住所有登录用户,管

《Ember.js实战》——第1章 发力雄心勃勃的Web应用 1.1 Ember.js适用场景

第一部分 Ember.js基础 JavaScript MVC框架Ember.js用于组织大型Web应用代码结构.与其他流行的JavaScript应用框架相比,其具有更完整的MVC模式特征,并包含创建新一代Web应用所需特性.它自信满满,严格依赖约定优于配置的设计范式来构造应用程序. 由于包含大量特性及应用约定,Ember.js的学习曲线比较陡峭.本书第一部分包含4章内容,帮你尽快找到Ember.js开发的感觉,并确保你从一开始就能有所成. 第1章 发力雄心勃勃的Web应用 本章涵盖的内容 单页面

《Ember.js实战》——1.4 第一个Ember.js应用程序:记事本应用

1.4 第一个Ember.js应用程序:记事本应用 记事本应用大约有200行程序代码(包括模板和JavaScript代码)以及130行CSS代码.你完全可以在Windows.Mac以及Linux等各种操作系统上使用你喜爱的编辑器来开发并运行这个应用. 提示 我使用JetBrains WebStorm来编写JavaScript应用,但这对你来说不是必需的. 你将通过编写一个简单的记事本Web管理应用来一探Ember.js.该应用功能如下. 添加新事项--应用提供了用户添加事项的专用区域. 选择.查

《Ember.js实战》——第2章 Ember.js风格 2.1 绑定对象

第2章 Ember.js风格 本章涵盖的内容 绑定的工作方式,以及它们对编程风格的影响 自动更新模板的使用 如何及何时使用计算属性及观察者(Observer)模式 Ember.js对象及类模型 本章将在第1章代码的基础上详细阐述Ember.js框架中最具特色的知识点.Ember.js最关键的设计目标之一就是提供完整.合理的默认实现以避免开发者必须自己创建大量样板代码.Ember.js通过默认设置来满足大多数Web应用的需要,并允许开发者在合适之处轻松覆写这些默认设置.有了这些完备选择,我们就可以

《Ember.js实战》——1.3 Ember.js概览

1.3 Ember.js概览 Ember.js起源于SproutCore框架的第二个版本.在SproutCore 2.0开发期间,SproutCore团队成员已经清楚地认识到,如果想要创建满足目标广泛的Web应用程序的需要,并且体积还保持小巧的易用框架,SproutCore框架的底层结构就需要有个根本改变. SproutCore简介 SproutCore是一个用高度面向组件编程模型开发出来的框架.SproutCore的大多数概念都是从Apple的Cocoa借鉴来的,而Apple也使用Sprout

《Ember.js实战》——2.5 Ember.js对象模型

2.5 Ember.js对象模型 Ember.js扩展了JavaScript默认对象类的定义,以构建一个更强大的对象模型.此外,Ember.js还支持基于混入类的方式,在模块与模块之间.应用与应用之间共享代码. 你可能想了解Ember.js是怎样知道某个属性发生改变的,以及它何时触发观察者函数和绑定对象.同时你可能还注意到,Ember.js总是要求使get()和set()方法来获取或修改Ember.Object子类对象的属性.当在一个属性上调用set()方法,Ember.js就会检查更新值与对象

《Ember.js实战》——2.6 Ember.js实现各层间数据同步

2.6 Ember.js实现各层间数据同步 本章前面我们看到了一个数据同步模型,其可以确保数据始终在客户端和服务器端之间保持同步(见图2-2).在这个模型中,应用程序8个步骤中就有6个需要显式跟踪并关注应用程序内部状态.反观Ember.js框架如何使用绑定.控制器以及清晰的模型层来尽可能多地自动化样板代码,孰优孰劣就很清楚了.图2-8展示了一个改进后的概念模型. Ember.js方式的步骤减少了,这是因为我们把更多的样板代码留给了Ember.js框架,而你仍完全掌控着应用的数据流.与前面模型相比

《Ember.js实战》——2.2 自动更新模板

2.2 自动更新模板 Ember.js默认使用Handlebars.js模板引擎.Ember Handlebars实现的一个关键点是无论何时将模板与底层数据联系起来,Ember.js都会在应用各层之间创建双向绑定.在第1章记事本应用程序开发过程中你已经了解了相关工作机制. 思考一下代码清单2-2里的notes/note模板代码. 代码清单2-2 重访notes/note模板 这个示例中包含了两种绑定,第一种是通过Handlebars表达式实现模板绑定:第二种是通过Binding关键字在自定义视图

《Ember.js实战》——2.3 计算属性

2.3 计算属性 计算属性是一个函数,其返回一个从其他变量或表达式(也可以是其他计算属性)获取的值.计算属性与普通JavaScript函数之间的区别在于,Ember.js将计算属性看作其真正的属性.因此,就可以在计算属性上调用get()和set()等`方法,以及绑定/观察它们(观察者概念在本章稍后介绍).通常,在模型对象中定义计算属性,并在控制器和视图中使用它. 目前的记事本应用程序还没用上计算属性,但如果你想增强应用程序功能,在界面左边的事项列表中显示每条事项前20个字符的内容,那么,就请忘掉