我们学习一个新的技术,熟练的使用之后,就应该去探索它的原理。这篇文章我们来探索下requirejs的原理。

从4个场景来探索requirejs的原理

场景1. 定义一个require依赖b模块

场景2. 定义一个require依赖模块b,模块b依赖模块c

场景3. 定义一个依赖来自外部的js模块

场景3. 当出现循环依赖时

本篇博客讲场景1

步骤一,断点代码到define方法,我们传入的name,deps和callback被push到golbalDefQueue数据中

步骤二,断点到requirejs方法,在这个方法内部调用了intakeDefines这个方法是对步骤1中golbalDefQueue数组内容转换成module,并且调用module的init方法对模块进行了初始化,这时候module的状态为inited

步骤三:当所有的module都初始化后,进入了requirejs的settimeout函数。这里因为require(["b"], function(){})首先要生成一个自定义名字的模块,它的依赖为b,然后执行这个自定义模块的init并且设置这个module的状态为enabled。

步骤四,init方法内部会调用enable方法,这个方法是一个递归的方法,对它的依赖module递归执行enable方法。父模块会绑定一个子模块的defined事件,当子模块触发defined事件时,会将已经defined的模块加入到父模块的依赖数组中,当所有的依赖都defined后,执行父模块的的callback方法(也就是定义在require中的function)

好了,这里介绍了requirejs的加载过程,总结:

a. 首先执行define方法,将所有的定义的模块都放到golbalDefQueue中

b. 执行requirejs方法,将所有的golbalDefQueue中的模块取出,并转换成module,这时候module的状态为inited

c. 执行setimeout方法,根据require方法生产一个主module,然后eabled主module,并且依次enabled所有的依赖module。每次调用enable时,module的状态为enabled

d. 当module的所有依赖都defined时,执行require的回调方法,将module的状态更新为defined。

下篇文章继续介绍下一个场景:当依赖模块来自外部的js文件时,requirejs的执行过程。

requirejs的加载原理 - 场景1. 定义一个require依赖a模块的更多相关文章

  1. 【requireJS源码学习03】细究requireJS的加载流程

    前言 这个星期折腾了一周,中间没有什么时间学习,周末又干了些其它事情,这个时候正好有时间,我们一起来继续学习requireJS吧 还是那句话,小钗觉得requireJS本身还是有点难度的,估计完全吸收 ...

  2. 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转

      最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...

  3. Grunt-cli的执行过程以及Grunt加载原理

    通过本篇你可以了解到: 1 grunt-cli的执行原理 2 nodeJS中模块的加载过程 Grunt-cli原理 grunt-cli其实也是Node模块,它可以帮助我们在控制台中直接运行grunt命 ...

  4. 深入解析 composer 的自动加载原理 (转)

    深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...

  5. Spring Boot源码分析-配置文件加载原理

    在Spring Boot源码分析-启动过程中我们进行了启动源码的分析,大致了解了整个Spring Boot的启动过程,具体细节这里不再赘述,感兴趣的同学可以自行阅读.今天让我们继续阅读源码,了解配置文 ...

  6. iOS 下拉刷新-上拉加载原理

    前言 讲下拉刷新及上拉加载之前先给大家解释UIScrollView的几个属性 contentSize是UIScrollView可以滚动的区域. contentOfinset 苹果官方文档的解释是&qu ...

  7. 【requireJS路径加载】与程序员小卡的交流

    这两天正好看到了程序员小卡同学的一篇博客,里面对requireJS路径的解析做了一些说明,里面有点问题待解决,我这里正好知道一点,所以整理成文,不知对小卡同学是否有帮助. http://www.cnb ...

  8. 第三课:sea.js模块加载原理

    模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...

  9. (转)Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)

      异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene ...

随机推荐

  1. 1.3RDD的设计与运行原理

    此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 提供一种通用的数据抽象 RDD典型的执行过程如下: RDD读入外部数据源(或者内存中的集合 ...

  2. HTTP状态码:3XX

    3XX状态码 含义:表明浏览器需要执行某些特殊的处理以正确的处理请求,大部分都需要进行重定向.这类状态码代表需要客户端采取进一步的操作才能完成请求.通常,这些状态码用来重定向,后续的请求地址(重定向目 ...

  3. Ubuntu 16.04 + python3 源码 安装+使用labelImg最新版

    安装 sudo apt-get update sudo apt-get upgrade sudo apt install python3-pip git clone https://github.co ...

  4. Google Chrome浏览器必备的20个插件

    Google Chrome浏览器虽然与火狐浏览器有所区别,不过他们都是很开放的浏览器产品,所以也有许多有用的插件,这些插件对于日常生活与网络冲浪都很有用,比如网银,炒股等. Google Chrome ...

  5. 由Eratosthenes筛法演变出的一种素数新筛法

    这两天和walls老师交流讨论了一个中学竞赛题,我把原题稍作增强和变形,得到如下一个题: 从105到204这100个数中至少要选取多少个数才能保证选出的数中必有两个不是互素的? 我们知道最小的几个素数 ...

  6. Linux centos7 nginx 平滑升级

    2021-08-19为了方便读者的阅读,该文通篇使用绝对路径,各位朋友们在实际上操作中可以根据实际情况编写路径(#^.^#)1. 当前环境 # system cat /etc/redhat-relea ...

  7. uni-app 小程序从零开始的开发流程

    前言 本文基于 HBuilderX 3.1.22 + 微信开发者工具 1.05.2106300为主要内容进行说明. 文档版本:1.0.0 更新时间:2021-09-03 15:32 一.准备 uni- ...

  8. Java实现一个死锁

    Java实现一个死锁 有一个藏宝图(treasureMapFragment)分成两份jack持有treasureMapFragment1残片1,json持有残片2.jack要求必须先看到json的残图 ...

  9. Django——session保持登录

    Django操作session语法: # 1.设置Sessions值 request.session['session_name'] ="admin" # 2.获取Sessions ...

  10. Linux proc文件系统小记

    序言: 当linux系统存在多个网口时(也可以是一个网口配置两个IP),每个网口配置不同的IP地址,并且分别连接到不同的电脑上,电脑分别配置与相连的网口统一网段的IP且将电脑网关设置为linux的网口 ...