因为最近项目想现实一个单页功能,用的是react ,然后看了一下react route,挖槽 gzip后16k? 然后我简单写了一个纯单页(不支持多页的单页,所有入口都经过rewrite跑到index.html) 才200多行(后续放github)。

然后项目是用webpack打包的, 发现webpack的 require.ensure不支持变量加载的(至少暂时没发现), 就是意味着我有多小页面,就得在main(入口里配多小页面的关系)  这样挫,领导会喷我的。

然后我今天早上起来,想看看requirejs是如何现实的

好前戏完毕 直入主题,大家都知道requrejs 有一个data-main 配置 , 顾名思义就是 入口 类似c,java的main函数

main.js

require.config({
paths: {
'xm': 'xm',
'adb': 'db'
},
waitSeconds: 50
}) requirejs(['xm', 'adb'], function(xm, db) {
console.log(xm, 'main'); db.db(); });

然后定义了2个文件 ,分别是xm.js 和db.js

//xm.js
define([], function() {
return {
name: 'xm',
age: 22
}
});
//db.js
define(['xm'], function(xm){ return {
db: function(){
var who = xm.name; console.log(who, ' play');
}
} })

首先,我们把代码叠起来, 一览众山小

可以看到,其实requirejs 很简单, 只有3个api(按我的理解, 有错请指正)

1、requirejs, 引入定义的模块,并执行callback的代码
2、require,只引入,不执行
3、define,定义一个模块

然后具体看实现的地方

前面1000多行都是 内部调用的 function的实现,例如判断函数啊, 是否数组啊,遍历,反向遍历  etc.. ,太细节 就不多说了

着重看看后面的req变量的实现, 本来想加些标注的, 但是发现 每行都是重点, 正如小时候老师让我们画重点,经常半页书都画上, 不如不画了  囧。

1、这里requirejs 就是上面说到的1的实现
2、config其实就是一系列的配置,例如base路径,path(配短名字), urlArgs(问号后加时间戳之类的),shim(没有用define声明的模块,全局注入)   etc..
3、nextTick 其实就是一个定时器, 按你代码 加入的模块,逐个依次 创建script标签 引入到页面
4、然后 引入require的时候,他会默认加了一个版本,默认初始化(注意这行 req({}) ), 默认错误提示等等
5、define函数的实现

好,有了上面已经知道require大概有些什么了, 然后来一起看看某几个重要的细节点。
首先代码里先看看data-main这个关键词 ,其实就是遍历所有的TagName为script的,找到data-main, 然后处理了一下路径

然后最后一行,其实才是真正的main入口初始化


然后第一次require会根据配了的data-main 以下列处理后,通过req.load 自动引入main.js 

第一次自动调用requirejs 内容基本都是默认值,没啥好看的,  来 一起看看我们main.js 里主动调用的requrejs、

然后 继续跟下去  发现最后调用了Module的有个each,然后是会调用自己的fetch,load进行一个一个按顺序像main加载步骤一样 加载

因为时间原因,有些太细的点就不深入一一步析  希望此文对初了解requirejs的同学有所帮助,谢谢观看完毕。

30分钟 带你浅入requirejs源码的更多相关文章

  1. 30分钟 带你浅入seajs源码

    上个星期写了浅入requirejs的,  大家都知道 require是AMD规范(Asynchronous Module Definition) 来  今天我们一起看看 CMD规范(Common Mo ...

  2. 浅谈flask源码之请求过程

    更新时间:2018年07月26日 09:51:36   作者:Dear.   我要评论   这篇文章主要介绍了浅谈flask源码之请求过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随 ...

  3. requireJS 源码(二) data-main 的加载实现

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

  4. RequireJs 源码解读及思考

    写在前面: 最近做的一个项目,用的require和backbone,对两者的使用已经很熟悉了,但是一直都有好奇他们怎么实现的,一直寻思着读读源码.现在项目结束,终于有机会好好研究一下. 本文重要解读r ...

  5. Chrome自带恐龙小游戏的源码研究(七)

    在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...

  6. Chrome自带恐龙小游戏的源码研究(完)

    在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...

  7. Chrome自带恐龙小游戏的源码研究(五)

    在上一篇<Chrome自带恐龙小游戏的源码研究(四)>中实现了障碍物的绘制及移动,从这一篇开始主要研究恐龙的绘制及一系列键盘动作的实现. 会眨眼睛的恐龙 在游戏开始前的待机界面,如果仔细观 ...

  8. Chrome自带恐龙小游戏的源码研究(四)

    在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高. ...

  9. Chrome自带恐龙小游戏的源码研究(三)

    在上一篇<Chrome自带恐龙小游戏的源码研究(二)>中实现了云朵的绘制和移动,这一篇主要研究如何让游戏实现昼夜交替. 昼夜交替的效果主要是通过样式来完成,但改变样式的时机则由脚本控制. ...

随机推荐

  1. DSL-领域特定语言(英语:domain-specific language、DSL)

    领域特定语言(英语:domain-specific language.DSL)指的是专注于某个应用程序领域的计算机语言.

  2. 高通Vuforia

    这里使用高通的Vuroria来做一个AR歌姬. 工具: Vuforia,MMD4Mecanim 模型: 初音未来pmd模型文件,极乐净土vmd动作文件. 逻辑: 当发现识别卡时:开启音乐,模型速度为1 ...

  3. ubuntu误删home目录

    今天第一次写shell脚本,一不小心把home目录全给删除了. 解决方案: 先把手打上二十大板!!! [root@myshell ~]#mkdir /home/test01             / ...

  4. 从命令行运行Jmeter及jmeter参数说明、Html报告生成

    为什么要命令行执行脚本,主要有以下三点: 1) 图形化界面消耗更多资源,CPU和内存 2) 图形化界面不支持大型的负载测试和性能测试 3) 命令行测试支持持续集成,例如放到Jenkins这样的CI工具 ...

  5. 负的CPU保护环

    什么是CPU保护环? 在计算机科学中, 分级保护域(英语:hierarchical protection domains),经常被叫作保护环(Protection Rings),又称环型保护(Ring ...

  6. sougou输入法无法正常输入汉字

    删除~/.config目录下的SougouPY SogouPY.users sogou-qimpanel文件夹,然后重启搜狗输入法即可

  7. out 和ref 的区别

    练习 1: 练习 2: 练习 3:

  8. eclipse 安装/卸载插件

    1.通过Help>>Install New Soft 之后弹出对话框,可以通过“Add”按钮添加已经有的插件的(zip等)或者输入安装地址,之后按照要求即可.2.对于安装失败的插件,再次进 ...

  9. 【办公-Word-VB】人民币大写转换-带完整注释

    完整代码见:我的CSDN博客 -------------------- 应公司财务人员的请求,需在Word中做个:输入阿拉伯数字,自动转换成大写,并填充到Word控件中对应的亿.万.千控件格子的功能, ...

  10. 菜鸟笔记 -- Chapter 6.2.6 内部类

    6.2.6  内部类 在权限修饰符中,我们已经见过内部类了,但我们看到的只是冰山一角,这节我们详细介绍一下内部类,内部类可以分为成员内部类,局部内部类,匿名内部类,静态内部类.下面我们来讲解一下,在讲 ...