requirejs代码结构分析
一。函数入口函数。
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触发会从相应的内存中拿出来。
待续:
requirejs代码结构分析的更多相关文章
- Hadoop IPC的代码结构分析
与IPC相关的代码在org.apache.hadoop.ipc包下.共七个文件,其中4个辅助类: RemoteException Status VersionedProtocol Connection ...
- Android高仿雅虎天气(两)---代码结构分析
版本已经升级到1.0.1 源码地址: GitHub:https://github.com/way1989/WayHoo OsChina:http://git.oschina.net/way/WayHo ...
- FFMpeg笔记(七) 代码结构分析,以HLS为例
HLS流在播放时是先解协议(hls.c)后解封装(mpegts.c),libavformat下的hls.c和mpegts.c实际上是同一个级别的,同属于demuxer. 一.解HLS协议 1. FFm ...
- jquery源码解析:代码结构分析
本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94) 定义了一些变量和函数, jQuery = function() ...
- 我的NopCommerce之旅(3): 系统代码结构分析
一.概述 基于MVC 二.详细描述 \Libraries\Nop.Core 核心类,包括缓存.事件.帮助类.业务对象(订单.客户实体) \Libraries\Nop.Data 数据访问层,采用Enti ...
- requireJS(版本是2.1.15)学习教程(一)
一:为什么要使用requireJS? 很久之前,我们所有的JS文件写到一个js文件里面去进行加载,但是当业务越来越复杂的时候,需要分成多个JS文件进行加载,比如在页面中head内分别引入a.js,b. ...
- 关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)
代码分析文章<KVM虚拟机代码揭秘--QEMU代码结构分析>.<KVM虚拟机代码揭秘--中断虚拟化>.<KVM虚拟机代码揭秘--设备IO虚拟化>.<KVM虚拟 ...
- 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 20165326
恶意代码分析 实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systra ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
随机推荐
- python3简单爬虫
最近在抽空学了一下python,于量就拿爬是练了下手,不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码 ...
- jQuery UI Datepicker
http://www.runoob.com/try/try.php?filename=jqueryui-example-datepicker-dropdown-month-year <!doct ...
- Gps与地图坐标转换
内容实在是太太了 7.8MB 以至于浏览器 都奔溃 就算浏览器可以 博客园的文章也保存不了 只好保存到百度云 提供下载 地址: 链接:http://pan.baidu.com/s/16ggIq 密码: ...
- UISearchController使用
iOS8之前我们使用UISearchDisplayController做TableView的本地搜索 iOS8提供实现搜索功能的SDK:UISearchController(iOS8.0之后).UIS ...
- 多个DataSet数据合并
DataSet ds = myIAppSet.GetHomeHottestList(siteID, , time); ].Rows.Count > ) { ds.Merge(ds1); } Me ...
- python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹
python系列均基于python3.4环境 1.位置传递和关键字传递 代码示例 #位置传递 def fun(a,b,c): print("a: {0}, b: {1}, c: {2}&qu ...
- 这两年在QQGame写过的游戏(2012.7.15-2014.8.25)
[雷电] Gamebryo http://qqgamecdnimg.qq.com/help/rule177.html [英雄杀] http://yxs.qq.com ...
- 1.GoldenGate 简单的一对一配置
一,软件安装 源端和目标端均执行(只要修改相应的目录) 1.上传软件,放到ogg的安装目录,并解压 mkdir /home/oracle/ogg unzip ogg112101_fbo_g ...
- k-means聚类算法python实现
K-means聚类算法 算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他 ...
- HTML 表
表格: <table></table> 插入一个表格 <tr></tr> 代表一行 其中插入<td></td>单元格 ...