`
yiminghe
  • 浏览: 1452979 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

YUI3 use&Loader 简析

阅读更多

    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

1
0
分享到:
评论

相关推荐

    yui3-master.zip

    《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...

    YUI3 中tree的两种实现

    这篇博文“YUI3 中tree的两种实现”探讨了如何在YUI3中创建和管理树形结构。 1. **YUI3 TreeView组件** YUI3 TreeView组件是YUI3核心库的一部分,它允许开发者创建交互式的树结构。这个组件支持节点的添加、删除、...

    YUI3 dialog组件

    在YUI3中,首先需要通过`YUI().use()`方法加载Dialog相关的模块,例如: ```javascript YUI().use('dialog', function(Y) { // 在这里编写Dialog的代码 }); ``` 然后可以创建Dialog实例,指定其内容和属性: ```...

    YUI3.6文档及示例

    模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,支持DOM事件、自定义事件以及事件委托,使事件绑定和解绑变得简单易行。 3. **DOM操作**:...

    YAHOO YUI3简单入门

    YUI3的加载器(Loader)是其模块化系统的关键部分,它可以动态地按需加载所需的模块。只需指定需要的模块和依赖关系,加载器就会自动下载并执行它们。这使得开发者可以更灵活地管理代码,同时优化了网页的加载速度。...

    YUI3.7.3 最新版本 带API

    1. **模块系统**:YUI3引入了CommonJS风格的模块系统,允许开发者通过`YUI.use()`方法加载所需模块,实现按需加载,减少页面初始化时的加载量。 2. **事件处理**:YUI3提供了强大的事件系统,支持DOM事件、自定义...

    从YUI2到YUI3看前端的演变

    从YUI2到YUI3看前端的演变

    YUI 入门教程YUI 入门教程YUI 入门教程

    YUI,全称为Yahoo! User Interface Library,是一个开源的JavaScript库,主要用于构建富互联网应用程序(RIA)。本教程将深入介绍YUI的基础知识和关键特性,帮助开发者快速入门。 首先,YUI提供了一系列强大的DOM...

    yui3-3.17.2最新版

    YUI 3包含了一系列核心模块,如Event(事件处理)、Node(DOM操作)、IO(异步数据交互)等,同时还有许多可选的组件,如Grids(表格)、Charts(图表)、Form(表单元素)等,覆盖了前端开发的多个方面。...

    从YUI2到YUI3看前端的演变 pdf

    YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...

    YUi文档(中文的哦)

    要使用Node模块,首先需要引入YUI3的种子文件,并通过`YUI().use()`加载`node`模块。 ```html &lt;script src="yuiload/yui-min.js"&gt; YUI().use('node', function (Y) { // 使用Node API的代码 }); ``` ##### Node...

    YUI.rar_html_javascript YUI_yui_yui javascript

    3. **丰富的组件库**:YUI包含了一系列组件,如:按钮、菜单、对话框、日历、图表、拖放功能、动画效果等,满足各种网页交互需求。 4. **事件系统**:YUI的事件系统支持DOM事件的监听和处理,使开发者可以方便地响应...

    YUI3 完整包

    Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。

    YUI3沙盒下的多模块交互实践

    YUI3的加载器(Loader)负责模块的加载、依赖管理以及执行。它支持异步加载和缓存机制,这不仅提高了性能,也使得用户体验更流畅。 在实践中,通过YUI3的沙盒模式,开发者可以灵活地组织和运行代码模块,避免全局...

    YUI js方法使用列子

    8. **Module System(模块系统)**:通过YUI的`use`方法,可以按需加载所需模块,实现延迟加载和代码分割。 9. **Utility Functions(实用函数)**:包含各种常用的工具函数,如字符串处理、数组操作、日期时间处理...

    yui 资源包

    3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...

    YUI 3 Cookbook

    ### YUI 3 Cookbook 关键知识点解析 #### 一、YUI 3 概述与书籍价值 **YUI 3** 是一个由雅虎开发的JavaScript库,它提供了丰富的功能来帮助开发者创建高质量的Web应用程序。这本书《YUI 3 Cookbook》由Evan Goer...

    yui_3.8.1.zip

    1. **模块系统**:YUI 3.8.1采用CommonJS规范,通过YUI.use()方法按需加载模块,降低初始页面加载时间。此外,还支持AMD(异步模块定义)模式,适应不同的开发需求。 2. **事件处理**:YUI提供了一套完整的事件系统...

    yahoo3.0 YUI Examples

    1. **YUI 3.0架构**:YUI 3采用了模块化设计,允许开发者按需加载组件,降低了页面加载时间。每个模块都有独立的命名空间,避免了全局变量污染。 2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果...

Global site tag (gtag.js) - Google Analytics