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);
FILTER_DEFS: { RAW: { 'searchExp': '-min\\.js', 'replaceStr': '.js' }, DEBUG: { 'searchExp': '-min\\.js', 'replaceStr': '-debug.js' }, COVERAGE: { 'searchExp': '-min\\.js', 'replaceStr': '-coverage.js' } },