YUI 和路径相关的参数与module加载之间的关系

相关参数默认值

使用YUI, 我们可以配置一些和路径相关参数,如base、root、comboBase、cdn, combine、path、fullpath等属性的配置均会影响到YUI的module加载, 初始化YUI环境这些参数的默认配置如下:

module中的定义, 可以在任何可以配置module的地方配置, 以module w-tab为例:
{module}.path = "w-tab/w-tab.js";
{module}.fullpath = "http://.../w-tab/w-tab.js";
 
//种子文件初始化
YUI.Env = {
    base: 'http://yui.yahooapis.com/',
    cdn: base + Y.version + '/build/',
    ...
};
 
//YUI实例化
Y.Env = {
    base: 'http://yui.yahooapis.com/',
    cdn: base + Y.version + '/build/'
    ...
};
 
//getBase 会默认搜索页面上已经添加的script的src, 找到符合以下匹配规则的地址, 然后提取出config.base;
var _BASE_RE = /(?:\?(?:[^&]*&)*([^&]*))?\b(simpleyui|yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/;
Y.config.base = YUI.config.base || Y.Env.getBase(_BASE_RE); 
 
//loader-base _attach
YUI.Env[Y.version] = Y.Env.meta = {
    base: Y.Env.base,
    root: Y.version + '/',
    comboBase: Y.Env.base + 'combo?',
    ...
};
 
//new Y.Loader() => loader
Y.Env._loader = loader = {
    //default: http://yui.yahooapis.com/{Y.version}/
    base: Y.Env.meta.base + Y.Env.meta.root,  
    //default: http://yui.yahooapis.com/combo? 
    comboBase: Y.Env.meta.comboBase;            
    //看页面上种子文件的使用情况
   combine: Y.config.base && (Y.config.base.indexOf(self.comboBase.substr(0, 20)) > -1),   
   comboSep: '&',
   ...
}

从上面可以看到, 和路径有关的参数会存放在很多对象上, 并且也可以有多种方式可以修改这些参数, 看上去太晕了。

Loader加载使用参数情况

Loader在加载一个module的时候是如何来处理这些参数的呢? 先看代码吧:

1、先判断是否需要combine,  逻辑如下, m为某一个module的简写: 

var groupName = m.group;
var groupConfig = loader.groups[groupName];
 
if(groupName && groupConfig) {
    //m是在groups里面配置的
    if (groupConfig.combine && !m.fullpath) {
        m.combine = true;
    }
} else {
    m.combine = loader.combine;
}

2、当 m.combine == true 时,计算comboBase &  comboSep, 将本次批量加载的相同comboBase的mods 使用comboSep 分隔符 join 起来。

m.comboSep = group.comboSep || loader.comboSep;
comboBase = group.comboBase || loader.comboBase;
 
url = ((L.isValue(m.root)) ? m.root : loader.root) + (m.path || m.fullpath);
//urls为多个combine的module的url数组,如[url, url];
comboUrl = comboBase + urls.join(m.comboSep);   

3、当 m.combine == false 时,

url = m.fullpath || ((group.base || m.base || loader.base || "") + path);
2、3步骤中的url在配置loader.filter或者groups[groupName].filter的时候, 会再使用filter对url进行一次处理, 主要是支持如下三种filter模式
FILTER_DEFS: {
    RAW: {
        'searchExp': '-min\\.js',
        'replaceStr': '.js'
    },
    DEBUG: {
        'searchExp': '-min\\.js',
        'replaceStr': '-debug.js'
    },
    COVERAGE: {
        'searchExp': '-min\\.js',
        'replaceStr': '-coverage.js'
    }
},

 

posted @ 2014-08-15 14:24  mininice  阅读(321)  评论(0编辑  收藏  举报