背景

YUI的配置参数较多, 可以在好几个地方配置一个module的相关信息, 如:

//在全局配置, 所以YUI实例共享
YUI_config = {modules: {'w-autcomplete': {requires: ['module1'],path: 'test1.js',}},groups: {modules: {'w-autocomplete': {requires: ['module2'],path: 'test2.js'}}}
}//在某一个YUI实例中配置
YUI({
groups: {fecore: {modules: {'w-autocomplete': {base: 'http://fe.com?f=fecore/test3',type: 'js',requires: ['module3'],}}}
},
modules: {'w-autocomplete': {base: 'http://fe.com?f=fecore/',path: 'w-autocomplete/w-autocomplete.js',type: 'js',}
}
}).use('w-autocomplete', function(Y) {console.log(Y);
}); //在模块文件中申明配置: w-autocomplete.js
M.add('w-autocomplete', function(Y) {...
},
'1.0.0',
{requires: ['module4']
}
);

这三类情况, YUI在加载的时候到底如何来判断, 使用哪一个module的配置信息呢?

配置优先级关系

一个YUI实例config 配置优先级关系从高到底依次为:

  1. YUI(args) 里面的 args, args可以是数组, 数组依次执行 applyConfig(arg[i]);

  2. YUI_config

  3. YUI.GlobalConfig

YUI初始化的时候会将这些参数按如上所述的优先级进行config初始化。 所以当使用YUI(args).use 的方式来使用模块时, args会自动覆盖当前实例Y的modules 配置信息。

当我们需要给所有YUI实例添加配置参数的时候, 可以直接通过配置 YUI_config 或者 YUI.GlobalConfig 来实现。 也可以在YUI或者YUI实例初始化后,进行动态配置,如:

Y.applyConfig({groups: {}, modules: {} });
YUI.applyConfig({groups: {}, modules: {} }); 

处理同一优先级的配置

对同一优先级的配置使用applyConfig的时候, 由于是Map操作,所以并不能保证config里面的groups & modules的覆盖顺序, 测试了一下for in操作在各个浏览器下的表现, 证明对于key都是字符串的情况,在不同浏览器中执行顺序和书写的顺序有关系。

所以当groups.modules和modules里面都定义了相同module时, 谁定义在后面就以谁的定义为准 。

YUI().add定义的模块信息

YUI().add('w-autocomplete', function(Y) {}, 1.0.0,  {requires: ['module1', 'module2'],use: ['module3', 'module4']
}),

在执行add操作时, YUI.Env.mods里面会新增如下对象:

{detail: {requires: ['module1', 'module2']use: ['module3', 'module4']},version: 1.0.0,name: 'w-autocomplate',fn: fn
}

module加载完毕后, 在执行回调之前, 会先检查加载的依赖链中的missing module, missing module包括module定义中的 requires和use。  得到missing列表后,再用Y.use函数进行reload。

var missing = [];
var mods = YUI.Env.mods;
var process = function(names, skip) {var i = 0, a = [], name, len, m, req, use;len = names.length;for (i = 0; i < len; i++) {name = names[i];m = mods[name];req = null;use = null;if (m) {used[name] = true;req = m.details.requires;use = m.details.use;} else {if (!G_ENV._loaded[VERSION][name]) {missing.push(name);} else {used[name] = true; // probably css}    }    // make sure requirements are attachedif (req && req.length) {process(req);}    // make sure we grab the submodule dependencies tooif (use && use.length) {process(use, 1);}}
};
process(modules);
redo = missing.length;
if (redo) {Y._use(missing, function() {if (Y._attach(data)) {Y._notify(callback, response, data)}});
}

so, requires 和 use的定义会影响到loader的加载。而和在前面两种方式配置模块的requires和use 主要区别是, 前两种配置依赖的module会在当前模块加载之前加载, 而后面这种方式会在当前模块加载完成后再进行加载。

但是如果在module里面定义的其他信息,如condition等,loader会忽略不管。

总结

如果每个级别的优先级都配置了mod信息, 会按优先级关系逐级覆盖, module信息以最高优先级的配置为准。

如果同级优先级配置里面 modules 和 groups.modules里面有相同的module配置,取决于for in 遍历的顺序。 测试各浏览器结果会按照定义顺序, 后定义的module信息优先级更高。

转载于:https://www.cnblogs.com/mininice/p/3914786.html

YUI 的模块信息配置优先级关系梳理相关推荐

  1. 井电双控智能缴费管理系统、水井管理、报警管理、费用管理、实时查询、信息配置、模块配置、智能报表、水表、抄表、井电、电表、用水分析、水电、灌溉用水、绿化用水、农业用水、智慧水电、水利

    井电双控智能缴费管理系统.水井管理.报警管理.费用管理.实时查询.信息配置.模块配置.智能报表.水表.抄表.井电.电表.用水分析.水电.灌溉用水.绿化用水.农业用水.智慧水电.水利 Axure原型演示 ...

  2. mvn打包springboot项目,打包时报错:子模块找不到找不到父模块所配置的信息,<relativePath /> 所引发的问题

    mvn打包springboot项目,打包时报错:子模块找不到找不到父模块所配置的信息, 所引发的问题 报错信息: [ERROR] The project XXX (/home/×××/pom.xml) ...

  3. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  4. 电脑服务器信息,电脑服务器怎么看模块信息

    电脑服务器怎么看模块信息 内容精选 换一换 Agent启动时提示"SMS.1205 无法加载wmi模块"或"failed to load wmi".出现该问题可 ...

  5. EF使用Fluent API配置映射关系

    定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置,在这个自定义类的构造函数中使用我们上次提到的那些方法配置数据库的映射. 映 ...

  6. 16. Logging 模块的配置与使用

    我们可以通过logging模块的配置改变log文件的写入方式,日志级别,时间戳等信息.例如下面的配置: 可见在logging.basicConfig()函数中可通过具体参数来更改logging模块的默 ...

  7. nginx、fastCGI、php-fpm关系梳理(转载参考)

    nginx.fastCGI.php-fpm关系梳理 还可以参考:http://www.cnblogs.com/skynet/p/4173450.html 前言: Linux下搭建nginx+php+m ...

  8. 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径

    转自原文 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径. 打开C:\Windows\System32\inetsrv\config路径 找到applicationH ...

  9. IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求...

    IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求 IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query Strin ...

最新文章

  1. Android的全屏活动?
  2. 图(Graph)的javascript实现
  3. 项目打包publicpath_将项目部署至github和码云
  4. 鼓作气学会“一致性哈希”,就靠这 18 张图了
  5. [Qt教程] 第18篇 2D绘图(八)双缓冲绘图
  6. Linux vi/vim基础知识
  7. win7系统更改密码策略的设置方法
  8. MySQL的Limit性能问题
  9. 冈萨雷斯--数字图像处理(MATLAB版)----书籍相关网站
  10. GitHub 标星 1.6w+,前方宝藏项目出没!| 原力计划
  11. solving order
  12. linux下创造进程指令,Linux系统创建一个新进程(下)
  13. 全网疯传!传智播客java基础入门第二版pdf
  14. 推荐:总能找到一个你觉得最好的免费电子书下载网站
  15. ipv6无网络访问权限可行解决方案
  16. linux删除文件名的文件夹,Linux删除文件夹和修改文件名
  17. 写好一份数据分析报告需要注意的13个要点
  18. 图书管理系统之用户信息维护
  19. Audacity使用技巧详解
  20. Day1:Angry young women: A new generation of activists is challenging misogyny

热门文章

  1. linux线程池简单实例
  2. matlab bwdist
  3. Ubuntu下安装Oracle11g(图文教程)
  4. fifa15服务器位置,《FIFA 15》全系统教程图文攻略
  5. lua检测表中是否有某个值_Lua检测数组(tabble)中是否包含某个值
  6. 产品认知:产品经理如何锻炼产品思维?
  7. java 多线程写缓存,Java多线程_缓存对齐
  8. 平台日志架构说明log4j漏洞问题解析
  9. 【CSS系列】CSS 实现必填项前/后添加红色星号
  10. Bash脚本教程之函数