博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
30分钟 带你浅入requirejs源码
阅读量:6111 次
发布时间:2019-06-21

本文共 1763 字,大约阅读时间需要 5 分钟。

因为最近项目想现实一个单页功能,用的是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.jsdefine([], function() {    return {        name: 'xm',        age: 22    }});
//db.jsdefine(['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的同学有所帮助,谢谢观看完毕。

 

转载于:https://www.cnblogs.com/skyweaver/p/5096327.html

你可能感兴趣的文章
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
熟练掌握doc命令下的文件操作
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>
HTML模块化:使用HTML5 Boilerplate模板
查看>>
登记申请汇总
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
PHP使用DES进行加密和解密
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>