扩展YUI Loader

YUI Loader是YUI的动态载入外部Javascript和CSS文件的整体解决方案。它的可靠、安全、高效,优化了页面的呈现速度,实现了外部Js和CSS的按需加载。

在YUI 2.4.0到2.5.1版本中,YUI Loader通过其addModule()方法只能配置一个YUI Loader实例的加载模块信息,无法配置全局的加载模块信息。实际中,能够全局的配置加载文件的模块信息对于统一维护非常的重要,特别是在静态文件服务器设置了上传文件不可以修改和删除情况下。下面是解决这个问题的两个方法:

方法1:修改YUI Loader源文件,引入YAHOO_config.load来配置全局信息

在YUI两个全局变量之一的 YAHOO_config中,有一个load属性是用来配置YUI Loader的全局信息的,但是遗憾的是仅仅是2.4.0之前的版本支持。

1、修改YUI Loader源文件

var Y=YAHOO, util=Y.util, lang=Y.lang, env=Y.env;
/*
 *在上面一行代码的位置下面加上下面的代码:
 *判断当YAHOO_config存在且有load属性时,把YAHOO_config.load赋值给变量Y_load
 */
if(’undefined’!== typeof YAHOO_config){
	if(lang.hasOwnProperty(YAHOO_config,’load’)){
		var Y_load = YAHOO_config.load;
	}
}

this.base = YUI.info.base;
/*把上面一行修改为下面一行,这样可以用过YAHOO_config.load.base来指定YUI组件的路径*/
this.base  = (lang.hasOwnProperty(Y_load,’base’))?Y_load.base:YUI.info.base;

this.moduleInfo = lang.merge(YUI.info.moduleInfo);
/*把上面一行修改为下面一行,这样可以用过YAHOO_config.load.moduleInfo来指定YUI组件的路径*/
this.moduleInfo = (lang.hasOwnProperty(Y_load,’moduleInfo’))?
lang.merge(YUI.info.moduleInfo,Y_load.moduleInfo):lang.merge(YUI.info.moduleInfo);

2、在YUI Loader文件前写下如下配置文件:

YAHOO_config = {
load : {
 base : 'http://cn.yui.yahooapis.com/2.5.1/build/',
 /*
 *  通用的非YUI组件和不自动加载皮肤的YUI组件
 *  @name   string
 *  @type   string
 *  @fullpath   string
 *  @requires   array
 *  @optinal    array
 *  @skinnable  boolean
 */
 moduleInfo : {
/*
 *YUI的组件中,有皮肤的组件使用时都会自动加载皮肤
 *比如require(['container'])时,会加载container.js,也会加载container.css
 *但是实际应用中,往往不会直接使用YUI的默认皮肤
 *利用YUI Loader本身的skins属性设置,只能在具体的YUI实例中使用,且需要满足YUI的文件结构
 *利用insert({},’js’)方法虽然只能加载Js,但如何require()方法中的CSS也会被过滤掉
 *所以最好的方法是全局性的把其skinnable属性值修改为false
 */
  ‘container’: {
   ‘type’: ‘js’,
   ‘path’: ‘container/container-min.js’,
   ‘requires’: ['dom', 'event'],
   ‘optional’: ['dragdrop', 'animation', 'connection'],
   ’supersedes’: ['containercore'],
   ’skinnable’: false
  },
  ‘dwncontainercss’ : {
   ‘type’ : ‘css’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/container.css’
  },
  ‘dwncarouselcss’:{
   ‘name’ : ‘dwncarouselcss’,
   ‘type’ : ‘css’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/carousel.css’
  },
  ‘dwncarousel’:{
   ‘type’ : ‘js’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/carousel-min.js’,
   ‘requires’:['dwncarouselcss','yahoo','event','dom',
                'containercore','animation']
  }
 }
}
}

请看演示实例1

方法2:利用YAHOO.lang.extend方法封装一个新的Loader

YAHOO.namespace('CN.util');
/* start:YAHOO.CN.util.YUILoader */
YAHOO.CN.util.YUILoader = function(o){
 YAHOO.CN.util.YUILoader.superclass.constructor.call(this,o);
  this.base = ‘http://cn.yui.yahooapis.com/2.5.1/build/’;
  this.addModule({
   ‘name’: ‘container’,
   ‘type’: ‘js’,
   ‘path’: ‘container/container-min.js’,
   ‘requires’: ['dom', 'event'],
   ‘optional’: ['dragdrop', 'animation', 'connection'],
   ’supersedes’: ['containercore'],
   ’skinnable’: false
  });
  this.addModule({
   ‘name’ : ‘dwncontainercss’,
   ‘type’ : ‘css’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/container.css’
  });
  this.addModule({
   ‘name’ : ‘dwncarouselcss’,
   ‘type’ : ‘css’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/carousel.css’
  });
  this.addModule({
   ‘name’ : ‘dwncarousel’,
   ‘type’ : ‘js’,
   ‘fullpath’ : ‘/lab/2008/extend-yuiloader/carousel-min.js’,
   ‘requires’:['dwncarouselcss','yahoo','event','dom',
                'containercore','animation']
  });
}
YAHOO.lang.extend(YAHOO.CN.util.YUILoader,YAHOO.util.YUILoader);
/* end: YAHOO.CN.util.YUILoader */

YAHOO.CN.util.YUILoader的使用和YAHOO.util.YUILoader的使用没有任何区别。请看演示实例2

两种方法的优劣比较

方法1的缺点是需要修改YUI Loader的源文件,而方法二2只是外层增加一个壳,比较友好和保险,但方法1直接修改配置文件的方法比方法2每次实例化都需要通过特定方法修改配置文件要高效,特别是当添加或者修改的配置模块间也有依赖关系的时候,方法2很可能会因为过度运算而死掉。例如把实例中的模块container依赖于dwncontainercss的时候,方法1没有问题(请看演示实例3),但方法2下浏览器会提示脚本忙(请看演示实例4)。

标签:, , ,

作者:秦歌,时间:2008-03-26 23:45,归纳于:Javascript & DOM & AJAX,订阅:RSS 2.0,引用:Trackback

有评论 5 条,发表一条评论 »

则名说:2008-03-27 0:23 #1

昨天让克军帮忙写了在YAHOO.widget.Dialog基础上的一个应用实现,发现yui2.5对css和javascript的耦合相对较高,有点别扭。

秦歌说:2008-03-27 0:54 #2

呵呵,不是YUI2.5中css和js的耦合高,而是应用性质的组件两者的耦合高,这是必然的,比如container等需要依赖css,而dom,event则和css无关。YUI不像Prototype/JQurey等仅仅是是一个javascript framework,YUI还提供CSS工具、Flash的应用等。

柠檬园主说:2008-03-27 8:52 #3

为什么要用”!==”,用”!=”不行吗?

秦歌说:2008-03-27 9:25 #4

呵呵,“!=”和“!==”的区别与“==”和“===”的区别是一样的,“!=”会有强制转换的问题。“0!=false”是真,“0!==false”是假。

re说:2008-03-27 9:29 #5

See http://www.xidea.org/project/jsi/

发表一条评论

您可以在下面评论内容中使用下列XHTML标签:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

您或许也喜欢看:

  1. 第二届D2见闻和随想
  2. Javascript的一种模块模式
  3. Firefox的默认样式表
  4. 从中国雅虎的改版看如何向Yahoo!主页学习
  5. 向Yahoo Mail的主页学习
  6. 用“区别”来区别搜索引擎
  7. 为什么www.yahoo.com无法访问?
  8. 从“爱情墙”到“时光宝箱”
  9. 互联网上的推陈出新
  10. 什么时候回家?
回到页眉