下面是Riot和其它流行的客户端框架文件大小比较:
很明显,Riot的是最小的,而且框架的大小会影响到以下几个方面:
如果你的工具是其它消费应用而用的,那么其大小可能更加重要。
Riot使用Model-View-Presenter (MVP)设计模式来组织代码,这样它能够更模块化、更具可测试性且易于理解。
正如在MVC(模型-视图-控制器)或MVVM(模型-视图-视图模型)模式里,其目的是从应用程序的视图中分离逻辑,但MVP更简单。让我们把它和MVC比较一下:
MVC模式更复杂。许多箭头围成一个圈。控制器的角色不明确,这种模式可以以许多不同的方式解释。事实上,这是造成有太多该模式下客户端框架的根本原因。
MVP则相反,没有太多的解释空间,歧义少。每部分的作用是明确的。它适合大大大小小的工程,是单元测试的最佳模式。
让我们看一下MVP在Riot中是如何工作的。
Riot的models定义了你的应用。 它是你的商业逻辑对外提供的一个深思熟虑后的API。一个完全隔离的、可在浏览器和服务器端(node.js)运行的可测试单元。下面是一个待办事项应用。
function Todo(store) { var self = this, items = []; self.add = function(label) { var item = { ... }; items.push(item); // notify others self.emit("add", item); } self.remove = function(id) { delete items[id]; self.emit("remove", item); } // + other public methods ... // Enable MVP pattern (this is the secret for everything) $.observable(self); // save state self.on("add remove edit", function() { store.put(items); }) }
这个Model是一个传统的JavaScript对象(POJO),没有框架风格。在MVC的术语中,这是一个域模型而不仅仅是数据访问层。
你有权使用prototype对象或对象构造器{}。以上只是我个人使用的JavaScript风格。
当设计一个model时,保持思路明确很重要。你需要的最后一件事是用一个框架来聚焦你的应用逻辑。JavaScript本身就具有巨大的表现力。
观察者是从你应用中分离模型的关键:
$.observable(object);
当一些重要的事件发生后,上面的函数调用给定的对象并通知给其它对象。视图将会重新绘制或者API使用者也可以用监听改变事件来予以扩展。
观察者是将你的应用分离为可维护的组件的关键。它是一个典型的设计模式来将模型从视图中分离出来。
"构建大应用的秘籍就是永远不要一下子做成大应用。要将你的应用分割为小的模块"。Justin Meyer,JavaScriptMVC的作者
"如果将不同组件绑的太紧,可重用性将降低,而且很难在改变一些组件时而不影响其它的组件。"--Rebecca Murphey,jQuery Fundamentals作者
在客户端框架中一个好的事件库是分离各组件的很重要的特性。这就是Riot受关注的原因。
观察者可以对给定对象添加如下方法:
Riot 事件是基于jQuery事件的,所以它有很强大的特性,如命名空间,一次可以监听多个事件。
最重要的不同是它没有事件对象,因为它在DOM之外就没有相关的事件了。你也能很优雅的发送和接收参数而不用数组来完成。
// 发送事件 obj.emit("my-event", "1st argument", "2nd arg", ... argN); // 接收事件 obj.on("my-event", function(arg1, arg2, ... argN) { });
观察者模式产生于1988年的Smlltalk语言,自从那时起它就被用来构建用户接口了。它是一个设计模式,而不是框架。事件和监听器的本质是被分离关注点的优良代码。这也应该是你理念的核心部分。
换句话说:
你不需要用框架来写一个模块级的客户端应用。
视图就是你的应用中可见的那部分。譬如文本,图片,表格,按钮,链接等等,html代码和css样式文件。
Riot视图尽可能的轻。没有了那些视图中本不该有的条件语句,循环,或者数据绑定,自定义的属性或元素。就是你对所有网页设计师期望的那种视图。
只有"模版"——也就是html代码块能在运行的时候插到视图里面。这些模版包含那些可以用Riot模版驱动很快用数据替换的变量。
下面是一段 待处理的MVC入口:
<li id="{id}"> <div class="view"> <input class="toggle" type="checkbox"> <label>{name}</label> <button class="destroy"/> </div> <input class="edit" value="{name}"> </li>
这种”不合逻辑的html“ 没有弱点或可测试的界面。 它通过了w3c校验器并且运行更快。
实际逻辑在presenter里面.
呈现器监听视图上的事件(点击,滚动,按键,返回按钮等等)以及模型(添加,删除或修改的东西)上的事件,当模型更新后视图和模型都会相应的变化。这种"中间人"显示的定义了用户是怎么使用接口的行为。下面是备忘录应用:
$(function() { / 1. 初始化 / // 创建一个模型对象 var model = new Todo(), // 抓出这个视图HTML root实例 root = $("#todo-list"), // 单个备忘录 HTML 模板 template = $("#todo-tmpl").html(), / 2. 监听用户事件 / // 点击"清除完毕" $("#clear-completed").click(function() { todo.remove("completed"); }) //点击"切换所有" $("#toggle-all").click(function() { todo.toggle(filter); }) // ... / 3. 监听模型事件 / // 一个删除入口 todo.on("remove", function(items) { $.each(items, function() { $(this.id).remove() }) // 一个编辑入口 }).on("edit", function(item) { var el = $(item.id); el.removeClass("editing"); $("label, .edit", el).text(item.name).val(item.name); }) // ... })
在你的应用中能决定每一个不同呈现器的感觉非常自由。这是基于UI(边栏,账目,头位置...)上的规则或是基于功能(登陆,添加,创建,删除...)。
呈现器可以用jQuery来使用所有的用户接口逻辑。
评论删除后,数据将无法恢复
评论(53)
Riot现在发展如何?
引用来自“Jackx”的评论
收藏了,以后一定用得到滴