avalon最早发布于2012.09.15,当时还只是mass Framework的一个模块,当时为了解决视图与JS代码的分耦,参考knockout开发出来。
它的依赖收集机制,视图扫描,绑定的命名data-*都与knockout差不多。它总共900行。

当时的理论体现在我在注释的这一段话:

JS UI Component 最终还是通过 HTML 来描述界面,当 js object 的数据发生变化或者执行某个动作时, 需要通知到对应的html,使其发生相应变化。于是js object 需要得到他在页面上对应的html的句柄, 通常做法,是在创建html的时候将createElement返回的句柄保存在js object 内部的某个变量中,或者赋值给html eLement一个唯一的ID,js object 根据这个ID来找到对应的HTML Element。同样, 当htm elementl的事件(例如onclick)要通知到相对应的 js object 或者回调js object的某个方法或属性时,也需要得到该js object的一个引用。我的意思是建立一种统一的规则,js object和他相对应的 html 能通过这种规则互相访问到对方。 建立这个关联以后,实现js object和
对应 html 的数据邦定和数据同步等问题就简单多了。

此后几个月还继续开发mass Framework的其他模块,还没有完全压注于MVVM。

2012.12.11发布0.2版,已经对knockout大多数源码进行消化,因此代码量降到730行。但功能还是残缺,不能绑定事件。

avalon也建立对应的概念来指导自己的发展:

位于VM中的原子监控者,依赖监控者,监控数组与绑定监控者。原子监控者对应ko的监控属性,它是由M中字段抽象而成,是一个函数。依赖监控者对应ko的依赖监控属性。在VM中,有些字段是建立在M的两个或多个字段的基础上。比如fullName 对应为 firstName+” ”+lastName,但在M中是找不到它的跟影,但它在视图中却又是一个独立的个体,有专门的文本域给它。绑定监控者是我独创的,它是根据视图中的数据绑定转化而为,在ko中这些依然称之为依赖监控属性。但这一类监控函数分明是真正用于连结DOM树与VM的。它通过框架提供的默认绑定器将自己中数据渲染到DOM中。它的结构比一般的依赖监控属性复杂多了。

依赖监控属性,knouckoutjs称之为Dependent Observables,在另一个著名的emberjs框架中,它叫做computed。在绑定监控者这类东西显然不需要返回值,它一般将比它低一级的原子监控者,依赖监控者当作事件回调来监控用户行为就行了。当用户改变了文本域的值,就相当于对这个原子监控者进行写入,从而引发整条依赖的更新。绑定监控者是与DOM树某个节点或某一些节点交道,当底层涌上来的变动要求它也刷新时,它就调用框架自带的绑定器进行干活。因此你看到绑定器都有一个叫update的函数,就是干这事。

位于视图中的声明式绑定,我使用bind,但也可以配置你喜欢的属性名。我个人喜欢称之为数据绑定,其实它还兼容流程控制,事件绑定的活儿。

位于视图中的动态模板,就是那些被声明式绑定圈起来的区域。动态模板与流程绑定最密切,它的实现好坏,牵及到最小化刷新的实现与内存的占有率。这个v2有实现比knouckout要高明多了

avalon在数据绑定上做了许多友好的改进,虽然与knouckoutjs一样支持表达式,是没有花括号的JSON。但它要求用户不用写双引号,这辛苦活由框架去实现了。

avalon的自带绑定器有text绑定,html绑定,value绑定,class绑定,style绑定,attr绑定,display绑定,checked绑定,with绑定,if绑定,unless绑定,foreach绑定

两天后发布0.3版,这是avalon第一次脱胎换骨,不再使用knockout将监控属性转换为函数的wrapper方式,改成Object.defineProperty构建它的双向绑定链,并且参考rivetsjs对绑定属性重新设计,不过绑定属性的前缀还是使用data-*

avalon在用户体验上第一次走上世界前列。不过当时avalon还不叫avalon,但我还是很满意,之后几个星期我写一个系列的教程(还有著名的todos例子)来介绍它。这期间还抽空看了bootstrap源码,也写了一个系列的相关博文,被网友们视为bs高手了。但mass Framework的升级工作还在进行,这占了我大量的时间。把自己做的事全部记录在博客就有这个好处,完成掌握自己的成长线路。我也不明白自己为什么如此纠结了mass Framework,它在各方面已经没有翻身的可能了。人付出越多,就不易放弃吧。这是赌徒心态。我的确在这上面耗了太多时间与精力,幸好它与avalon在许多技术之上有传承之处。像那些一会儿跳到JS,一会儿跳到java,一会儿跳到oc,这是多么惨的自杀行为啊。

2013.3.15起,我发表一篇叫《第一个vbscript程序》 的博文,开始着手解决avalon在旧式IE的兼容问题,切入点就是VBScript的set, get, let语句。

2013.04.25发布0.4,这是它第2次脱胎换骨,完全从mass Framework中独立出来,绑定属性改为我们熟悉的ms,并且拥有avalon.define、avalon.scan这两个方法。VBScript技术已经学以致用,Object.defineProperty终于在旧式IE实现兼容,这是其他MVVM不可想象的。

2013.05.1发布0.5,VM中添加 $id, $events, $watch, $unwatch, $skipArray, $xxx等属性与方法,可以说avalon的VM设计在这一版上定稿,
视图上添加ms-controller,ms-important, ms-skip等绑定,并且在内部整合一个迷你的jQuery对象,增强其DOM处理能力。

2013.05.07开始,编程重心转向avalon,
进入了小版本发布时代,0.6x起添加mouseleave, mouseenter的跨浏览器支持;添加ms-css绑定,添加addClass, removeClass, toggleClass方法;
并着手开发它的UI库,当时它的类名与结构都是用jquery UI搬过来的。那个时候攒到第一批国内用户了。

2013.05.25发布0.7,添加ms-template绑定(也就是日后的ms-incluce绑定) ms-attr绑定及全新的扫描机制。avalon与knockout在实现上越来越远,并且对其大东家mass Framework也在
0.7.2中正式分道扬镳。从博客园评论的分享来看, avalon的使用用户达到几十人了。0.7.3中去掉从knockout抄过来的ms-options绑定,VM里废弃$scope, $json,
重命名为更直观的$vmodel与$model。avalon源码也在这个版本里走无分号的风格。

2013.06.22发布0.8,由于换了新公司,接触到angular,尝试整合angular与requirejs,深深感到自带加载器的用处,于是将我发展了20多个版本号的并行加载器放进avalon里了。此外,avalon.mobile.js也要这个版本出现。0.81处理管道符与||运算符相混淆的BUG。 0.82里实现新parser。0.83可以配置插值表达式的界定符,ms-template改名为ms-include。 0.84规定ms-incude的值不能为空。
0.85改进ms-each。
以上就是0.8x上的一些重大改进,当然期间还肯定修改N多BUG,但这里介绍的都是对后面版本有重大影响的改进。
由于第一次有公司由我亲手操控来使用avalon,因此avalon在此期间的升级是相当频繁的。

2013.07.20发布0.9,引进ms-with。0.91fix BUG。
0.92添加ms-class的新风格支持。
0.93添加ms-duplex-radio绑定。
0.94引入绑定属性间的优先级,规则哪一个比哪个先执行。
0.95改进ms-with 深层绑定的实现。
0.96性能优化与 fix BUG。
以上就是0.8x上的一些重大改进,当然期间还肯定修改N多BUG,但这里介绍的都是对后面版本有重大影响的改进。

0.97性 王之三柱臣全部就位!

0.98修正大量BUG,添加ms-widget绑定,废弃ms-ui绑定。一些avalon用户做的东西可以放出来让大家了。 0.99为正式发布做冲刺,也修了大量BUG,移弃ms-bind绑定。 贯彻在0.9x中的梦魇是 ms-each、ms-with与ms-if这三个版本的升级与优化。ms-if的实现甚至在期间出现回滚。

2013.01.13发布1.0,这是一个重要的版本,因此在当时的博文也大肆宣扬一番
(GITHUB上的贡献人数达到8人,issues二百多个主题,各种组件也不断完善)。但它很短命,就像中华民国的临时大总统那样,只是一个标识——
它过早地引进了一些不确定的实现方案。

2014.01.26发布1.1,直接没有1.0.x了。
许多东西都回到0.9x,并将期间发现的新解决方案加进去。它也有一些全新的东西,
如ms-if-loop绑定,data-with-sorted回调,data-duplex-changed回调。现在大家用到的API,基本上在这个版本上稳定下来。加之,用户量的庞大,
也让我不敢轻易改它的API。

2014.02.19发布1.2,直接没有1.1.x了。精力是优化,优化,优化!
如input.value被框架重写了,方便与第三方组件共存。循环绑定内部渐渐改进你们现在看到的模样。尤其在
1.2.4里,
各种代理VM已经使用池技术进行创建与回收(createWithProxy, createEachProxy);
1.2.5升级ms-widget;
1.2.6除了修BUG外,开始开发新一代UI库Oni

总结这几个版本,0.8x, 0.9x都比较长命,那是我有工作有空闲开发avalon。1.0、1.1、1.2x比较短命,
因此我丢了饭碗,当然1.2x期间我又很快找到工作。

2014.05.26发布1.3,这预计也是个长命的版本,主要是性能改进与BUG fix。
全职开发框架的感觉真好。但公司要兼容IE6,各种奇葩的BUG层出不穷,从各种业务线汇总在我这里,因此avalon.mobile的升级其实一直拖滞。
这期间,我开发了avalon.observe.js,发掘了全新的静态收集依赖的技术,这本来是要应用于1.4x里的,但现在也没这时间了。三柱臣的升级也逼在眉睫。
avalon现在已经有20个贡献者了,但相对于外国的项目来说,这个数目也是微乎其微,希望能有更多人加入这个国产项目。我可以打票说,
avalon是世界最好的MVVM框架,设计优良精巧,3000行的代码能实现其他MVVM框架用1W多行才能实现的效果。尤其是avalon对IE6上的兼容,
及已经对Object.observe的实战上,这也是其他MVVM框架所难企及的。

迷你MVVM框架 avalonjs 学习教程19、avalon历史回顾的更多相关文章

  1. 迷你MVVM框架 avalonjs 学习教程1、引入avalon

    avalon是国内最强大的MVVM框架,没有之一,虽然淘宝KISSY团队也搞了两个MVVM框架,但都无疾而终.其他的MVVM框架都没几个.也只有外国人与像我这样闲的架构师才有时间钻研这东西.我很早之前 ...

  2. 迷你MVVM框架 avalonjs 学习教程18、一步步做一个todoMVC

    大凡出名的MVC,MVVM框架都有todo例子,我们也搞一下看看avalon是否这么便宜. 我们先从react的todo例子中扒一下HTML与CSS用用. <!doctype html> ...

  3. 迷你MVVM框架 avalonjs 学习教程16、过滤器

    avalon的过滤器是参考自angular与rivets.它也被称做管道文本过滤器,它的处理对象只能是文本(字符串),它只能用在文本绑定中,并且只能是双花括号形式.下面是各大家的过滤器比较: rive ...

  4. 迷你MVVM框架 avalonjs 学习教程3、绑定属性与扫描机制

    在MVVM框架中,你都会看到页面定了许多奇怪的属性,比如knockout的data-☆,angular的ng-☆,avalon的ms-☆,此外还有一些只写文本节点上的双花括号,它们统称为指令.ms-☆ ...

  5. 迷你MVVM框架 avalonjs 学习教程22、avalon性能大揭密

    avalon之所以能在页面处理1W个绑定(angular对应的数字是2000),出于两个重要设计--基于事件驱动的双向绑定链及智能CG回收机制. avalon的双向绑定链是通过Object.defin ...

  6. 迷你MVVM框架 avalonjs 学习教程17、avalon的一些配置项

    本章节,主要是介绍avalon.config方法,通过它来制定一些更贴心的功能. 一般情况下,我们在使用ms-controller绑定时,需要添加一个ms-controller类名,目的是为了防止网速 ...

  7. 迷你MVVM框架 avalonjs 学习教程20、路由系统

    SPA的成功离开不这三个东西,分层架构,路由系统,储存系统.分层架构是我们组织复杂代码的关键,这里特指MVVM的avalon:路由系统是将多个页面压缩在一个页面的关键:储存系统特指本地储存,是安全保存 ...

  8. 迷你MVVM框架 avalonjs 学习教程11、循环操作

    avalon是通过ms-repeat实现对一组数据的批量输出.这一组数据可以是一个数组,也可以是一个哈希(或叫对象).我们先从数组说起吧. 第二节就说,凡是定义在VM中的数组,如果没有以$开头或者没放 ...

  9. 迷你MVVM框架 avalonjs 学习教程4、数据填充

    MVVM是前端的究极解决方案,你们可能用过jQuery,但那个写的代码不易维护:你们可以听过说requirejs与seajs,传说中的模块开发,加载器,但它们的最终目标是打包:你们可能听过unders ...

随机推荐

  1. map的put和putIfAbsent使用

    源码中传入key和value,根据key获取看是否存在value,如果value==null,然后调用put方法把传入的key和value  put进map,返回根据key获取的老value 意思就是 ...

  2. ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]

    由于项目需要,我在搭建了新的开发环境后,需要将之前环境中的ORACLE数据库导出,再导入到新的开发环境下.当导出导入完成后,使用数据库进行添加操作时 发现针对很多表的添加操作报错,具体报错原因描述为: ...

  3. Spring3 MVC请求参数获取的几种方法[转载]

    http://www.cnblogs.com/leiOOlei/p/3658147.html 一.      通过@PathVariabl获取路径中的参数 @RequestMapping(value= ...

  4. 百度地图JavaScript如何清除指定类型的覆盖物

    由于一个地图中有很多种类型的覆盖物,由于某个覆盖物(一般是自定义)整个地图中只允许出现一次 那第一想到的就是,每次创建这个类型的覆盖物时先清除这一类型的覆盖物,比较简单判断覆盖物的类型 instanc ...

  5. WCF揭秘学习笔记(5):WF定制活动

    WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...

  6. android开发常用组件【持续更新中。。。】

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  7. 协同过滤CF算法之入门

    数据规整 首先将评分数据从 ratings.dat 中读出到一个 DataFrame 里: >>> import pandas as pd In [2]: import pandas ...

  8. Nginx的ip_hash指令

    ip_hash 语法:ip_hash 默认值:none 使用环境:upstream 当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服 ...

  9. bitmap运算

    概述 所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素.由于采用bit为单位来存储数据,因此在可以大大的节省存储空间     算法思想 32位机器上,一个整形,比 ...

  10. MySQL数据库储存引擎Inoodb一--记录储存结构

    在开文我先说明一下,接下来的数据库知识文章都是在微信公众号“我们都是小青蛙”学习然后在通过自己的理解进行书写的.有兴趣的朋友可以去关注这个微信公众号.话不多说,我们在日常使用数据库进行数据持 久化的时 ...