YUI3和Extjs,jquery的很大不同就是对于模块的管理,对于使用动态加载脚本的方式来管理模块,记得最早由dojo提出,但是由于实现复杂(Extjs方面自己也尝试过
)且早期web开发多为小项目,就一直没有流行开来,而如今网站越来越复杂,动态加载管理模块的方式对于大团队开发能起到很好的协调作用,今天下午有空就把源码 yui-debug.js 以及 loader-debug.js读了一遍,其中combo的提议确实很精妙,但是也存在了缓存与http连接数的权衡问题: 每个页面js都不相同,如果combo到极度,那么每个页面的脚本必然都不能缓存,若完全没有combo则每个模块一个js的话,页面的http连接数将多得不可接受,不过这个自动combo的思路确实很好,搭配loader的依赖计算,以前恼人的脚本顺序问题迎刃而解。
YUI3基本不再需要依赖domready,只要把use放在页面最后即可,本来就可以保障运行到js时之前的DOM树已经建立完成
1.模块分为加载和attach两步
1.1加载为使用loader载入服务器模块js代码保存到全局YUI中。
1.2.attach是在当前YUI实例上执行模块的初始化代码,使得模块在当前实例上可用。
2.YUI种子文件初始化过程(YUI(config))
1.配置初始参数设置,以及添加自定义模块
2.调用this.use("yui-base")加载 yui-base 模块 ,随之导致加载 yui,yui-later,get模块到YUI.Enc.Mods,并将以上模块attach到当前对象上下文
3.加载模块过程(use)
1.如果该模块之前没有被加载过(YUI.Env.Mods没有)且loader也没加载,则加载loader,回调重新调用use,结束
2.loader加载了,如果该模块之前没有被加载过(YUI.Env.Mods没有),则使用loader计算该模块的依赖项,逐一加载,
2.1 若可以combo,则先combo所有的css加载,调用_internalCallback ,然后combo所有的js加载
2.2 否则挨个加载(使用Y.GET _queue队列),先把所有的css加载完,调用_internalCallback,然后加载所有的js
this._internalCallback = function() {
var f = self.onCSS;
if (f) {
f.call(self.context, Y);
}
self._internalCallback = null;
self._insert(null, null, JS);
};
// _queue.running = false;
this._insert(null, null, CSS);
最后注意css的特殊处理,有些浏览器css不会报告加载成功状态,则不监控,添加到dom后直接报告成功
// FireFox does not support the onload event for link nodes, so there is
// no way to make the css requests synchronous. This means that the css
// rules in multiple files could be applied out of order in this browser
// if a later request returns before an earlier one. Safari too.
if ((ua.webkit || ua.gecko) && q.type === "css") {
_next(id, url);
}
最后,调用 _onSuccess,由loader attach所有加载模块到当前对象上下文
3.模块被加载过,但是没有attach到当前对象Y上下文,则直接attach即可。
4.模块管理
全局命名空间YUI,保证每个模块被加载一次,但可被attach到多个YUI对象
YUI.Enc.Mods =[{
name: name,
fn: fn, //模块初始化的代码
version: version,
details: details || {}
} ....]
5.添加模块:
YUI.add('loader', function(Y) {
//可以在Y上添加模块
Y.Module1=function(){};
},'3.0.0',{
//加载模块前需要载入的模块
requires:[],
//当前模块使用的模块
use:[]
})
每次YUI().use("module",function(Y){}); 都会生成对象Y再执行模块的初始化代码,添加模块到新生成的Y上,当使用多个use时,由于闭包则会产生内存占用过多问题,最好为对一个模块的使用,放在一个use中.
YUI().use("node",function(Y1){
var n1=Y1.one("#n1");
n1.on("click",function(){alert(Y1);});
});
YUI().use("node",function(Y2){
var n1=Y2.one("#n2");
n1.on("click",function(){alert(Y2);});
});
且 Y1.mix!=Y2.mix
6.Loader动态加载过程
如YUI().use("node") 默认由 yui-loader计算所有缺失项,分个使用Y.Get插入到 head
默认根据页面载入的yui种子script的src来判断base,可以使用combo来降低http连接数,有3个办法
1.自己配置combo,并设置YUI({comboBase})
2.设置base为yahoo:YUI({base:"http://yui.yahooapis.com/3.0.0/build/"})
3.最简单:页面script src直接使用yahoo:<script src="http://yui.yahooapis.com/3.0.0/build/yui/yui-debug.js">
总之如果:o.base && (o.base.indexOf( this.comboBase.substr(0, 20)) > -1); 则会使用combo来加载模块集,如 "node"的加载项
combo?3.0.0/build/oop/oop-min.js&3.0.0/build/dom/dom-min.js&3.0.0/build/event-custom/event-custom-base-min.js&3.0.0/build/event/event-base-min.js&3.0.0/build/pluginhost/pluginhost-min.js&3.0.0/build/node/node-min.js&3.0.0/build/event/event-delegate-min.js
分享到:
相关推荐
《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...
这篇博文“YUI3 中tree的两种实现”探讨了如何在YUI3中创建和管理树形结构。 1. **YUI3 TreeView组件** YUI3 TreeView组件是YUI3核心库的一部分,它允许开发者创建交互式的树结构。这个组件支持节点的添加、删除、...
在YUI3中,首先需要通过`YUI().use()`方法加载Dialog相关的模块,例如: ```javascript YUI().use('dialog', function(Y) { // 在这里编写Dialog的代码 }); ``` 然后可以创建Dialog实例,指定其内容和属性: ```...
模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,支持DOM事件、自定义事件以及事件委托,使事件绑定和解绑变得简单易行。 3. **DOM操作**:...
YUI3的加载器(Loader)是其模块化系统的关键部分,它可以动态地按需加载所需的模块。只需指定需要的模块和依赖关系,加载器就会自动下载并执行它们。这使得开发者可以更灵活地管理代码,同时优化了网页的加载速度。...
1. **模块系统**:YUI3引入了CommonJS风格的模块系统,允许开发者通过`YUI.use()`方法加载所需模块,实现按需加载,减少页面初始化时的加载量。 2. **事件处理**:YUI3提供了强大的事件系统,支持DOM事件、自定义...
从YUI2到YUI3看前端的演变
YUI 3包含了一系列核心模块,如Event(事件处理)、Node(DOM操作)、IO(异步数据交互)等,同时还有许多可选的组件,如Grids(表格)、Charts(图表)、Form(表单元素)等,覆盖了前端开发的多个方面。...
YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...
要使用Node模块,首先需要引入YUI3的种子文件,并通过`YUI().use()`加载`node`模块。 ```html <script src="yuiload/yui-min.js"> YUI().use('node', function (Y) { // 使用Node API的代码 }); ``` ##### Node...
3. **丰富的组件库**:YUI包含了一系列组件,如:按钮、菜单、对话框、日历、图表、拖放功能、动画效果等,满足各种网页交互需求。 4. **事件系统**:YUI的事件系统支持DOM事件的监听和处理,使开发者可以方便地响应...
Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。
YUI3的加载器(Loader)负责模块的加载、依赖管理以及执行。它支持异步加载和缓存机制,这不仅提高了性能,也使得用户体验更流畅。 在实践中,通过YUI3的沙盒模式,开发者可以灵活地组织和运行代码模块,避免全局...
8. **Module System(模块系统)**:通过YUI的`use`方法,可以按需加载所需模块,实现延迟加载和代码分割。 9. **Utility Functions(实用函数)**:包含各种常用的工具函数,如字符串处理、数组操作、日期时间处理...
3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...
### YUI 3 Cookbook 关键知识点解析 #### 一、YUI 3 概述与书籍价值 **YUI 3** 是一个由雅虎开发的JavaScript库,它提供了丰富的功能来帮助开发者创建高质量的Web应用程序。这本书《YUI 3 Cookbook》由Evan Goer...
1. **模块系统**:YUI 3.8.1采用CommonJS规范,通过YUI.use()方法按需加载模块,降低初始页面加载时间。此外,还支持AMD(异步模块定义)模式,适应不同的开发需求。 2. **事件处理**:YUI提供了一套完整的事件系统...
1. **YUI 3.0架构**:YUI 3采用了模块化设计,允许开发者按需加载组件,降低了页面加载时间。每个模块都有独立的命名空间,避免了全局变量污染。 2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果...
### YUI3 Cookbook知识点概述 #### 一、YUI3简介 YUI3(Yahoo User Interface Library Version 3)是雅虎开发的一款免费开源的JavaScript库,它为开发者提供了丰富的前端开发工具,包括动画效果、事件处理、DOM操作...