Twitter发布基于组件的轻量级JavaScript框架——Flight
Twitter发布了Flight项目。Flight是一个轻量级的、基于组件的JavaScript框架,可以将行为映射到DOM节点上。Twitter将其用在自己的Web应用上,Twitter基于MIT许可证开放了Flight的源代码,同时提供了一个演示应用,还提供了用于解释如何设置Flight、如何开始创建、测试和调试组件的文档。。
Flight团队这样解释为什么要开发Flight:
Flight与其他现有框架的不同之处在于:对于web应用,它不会预先规定或提供任何特定呈现或提供数据的方法。对于请求如何被路由,你使用什么样的模板语言、甚至你如何在客户端或服务器上呈现你的HTML,它都不关心。有些web框架鼓励开发者围绕一个预先规定好的模型层编写、安排代码,Flight直接围绕现有的DOM模型组织代码,功能直接映射到DOM节点上。 这样做可以避免加入额外的数据结构,因为它们不可避免地会影响更大的架构,同时,直接将功能映射到原生web页面的做法,可以利用原生的特性。比如,我们可以直接在DOM的事件冒泡特性基础上自定义事件广播,而且我们的事件处理基础架构代码能够同时处理原生和自定义事件。
那么Flight中的组件是什么含义?网站上这么说:
- 组件,就是一个构造器,带有混入其原型的属性。
- 每个组件都有一些基本功能,比如事件处理和组件注册。
- 此外,每个组件的定义都混入一系列自定义属性中,这些属性定义了组件的行为。
- 当向一个DOM节点附加一个组件时,该组件的一个新实例就得以创建。每个组件实例通过其node属性引用DOM节点。
- 组件实例不能直接引用,它们与其他组件通过事件通信。
Flight遵循严格的关注点分离原则。当你创建一个组件时,你无法直接处理它。因此,组件无法被其他组件引用,而且无法成为全局树的属性。框架设计的本意如此。组件不能彼此直接访问,实际上,它们会以事件来广播自己的行为,而且其他组件可以订阅这些行为。
能看出,事件在Flight框架中十分重要,Flight团队这样解释他们使用事件的原因:
事件是开放性的。当一个组件触发某个事件,对于自己的请求如何被满足、或是谁来满足,它毫不知情。这强制了功能的解耦,工程师因此可以独立思考每个组件的功用,而不是必须去担心整个应用的复杂性不断增加。
让DOM节点的事件代理组件事件,有如下3点好处:
- 毫不费力地得到事件广播功能
- 组件可以在文档层面订阅给定的事件类型,或者选择监听来自某特定DOM节点的事件
- 订阅组件不会区分事件来自其他组件的自定义事件,还是原生DOM节点事件,并且会以完全相同方式处理这两种类型的事件。
在可移植性和测试方面,每个组件都是一个模块,除了少数几个标准依赖程序库外,对其他没有引用。因此,一个给定的组件会以同样方式响应一个给定事件,而不管环境如何。测试因此变得简单可靠,因为事件是唯一的变量,而且生产环境中的事件很容易在测试中复制。要调试一个组件,在控制台中触发事件就可以了。
至于混入(mixin),Flight对函数式混入提供内置支持,同时保护无意的重写和混入复制。虽然经典的JavaScript模式只支持单继承,组件(或其他对象)都可以支持应用多个混入。
对于Flight的未来,团队表示:
Flight是一个处于不断开发中的项目。我们准备加入一个完整的测试框架,同时公开更多Twitter网站使用的前端工具。
在Github上,Flight团队发布了一个用Flight框架构建的简单email客户端演示。
Flight使用了es5-shim项目和jQuery,如果要安装,还需要包括require.js或loadrunner这样的异步模块定义(Asynchronous Module Definition,简称AMD)。
- Go 语言的基本数据类型
- c语言客户端与go语言服务端通信(网络字节序)
- (译)Go 语言的内存、指针详解
- Redis之并发写入
- Python超过R,成为数据科学和机器学习的最常用语言
- JavaScript 之 this 详解
- Golang 中 for-loop 和 goroutine 的问题
- 【学术】一文教你如何正确利用kNN进行机器学习
- 【学术】机器学习优化函数的直观介绍
- 基于达尔文进化论的遗传算法,还能帮你破解同事的密码?| 附代码
- Vue + Node + Mongodb 开发一个完整博客流程
- Golang中用interface{}接收任何参数与强转
- Machine Box创始人教你快速建立一个ML图像分类器
- 【图解】Web前端实现类似Excel的电子表格
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MapReduce工作笔记——Streaming Job中jar包上传与使用指定
- MapReduce工作笔记——Job提交任务中-D和-jobconf的区别
- MapReduce工作笔记——Hadoop Streaming多目录/多路输入
- 矩阵操作试题(C++/Python)——矩阵元素顺时针旋转
- Linux实用技巧——paste横向合并文件内容
- Julia简易教程——5_函数
- 矩阵操作试题(C++/Python)——矩阵元素逆时针旋转90度
- MapReduce工作笔记——Streaming输入input解压
- MapReduce工作笔记——Streaming输出output压缩
- Linux实用技巧——删除重复行
- python函数——os.path.join路径拼接(pjoin)
- python函数——pickle中的dump以及load
- python函数——Keras分词器Tokenizer
- python函数——序列预处理pad_sequences()序列填充
- MapReduce工作笔记——Streaming多路输出