一。函数入口函数。

req = requirejs = function (deps, callback, errback, optional) {

        //Find the right context, use default
var context, config,
contextName = defContextName; //“_” //deps 是对象的话,则可能是config。
// Determine if have config object in the call.
if (!isArray(deps) && typeof deps !== 'string') {
// deps is a config object
config = deps;
if (isArray(callback)) {
// Adjust args if there are dependencies
deps = callback;
callback = errback;
errback = optional;
} else {
deps = [];
}
} if (config && config.context) {
contextName = config.context;
}
//获取自己的属性。
//contexts:运行环境。默认 “-”
context = getOwn(contexts, contextName);
if (!context) {
//返回的核心函数,context.require = context.makeRequire();即确定了require函数。
context = contexts[contextName] = req.s.newContext(contextName);
} if (config) {
context.configure(config);
}
     //这个函数的运行得到makeRequire,会去对依赖项 从define内存中找出来,并实例化模块,
return context.require(deps, callback, errback);
};

//Create default context.

req({});    //创建一个默认环境,contexts["_"], 并且返回 一个require(deps,callback,errback);供外部使用。

cfg:一开始会去确定好baseurl,或者依赖 data-main的值会放入依赖 deps这个属性。cfg.deps会调用require函数,去检查并下载。

req(cfg); //Set up with config info.,将cfg baseurl, data-main的配置引入 依赖cfg.deps。

newContext 返回的核心函数: context.require = context.makeRequire();

makeRequire:是函数入口核心函数: req({}),会确定好环境。

makeRequire的核心代码:

context.nextTick(function () {
//Some defines could have been added since the
//require call, collect them.
console.log( this,deps ); //从define函数注册中的 对象中拿出 并实例化并init
intakeDefines();
//从register里拿或者创建 实例化模块module
requireMod = getModule(makeModuleMap(null, relMap)); //Store if map config should be applied to this require
//call for dependencies.
requireMod.skipMap = options.skipMap;
             //标记依赖,并下载。
requireMod.init(deps, callback, errback, {
enabled: true
});
// 确定是否下载了,或者超时报错,或者未超时去循环下载确定。
checkLoaded();
});

Module函数的解析:

作用:确定依赖项,和依赖项定义并执行,监听onScriptLoad,并下载。最后执行暴露函数。

主要函数以下:

enable函数:标记依赖函数,标记个数depCount,并且将依赖项makeModuleMap(统一处理路径,ID,插件头,URL,是否定义的。这种形式。),然后再次检查 是否可执行(check())。

enable():整理 依赖项的标志(个数等),->check()-第一次是下载(下载完成会自动循环检测是否下载完成。),二次是 减少依赖项,并执行暴露函数。

check:函数://check之前要确保已经 enable(处理依赖项,实例依赖项模块),检查是否没有依赖了,并运行exports。

fetch:函数:( 监听:onScriptLoad )- 》 completeLoad --》checkLoaded

completeLoad:函数:

//completeLoad从define定义的模块中 拿到对应的实例化模块,如果没有,则从shim中重新给她define并实例化模块否则报错。并检查下载。

checkLoaded:函数:

//checkLoaded: 确定是否下载了,或者超时报错,或者未超时去循环下载确定。

define函数:作用:只是将定义的模块,加入内存中。 等到require触发会从相应的内存中拿出来。

待续:

最新文章

  1. 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
  2. .NET转JAVA之拼音组件
  3. 在 Area 中使用RouteAttribute 定义路由, 并支持多语言
  4. int组成时间值
  5. DOS批处理命令-@命令
  6. leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法
  7. Queue学习
  8. Node.js之操作文件系统(二)
  9. 探索 Python 学习
  10. IIS命令行静默安装脚本-python
  11. 1.Sed | Awk | Grep | Find
  12. 《C# 从现象到本质》出版,免费送书10本
  13. 20165231 实验一 Java开发环境的熟悉
  14. vue的数据绑定和组件化
  15. node中npm安装模块的网络问题
  16. 编写SHELL脚本--判断用户的参数
  17. redis 主从复制 [转]
  18. 微信小程序开发——开发者工具无法输入中文的处理
  19. 验证FluentValidation
  20. 织梦导航条dropdown.js的改进(2013-7-10)

热门文章

  1. senlin __init__() got an unexpected keyword argument 'additional_headers'
  2. request response
  3. 【python】继承关系和isinstance
  4. Ubuntu下三个实用的录屏软件
  5. 模拟搭建Web项目的真实运行环境(三)
  6. C#设计模式之抽象工厂
  7. 简单的SQL联表更新
  8. Sharepoint页面项目展示画廊纯前端实现,后端用list/library简单维护
  9. Linux 小命令
  10. compass tables 表格 表格常见样式[Sass和compass学习笔记]