Yui rocks

59
YUI Rocks! 鲁鲁鲁 @adamlu

description

主要介绍一下YUI的基础结构和使用YUI如何构建可扩展的Web应用,同时会有一些YUI和其它类库的对比以及其自身特点,并阐述为什么学习使用YUI对前端工程师来说可以在一定程度上提高编写代码的质量。

Transcript of Yui rocks

Page 1: Yui rocks

YUI Rocks!

鲁超伍@adamlu

Page 2: Yui rocks

YUI 是什么?

Page 3: Yui rocks

我们今天说的当然不是她~~~

Page 4: Yui rocks

YUI ~ Yahoo! User Interface

• YUI2 发布于 2006 年并广泛被使用

• YUI3 发布于 2009 年, YUI3 被重新设计用来构建快速、强大和高效的工具箱

Page 5: Yui rocks

YUI2 感觉体积好大啊!

有人说:

其实这种思想在早前很多使用 YUI 的人心里都扎下了根

Page 6: Yui rocks

<!-- Dependencies --><script src="http://yui.yahooapis.com/2.8.2r1/build/yahoo-dom-event/yahoo-dom-event.js" type="text/javascript"></script><!-- Source file --><script src="http://yui.yahooapis.com/2.8.2r1/build/animation/animation-min.js" type="text/javascript"></script>

var element = document.getElementById('test');var myAnim = new YAHOO.util.Scroll(element, { scroll: { to: [ 500, test.scrollTop ] } });myAnim.animate();

我们印象中的 YUI(2)

Page 7: Yui rocks

YUI3 和 YUI2 是完全不一样的!

我要说:

我想让大家重新认识一下 YUI

Page 8: Yui rocks

http://developer.yahoo.com/yui2/ YUI2 网站快照

Page 9: Yui rocks

http://yuilibrary.com/YUI3 官网

Page 10: Yui rocks

YUI 项目

• JavaScript 库 (YUI)

• CSS 基础 (Grid)

• 文档工具 (yuidoc)

• 构建工具 (shifter/yogi/yme)

• 测试工具 (yuitest)

• 浏览器自动化测试工具 (yeti)

• 性能优化工具 (yui compressor)

• 开发者培训 (Theater/Blog/YUIConf)

Page 11: Yui rocks
Page 12: Yui rocks

前端工程师面对的两个问题

• 开发

• 维护

Page 13: Yui rocks

基本的 JS 模块化

文件依赖、并发下载、维护性

YUI

RequireJs

Page 14: Yui rocks

模块化

• DRY

• 代码抽象

• 前端性能

Page 15: Yui rocks

模块 / 代码加载器

• RequireJs

• LabJs

• SeaJs

• HeadJs

• YUI Loader

Page 16: Yui rocks

模块加载

• 种子文件

• 种子小,作用大– 模块注册系统– 核心 YUI 工具方法– Lang, Object, Array 类– Loader( 动态模块加载 )

<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>

Page 17: Yui rocks

模块注册

YUI.add('hello', function (Y) { Y.namespace('Hello');

Y.Hello.sayHello = function () { return 'GREETINGS PROGRAMS'; };});

Page 18: Yui rocks

模块使用

YUI().use('node-base', 'hello', function (Y) {

Y.one('#demo').setHTML(Y.Hello.sayHello());

});

使用 YUI 模块前你需要知道模块名!

Page 19: Yui rocks

一个简单的 YUI 程序

<div id="test"></div><button id="button">Turn Red</button>

YUI().use('node', function(Y){ Y.one('#button').on('click', function() { Y.one('#test').addClass('red'); });});

#test { height: 30px; background: gray;}#test.red { background: red;}

<script src="http://yui.yahooapis.com/3.9.0/build/yui/yui-min.js"></script>

http://jsfiddle.net/adamlu/YdBbL/show/

Page 20: Yui rocks

YUI Loader

合并加载

Page 21: Yui rocks

有用的工具函数• Y.merge• Y.mix• Y.later• Y.log• Y.Lang• Y.Array• Y.Object• Y.UA• Y.Escape http://jsfiddle.net/adamlu/LEEdc/

Page 22: Yui rocks

YUI vs. jQuery

Y.one('div.foo')

Y.all('div.foo')

Y.one('#foo').on('click', fn)

Y.io(url, { data: data, on: {success: successFn}});

.setHTML('foo')

$('div.foo:first')

$('div.foo')

$('#foo').click(fn)

$.ajax({ url: url, success: successFn});

.html('foo')

Page 23: Yui rocks

YUI vs. jQuery

http://www.jsrosettastone.com/

Page 24: Yui rocks

YUI 的 node, io, event 等某些模块基本就能把 jQuery 所做的事情搞

定了

Page 25: Yui rocks

YUI 还有更多你意想不到的

Page 26: Yui rocks

YUI 改进了 JavaScript 编码风格

你有没有遇到过这样的情况:在 jQuery 代码中 :if ($(‘.empty-node’)) {// 如果存在这个节点则执行下面这段代码 // 没有这个节点也会执行,坑爹啊}

在 YUI 中,完全按照你所想的:在 YUI 代码中 :if (Y.one('.empty-node')) {// 如果存在这个节点则执行下面这段代码 // 没有这个节点不会执行, Good}

Page 27: Yui rocks

YUI 改进了 JavaScript 编码风格

$.each([1, 2, 3], fn(index, value))$.each({ key: value }, fn(key, value))

Y.Array.each([1, 2, 3], fn(value, index))Y.Object.each({ key: value }, fn(value, key))

$.isPlainObject(obj)Y.Lang.isObject(obj)

还有强大的面向对象编程支持 !

Page 28: Yui rocks

YUI 中的面向对象

• 伪类 / 原型继承

• 增强

• 插件

• 类扩展

• MVC

Page 29: Yui rocks

原生的继承实现

function Child() {}Child.prototype = new Parent();Child.prototype.method = function() {};在 YUI 中:

伪类继承:

Y.extend(Child, Parent, { method: function(){}});

提供了强大的继承关系如 superclass ,保持 instanceof 不变

Page 30: Yui rocks

原生的继承实现

原型继承:

Y.Object = (function() { function F() {};

return function() (obj) { F.prototype = obj; return new F(); }})();

避免拷贝过多的属性,相当于 Object.create()

Page 31: Yui rocks

增强Y.ModelList = Y.extend( function() { ModelList.superclass.constructor.apply(this, arguments); }, Y.Base, {/* 原型 */}, {/* 静态方法 */});

Y.augment(Y.ModelList, Y.ArrayList);

var list = new Y.ModelList({..});list.each(function(item) {..});延迟构造函数,只有 each 执行时才会执行 ArrayList 的构造函数,可以合并多个类。

Page 32: Yui rocks

插件var overlay = new Y.Overlay({..});overlay.plug(Y.Plugin.Drag);overlay.dd.set('lock', true);overlay.unplug('dd');

Y.Plugin.Host.prototype.plug = function(Plugin, config) { .. if (Plugin && Plugin.NS) { .. config.host = this; this[ns] = new Plugin(config); this._plugins[ns] = Plugin; } }

只要继承了 Y.Plugin.Host 的类如 Y.Base 就可以使用插件

Page 33: Yui rocks

类扩展

提高了代码重用率

Y.Base.create = function(name, base, extensions, px, sx)

Y.Electron = Y.Base.create('electron', Y.Base, [Y.Relativestic], { getSpeed: function() {}}, { ATTRS: {}});

类的 NAME 属性

基类 ( 必须是扩展自 Base)

扩展列表 原型和静态对象

Page 34: Yui rocks

YUI App Framework

• 由 App, Model, Model List, Router 和View 组成的包

• 写单页面 JavaScript 应用程序的 MVC 风格的框架

• 基于 URL 的路由

• 类似 BackboneJs 框架

Page 35: Yui rocks

YUI App Framework 的一个例子

http://adamlu.com/fe/ContactApp/

https://github.com/adamlu/YUIAppDemo

ContactListView ContactView

Page 36: Yui rocks

使用组件

YUI 本身已经自带很多丰富组件如AutoComplete, Calendar, DataTable 等

Page 37: Yui rocks

YUI 组件核心

• Attribute

• Base

• Custom Event

Page 38: Yui rocks

基于 Base 创建组件

• Base 是底层的基础类,同时具备 Attribute

和 Event特性

• 提供了创建基于属性对象的标准模板

• 提供了一致的 init() 和 destroy() 方法

http://jsfiddle.net/adamlu/7hXCV/

Page 39: Yui rocks

Attribute 类

• 对一些状态值和自定义逻辑功能相关配置的封装

• 提供监听状态改变的机会

• Gettters

• Settters

• 默认值

• Change 事件

Page 40: Yui rocks

// 实例化时设置属性的初始值obj = new MyClass({name: value});obj.addAttr(name, value);obj.set(name, value);obj.get(name);obj.on(nameChanged, callback);obj.after(nameChanged, callback);

YUI().use("attribute", function(Y) {

function MyClass() {

} MyClass.ATTRS = {};

Y.augment(MyClass, Y.Attribute);});

好的抽象,好的代码组织,一致的 API

Page 41: Yui rocks

YUI 提供的事件

• DOM 事件

• 特别的 DOM 事件

• 合成事件

• 自定义事件

Page 42: Yui rocks

事件支持

• 控制事件传播和冒泡

• 阻止默认行为

• 委托事件

• EventTarget– publish()– on()/detach()– fire()– addTarget()/removeTarget()

http://jsfiddle.net/adamlu/5C5CC/

Page 43: Yui rocks

组件组件 (widget) 是一个通用的可视元件设计在不同网站被重用,如表格、日历、菜单或图表等。

set(), get(), value, valueFn, setter, getter...

publish(), fire(), on(), after(), before()

plug(), unplug()

Page 44: Yui rocks

扩展组件

Y.Electron = Y.Base.create('electron', Y.Widget, [], { destructor: function () { }, renderUI: function () {}, bindUI: function () {}, syncUI: function () {} }, { ATTRS: {} });}, '1.1', {requires: ['base-build', 'widget']});

http://jsfiddle.net/adamlu/AQ8mg/

生命周期方法: initializer(), destructor(), renderUI(), bindUI(), syncUI()

Page 45: Yui rocks

YUI on Mobile

• Touch/Guesture

• History

• Offline Cache

• Transition

• Autocomplete

• ScrollView

Page 46: Yui rocks

YUI on Mobile

特性加载:use('transition-native') 手动使用 transition 原生模块use('node') 从手机来的请求不会加载 IE6 相关的

触摸事件:event-touch 原生 touch 和 guesture 事件event-move 处理 touch 和 mouse输入的事件event-flick 捕捉鼠标或手势的” flick” 事件上面三个合在一起组成了 event-guestrues 模块

Widget:Scrollview, Slider, Tabview 等 YUI 组件都是 mobile 可用的

Page 47: Yui rocks

YUI on Node

npm install yui@stable

var YUI = require(‘yui’).YUI;YUI().use(‘yql’, function() { Y.YQL(‘select * from …’);});

var Y = require(‘yui/yql’);

Y.YQL(‘select * from …’);

Page 48: Yui rocks

YUI 目标平台

Internet Explorer

6.0 7.0 8.0 9.0 10.0

Chrome † Latest stable

Firefox † Latest stable

Safari iOS 5.† iOS 6.† Latest stable (desktop)

WebKit Android 2.3.†

Android 4.†

Node.js* 0.8.† 0.10.†

Windows (Native)

Windows 8 Apps

http://yuilibrary.com/yui/environments/

Page 49: Yui rocks

拥抱开源世界

Page 50: Yui rocks

拥抱开源世界

• YUI App Framework

• Y.Handlebars

• YUI Loader

• cssnormalize

• Y.Promise

• ScrollView

• YUI on Node

• https://github.com/yui/yui3

Page 51: Yui rocks

YUI Gallery

Page 52: Yui rocks

AlloyUI

http://alloyui.com/

Page 53: Yui rocks

总结:使用 YUI 的好处

• 协作开发

• 功能齐全

• 稳定

• 提高编写 JavaScript水平

• 有益于前端工程师自身成长

Page 54: Yui rocks

什么情况可以不用 YUI呢?

• 如果是原生 JavaScript 可以处理的话

• 如果是临时项目不太考虑维护的话

• 除了不是以上这些情况

Page 55: Yui rocks

不要为工具所限定,只要能满足您需求的忠于用户的就好。

Page 56: Yui rocks

赶快加入到使用 YUI 的行列吧!

YUI Really Rocks!

Page 57: Yui rocks

YUI 3 Cookbook 中文版

Page 58: Yui rocks

@adamlu

Page 59: Yui rocks

Q&A