Web界面编程状态变化和JS开发框架(React/Angular/Ember)

techbrood 发表于 2016-12-11 18:46:50

标签: javascript, framework, state, change

- +

UI编程中的一个关键课题就是界面组件化(可复用)以及组件状态管理。

稍早一些的windows程序员可能接触过MFC,其界面编程中有一个DDX(DoDataExchange)的机制,用来绑定界面组件和数据成员。

通过这样的绑定,由框架来负责当数据发生变化时完成相应UI的更新,而无需开发者编写代码,这无疑简化了编程。

而在早期的Web开发中,数据都是通过后台程序提供,所以UI的更新一般都是通过页面刷新或者局部Ajax请求来完成的,并没有一个独立的状态管理概念,如果说有状态,那么状态也是由后台进行远端管理的,前端只是负责构建文档并渲染。

这样当然是简单的,但同时也是低效的。

为了应对组件化和状态变更管理这些UI编程的基本要求,业界先后发展了一些JS开发框架。

Backbone.js:事件通知

Backbone.js和ExtJS属于第一代JS组件化开发框架,提供可复用的界面组件,如按钮、表单、表格等。

这些框架的思想是提供了事件通知接口,但具体内容的处理留给开发者。

When the model changes, an event is produced but the updating of the UI is not covered by the framework

开发者需要去处理细节,并考虑性能方面的影响,这样就会比较麻烦些。

Ember.js:数据绑定(Data Binding)

Ember通过类似DDX的方式绑定了数据和界面组件。该框架像Backbone一样发送事件,但是不同的是,Ember框架同时处理事件的接收,并完成界面更新,这意味着有一个侦听器用于更新连接到用户界面的事件。当接收到一个事件时,该侦听器知道要做什么。

When the model changes, a binding updates the relevant locations in the DOM

这个方式下,Ember完全掌控控件数据和视图,缺点是Ember必须始终注意到数据模型中发生的变化,数据模型必须继承Ember特定的API接口。

AngularJS:脏数据检查(Dirty Check)

和Ember一样,Angular也帮助处理数据更新的细节,但和Ember主动通知的设计思路不同,Angular采用了一种观察者模式,当应用程序状态发生改变时,Angular检查每个被观察的对象,如果发现有变化,则执行更新:

Changes in the model are being actively watched from watchers set up in view templates

这样的好处是数据模型(Model)要轻量和灵活些,不需要遵循特定接口,缺点是model没有主动性,比较“傻瓜”,必须有人从外部来检查它的变化。每次点击、HTTP应答和超时处理都将触发一个digest程序,来执行这些watchers。

ECMAScript 7中的Object.observe特性将帮助简化watchers的动作。

React:虚拟DOM(Virtual Dom)

React在状态变更处理中,使用了一种貌似偷懒的方法,既不用通知,也不用观察,而是完全“重绘”,看起来好像和服务器重绘一样,但技巧就在于服务器重绘是绘制真实的DOM,而React引入了一个虚拟DOM的概念,这个虚拟DOM是一个轻量级的JS简单对象(PO),在这个对象上操作要远比真实DOM要快得多。第一次绘制时,建立虚拟DOM:

The model is first projected to a Virtual DOM, which is then rendered to a real DOM

发生变化后,React创建一个新的虚拟DOM,比较和上次虚拟DOM的区别,然后把差异部分在真实DOM上更新。

When the model changes, the Virtual DOM is re-rendered. The two version of the virtual DOM are compared, and the changes patched in the real DOM

所以React的性能取决于比较程序是否足够有效和智能,优点是消除了状态跟踪,缺点显然是占用了较多的内存。

还有一些方案如增量DOM,是内存和性能的折衷,这里不再赘述。

possitive(17) views6959 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • Monaco Editor 编辑器拷贝粘贴功能调用和获取选中文本

    有时候需要在monaco editor外部调用编辑器的内置功能比如希望在页面主工具栏实现一些快捷操作。button

  • WebGL Roadmap

    Unity 5.0 shipped with a working preview of our WebGL technology in March this year. Since then, Google has disabled (by default) NPAPI support in the...

  • CSS3特性查询(Feature Query: @supports)功能简介

    这是2017年不能不了解和学习的一个CSS新特性,非常实用,考虑到现实世界浏览器的复杂性,该特性本应该先于其他新特性出来。我们已经知道使用媒体查询(Media Que...

  • React JSX语法简介

    JSX是一种类似XML的标签语法,用来简化代码,我们可以不使用JSX,但了解并使用也没什么坏处:)在React中,JSX是一个使用 React.createElement() API的快捷方式...

  • JavaScript事件模型图解

    在JavaScript中用户交互的核心部分就是事件处理。本文为对事件模型和处理机制的总体性描述。Event是什么?
    event是用户操作网页时发生的交互动作,比如clic...

  • CSS3弹性布局弹性流(flex-flow)属性详解和实例

    弹性布局是CSS3引入的强大的布局方式,用来替代以前Web开发人员使用的一些复杂而易错hacks方法(如使用float进行类似流式布局)。其中flex-flow是flex-direction...

  • 粒子运动模拟 - Verlet积分算法简介

    Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域...

  • 如何使用Three.js加载obj和mtl文件

    OBJ和MTL是3D模型的几何模型文件和材料文件。在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃。现在要加载OBJ和MTL文件,需要结合OBJLoader和MTLLoade...

  • Three.js入门教程2 - 着色器(下)

    这是WebGL着色器教程的后半部分,如果你没看过前一篇,阅读这一篇教程可能会使你感到困惑,建议你翻阅前面的教程。

  • CSS3图片混合(Blend)效果及其参考计算公式一览表

    在Photoshop软件中,混合是将两个图层的色彩值进行合成,从而创造出大量的效果。在这些效果的背后实际是一些简单的数学公式在起作用。下面所介绍的公式仅适用于R...

  • 如何使用WebGL实现空气高温热变形动画特效

    我们在炎炎夏日,或者在火堆旁,经常会观察到热源周围空气的不稳定波动现象。本文将讲解如何通过WebGL来实现这个特效。该效果可用于热变形、波浪、水面波光等场...

  • 浏览器控制台报JS脚本执行错误:Module is not defined

    现在JS分成了两个分支,一部分在服务器端发展如NodeJS,一部分是传统的浏览器运行环境。
    有些插件在编写JS代码时,是针对Node编写的,所以直接在浏览器中使...

  • WebGL入门教程1 - 3D绘图基础知识

    现代浏览器努力使得Web用户体验更为丰富,而WebGL正处于这样的技术生态系统的中心位置。其应用范围覆盖在线游戏、大数据可视化、计算机辅助设计、虚拟现实以及数...

  • 更多...