(一)requireJs 的整体结构:

  requireJS 源码 前192行,是一些 变量的声明,工具函数的实现 以及 对 三个全局变量(requirejs,require,define)若被占用后的具体处理。

     从 194行到 1674行,整整 1480行,是 实例化上下文 函数 newContext() 。

  在 在req({ } ) 调用时执行 newContext函数,而且只会执行一次。

  从1690行开始,便是对外API  require/requirejs/define  的具体实现。

(二)简单的demo 层级。

  

  1. require.config({
  2. //根基目录baseUrl:'',
  3. paths: {
  4. app: 'src/app'
  5. }
  6. });
  7.  
  8. /**
  9. * Require 默认指定的所有资源都是JS文件,不需要在module 上添加.js后缀
  10. *
  11. * */
  12. require([
  13. 'src/app'
  14. ], function (app) {
  15. app.sayBy('美丽的女孩 Rose');
  16. app.sayGood("美丽的女孩 Lily");
  17. })

main.js

  1. define(['./person'],function (person) {
  2. var sayGood = function (name) {
  3. console.log('早上好 ' + name);
  4. };
  5.  
  6. var sayBy = function (name) {
  7. console.log(person.run());
  8. console.log('再见 ' + name);
  9. };
  10.  
  11. return {
  12. sayGood: sayGood,
  13. sayBy: sayBy
  14. }
  15. });

app.js

  1. define(function(require,exports,module){
  2. exports.run=function(){
  3. console.log('there is a person run....');
  4. }
  5. });

person.js

  1. <script data-main="main.js" src="lib/require.js"></script>

index.html

 从index.html 中,我们看到<script data-main="main" src="lib/require.js"></script>

  1. 采用了 data-main 这样一个自定义属性,指定了入口js文件。跟着这条线,我们可以进入requireJS的大门。
  2.  
  3. (三)源码分析
      1762行会创建 默认上下文执行环境
                    
      使用 require('person'),便是调用了这个函数。
      首次调用时,便会创建 default context
      这是因为req() ===> 调用了 function newContext()。
      1922行代码处,开始处理 data-main 属性值,去加载我们这里的main.js文件。
                      
     
  1. //Look for a data-main script attribute, which could also adjust the baseUrl.
  2. /**
  3. * 判断是否在浏览器中运行(requireJS不止用在浏览器中)
  4. * */
  5. if (isBrowser && !cfg.skipDataMain) {
  6. //Figure out baseUrl. Get it from the script tag with require.js in it.
  7. /**
  8. * 通过 document.getElementsByTagName('script') 拿到所有 script 的标签集合(HTMLCollection)
  9. * */
  10. eachReverse(scripts(), function (script) {
  11.  
  12. /**然后使用 eachRevers() 倒序 script 里面的内容
  13. * head = 如果不存在 base标签 ? head 标签元素 : base.parentNode
  14. * 如果head不存在,拿到script里面的父元素
  15. */
  16. if (!head) {
  17. head = script.parentNode;
  18. }
  19.  
  20. dataMain = script.getAttribute('data-main'); /**dataMain= main.js*/
  21. if (dataMain) {
  22. //Preserve dataMain in case it is a path (i.e. contains '?')
  23. mainScript = dataMain;
  24.  
  25. //Set final baseUrl if there is not already an explicit one.
  26. if (!cfg.baseUrl) {
  27. /**
  28. * src 已经变成数组,出队列,mainScript=main.js
  29. * */
  30. src = mainScript.split('/');
  31. mainScript = src.pop();
  32. subPath = src.length ? src.join('/') + '/' : './';
  33.  
  34. /***
  35. * src.length=0,cfg.baseUrl='./'
  36. * 目的是与 main.js 统一目录
  37. * */
  38. cfg.baseUrl = subPath;
  39. }
  40.  
  41. /** 正则匹配,mainScript=main,此时去掉 .js 后缀,看起来更像是一个 module */
  42. mainScript = mainScript.replace(jsSuffixRegExp, '');
  43.  
  44. //If mainScript is still a path, fall back to dataMain
  45. if (req.jsExtRegExp.test(mainScript)) {
  46. mainScript = dataMain;
  47. }
  48.  
  49. /** 将主入口js文件放入 加载的配置文件列表中,将对 main.js 进行加载 ---req(cfg) */
  50. cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];
  51.  
  52. return true;
  53. }
  54. });
  55. }
  1.  

  经过上述代码的处理,cfg.deps值已经发生改变,已包括 main.js,接下来便要去获取 main.js中的内容,以及与它相关联的内容。

  

  1.  

requireJS 源码(二) data-main 的加载实现的更多相关文章

  1. 【requireJS源码学习02】data-main加载的实现

    前言 经过昨天的学习,我们大概了解到了requireJS的主要结构,这里先大概的回顾一下 首先从总体结构来说,require这里分为三块: ① newContext之前变量声明或者一些工具函数 ② n ...

  2. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  3. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  4. 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作

    前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...

  5. Spring源码分析:非懒加载的单例Bean初始化前后的一些操作

    之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...

  6. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

  7. spring源码学习之bean的加载(二)

    这是接着上篇继续写bean的加载过程,好像是有点太多了,因为bean的加载过程是很复杂的,要处理的情况有很多,继续... 7.创建bean 常规的bean的创建时通过doCreateBean方法来实现 ...

  8. 1. spring5源码 -- Spring整体脉络 IOC加载过程 Bean的生命周期

    可以学习到什么? 0. spring整体脉络 1. 描述BeanFactory 2. BeanFactory和ApplicationContext的区别 3. 简述SpringIoC的加载过程 4. ...

  9. Spring源码:Spring IoC容器加载过程(2)

    Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...

  10. vscode源码分析【八】加载第一个画面

    第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 ...

随机推荐

  1. bootstrap4中文版(纯手工翻译)

    1初步开始 1.1依赖 这个仓储包含一系列基于bootstrap标识和css样式的原生angular2指令.所以是不需要依赖jq和bootstrap.js的.只需要以下依赖即可: Angular(需要 ...

  2. [转载]OpenStack OVS GRE/VXLAN网络

      学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网络部分:30%的时间花费在了存储方面:20%的时间花费在了计算方面.OpenStack网络是不得不逾越的鸿沟,接下来我们一起尝 ...

  3. sqlserver使用job删除过期备份文件

    享下链接:http://blog.csdn.net/xieyufei/article/details/33770067(注意这里主要说明怎么设置删除过期备份文件) 先说下sqlserver使用job删 ...

  4. Java将头像图片保存到MySQL数据库

    在做头像上传的过程中通常是将图片保存到数据库中,这里简单介绍一中将图片保存到数据库的方法: jsp代码: <div> <input class="avatar-input& ...

  5. {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习

    要求: 使用多线程实现多发送方发送数据到同一个接收者 代码: 发送端:可以在多台电脑上启动发送端,同时向接收端发送数据 注意:匹配地址和端口号 package com.qf.demo; import ...

  6. Windows7 安装完成mysql dos启动服务出现服务名称无效

    错误提示:  WIN 7 cmd命令行下,net start mysql,出现 服务名无效提示: 错误分析: Mysql服务未安装 解决方案:在mysql 安装目录下bin文件夹  安装Shift+鼠 ...

  7. Spring 4学习——问题与注意事项(一)

    1.Spring项目依赖的jar包有5个: 2.applicationContext.xml文件中,如下bean的property的name值对应的是HelloWorld类中的setter方法,即na ...

  8. openjdk7之编译和debug

    大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...

  9. matplotlib.pyplot.hist

    **n, bins, patches = plt.hist(datasets, bins, normed=False, facecolor=None, alpha=None)** ## 函数说明 用于 ...

  10. springmvc 之 返回值

    springMVC对于controller处理方法返回值的可选类型 spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, Stri ...