一个极为简单的requirejs实现

require和 sea的源码分析,我之前的博客有写过, 今天我想分享的是一个很简单的核心代码(不带注释和空行大概60行), 没有容错判断。

require.js

require函数实现用一句话概括:

依次加载require的模块,然后监测script的onload事件,判断所有模块加载成功,执行require的callback, 如果只带一个参数且不是数组,就是加载成功后return 模块。

 1 //标记已经加载成功的个数
 2 var REQ_TOTAL = 0;
 3 //模块导出
 4 window.exports = {};
 5 //记录各个模块的顺序
 6 var exp_arr = [];
 7
 8 //判断是否数组
 9 function isArray(param) {
10     return param instanceof Array;
11 }
12
13 //require 真正实现
14 function require(arr, callback) {
15
16     var req_list;
17
18     if(isArray(arr)) {
19         req_list = arr;
20     } else {
21         req_list = [arr];
22     }
23     var req_len = req_list.length;
24
25     //模块逐个加载
26     for(var i=0;i<req_len;i++) {
27         var req_item = req_list[i];
28
29         var $script = createScript(req_item, i);
30
31         var $node = document.querySelector(‘head‘);
32
33         (function($script) {
34             //检测script 的onload事件
35             $script.onload = function() {
36                 REQ_TOTAL++;
37
38                 var script_index = $script.getAttribute(‘index‘);
39
40                 exp_arr[script_index] = exports;
41
42                 window.exports = {};
43
44                 //所有链接加载成功后,执行callback
45                 if(REQ_TOTAL == req_len) {
46                     callback && callback.apply(exports, exp_arr);
47
48              49                 }
50
51             }
52
53             $node.appendChild($script);
54         })($script);
55
56     }
57
58 }
59
60 //创建一个script标签
61 function createScript(src, index) {
62     var $script = document.createElement(‘script‘);
63
64     $script.setAttribute(‘src‘, src);
65     $script.setAttribute(‘index‘, index);
66
67     return $script;
68 }

然后写了2个导出模块的js文件, 只写了最简单的exports实现

define.js

1 exports.define = {
2     topic: ‘my export‘,
3     desc: ‘this is other way to define ‘,
4     sayHello: function() {
5         console.log(‘topic ‘ + this.topic + this.desc);
6     }
7 }

define2.js

1 exports.define = {
2     name: ‘xm‘,
3     age: 22,
4     info: function() {
5         console.log(‘topic ‘ + this.name + this.age);
6     }
7 }

然后测试demo很简单

1 //测试demo
2 require([‘../res/define.js‘, ‘../res/define2.js‘], function(def, def2) {
3     def.define.sayHello();
4
5     def2.define.info();
6 });

demo地址 :https://skyweaver213.github.io/requirejs-demo/example/dev/demo.html

github地址:https://github.com/skyweaver213/requirejs-demo

时间: 2024-12-05 19:52:18

一个极为简单的requirejs实现的相关文章

利用x64_dbg破解一个最简单的64位小程序

最近在研究学习一些逆向的东西,其实之前也涉及到这方面的东西,只是之前的系统和应用,基本上都是32位的,所以直接用od来分析就行了,这方面的资料在网上很多,随便一搜到处都是,不过随着技术的不断发展,64位系统出现了,随之64位的应用也出现了,而od只能分析32位应用,所以一些64位应用,od是没办法分析逆向的,所以,在这里要提到另一个可以用于分析64位应用的调试软件,名字叫x64_dbg.网上对于这款软件的介绍很少,只是说能分析64位应用,具体用法也找不到,不过我找到了它的一个教程,里面有一个最简

[编译] 1、第一个makefile简单例子

前言 本篇用一个最简单的例子引入makefile,教你编写第一个makefile 正文 在Download/aa文件夹下有a.c和makefile文件 1 [email protected]:~/Downloads/aa$ ls 2 a.c makefile 其中a.c为: 1 #include<stdio.h> 2 int main() 3 { 4 int i,j; 5 for(i=0;i<10;i++) 6 { 7 for(j=2*i+1;j>0;j--) 8 { 9 prin

打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)具体解释

为什么要做这个看起来不靠谱的东西呢? 由于刚学android开发,还不能非常好的熟练控制android界面的编辑和操作,所以我的一个急着要的运用就改为html5版本号了,反正这个运用也是须要从server获取大量数据来展示在手机上面的,也就是说:必须联网,才干正常工作,于是想了一下,反正都要联网获取数据,为什么不直接用我相对熟悉一点的 html来做这个运用呢?省的花费不够用的时间去学习android界面的控制,于是就简单了:用蹩脚的手段做了一个android程序的启动欢迎界面,内页就是一个全屏的

基于php的一个最简单的memcache的分布式算法

首先,核心函数是这个 function mHash($key){ $md=substr(md5($key),0,8); $seed=31; $hash=0; for($i=0;$i<8;$i++){ $hash=$hash*$seed+ord($md5{$i}); } return $hash & 0x7FFFFFFF; } class HashServer{ private $serverlist; private $issorted=false; function addServer($

用一个例子读懂 RequireJS

用一个例子读懂 RequireJS 例子来自官方,我稍微改造了一下,如下: // project.html <!DOCTYPE html> <html>     <head>         <title>requirejs</title>         <!-- data-main attribute tells require.js to load              scripts/main.js after require.

一个最简单的Socket通信例子

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和ServerSocket类库位于java.net包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别.不管是

[.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

打造一个很简单的文档转换器 - 使用组件 Spire.Office 目录 Spire.Office 介绍 库引用 界面预览 代码片段 Spire.Office 介绍 关于 Spire.Office,它是一个专门为开发人员创建,读取,写入设计的库,转换和从打印 word 文档文件.作为一个独立的 .NET组件,它不需要在机器上安装微软的 Word 等办公软件.然而,它可以将微软的“文档创建功能”集成到任何开发人员的网络应用程序中.它是一个可靠的 MS Word 的API,可以执行许多Word文档处

一个超简单的马里奥游戏

理论是需要通过实践来检验的,学了这么多,于是我就试了试采用面向对象的编程思想实现了一个超级简单的马里奥游戏,游戏感觉特傻! 准备素材(图片mario.jpg): 分析: 如何通过按钮控制图片的位置 设计相关的对象 要求:Mario碰到边界给一个提示.(其实还有一个要求就是Mario可以去找另一个物体,没有实现.) 以下为源码: 超级马里奥游戏.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8

Hello,Cardboard!!-如何开发一个最简单的Cardboard虚拟现实应用(一)

温馨提醒,本篇为介绍篇,如果只想看如何开发的具体步骤请参看<Hello,Cardboard!!-如何开发一个最简单的Cardboard虚拟现实应用(三)> 前述:恕我啰嗦一下,主要照顾对cardboard不太了解的朋在,Cardboard是由Google公司的两位巴黎办公室的员工利用业余时间创作出来的作品,它最大的特点就是将原来人们以为高大上的虚拟现实技术以廉价的方式带进了公众的视野,到目前为止,google已推出了改良版的cardboard 2代盒子,相比1代,2代改善了成像,增加了视野范围