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. $node.appendChild($script);
  53. })($script);
  54.  
  55. }
  56.  
  57. }
  58.  
  59. //创建一个script标签
  60. function createScript(src, index) {
  61. var $script = document.createElement('script');
  62.  
  63. $script.setAttribute('src', src);
  64. $script.setAttribute('index', index);
  65.  
  66. return $script;
  67. }

然后写了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

打开console,看到如下结果

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

  1. 一个极为简单的方法实现本地(离线)yum安装rpm包

    首先,我要关心的问题仍然是如何离线或者本地yum安装rpm包?这其中的关键当然是获取rpm包到本地,这其中的麻烦事是去解析依赖关系.然而,我发现一个极为简单的方法可以不用操心rpm包依赖关系,不多不少 ...

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

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  3. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  4. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  5. 一个js简单的日历显示效果的函数

    用一个函数简单的实现一个月份的日历,效果如下: 这个日历效果有高亮显示,我实现的思维比较简单. 我把上面的日历效果用表格table生成,分成两个部分. 第一个部分:就是前面的第一排,我用一行<t ...

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

    前言 本篇用一个最简单的例子引入makefile,教你编写第一个makefile 正文 在Download/aa文件夹下有a.c和makefile文件 litao@litao:~/Downloads/ ...

  7. Windows下用Codeblocks建立一个最简单的DLL动态链接库

    转自:http://blog.csdn.net/wangwei_cq/article/details/8187576 来源:http://hi.baidu.com/hellosim/item/9ae4 ...

  8. 用qpython3写一个最简单的发送短信的程序

    到目前为止并没有多少手机应用是用python开发的,不过qpython可以作为一个不错的玩具推荐给大家来玩. 写一个最简单的发送短信的程序,代码如下: #-*-coding:utf8;-*- #qpy ...

  9. linux搭建一个配置简单的nginx反向代理服务器 2个tomcat

    1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...

随机推荐

  1. oc 无中生有添加协议(使已有函数符合协议)

    class_addProtocol([UIButton class],@protocol(UIButtonExport)); @protocol UIButtonExport <JSExport ...

  2. POJ 3067 Japan 【树状数组经典】

    题目链接:POJ 3067 Japan Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32076   Accep ...

  3. java多线程(简单介绍)

    简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...

  4. Android学习笔记_62_手机安全卫士知识点归纳(2)ListView重要属性 PopupWindow应用

    1.缓存颜色: 为什么ListView在拖动的时间是黑色,而静止时间是自己的颜色是因为 ListView的缓存.只需一个配置即可.在这个ListView里面加上它即可. android:cacheCo ...

  5. logistic regression svm hinge loss

    二类分类器svm 的loss function 是 hinge loss:L(y)=max(0,1-t*y),t=+1 or -1,是标签属性. 对线性svm,y=w*x+b,其中w为权重,b为偏置项 ...

  6. select选中的值改变另一个input的值

    HTML: <select id="hhh" onchange="aa()"><option value="11"> ...

  7. 路由器基本配置实验,静态路由和动态RIP路由

    实验涉及命令以及知识补充 连线 PC和交换机FastEtherNet接口 交换机和路由器FastEtherNet接口 路由器和路由器Serial接口 serial是串行口,一般用于连接设备,不能连接电 ...

  8. Windows获取物理内存的2种方式 - 随笔记录

    typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation, SystemProcessorInformation, // obso ...

  9. docker 启动 nginx 访问不了的问题

    使用版本:nginx version: nginx/1.13.8 正使用docker启动nginx容器的时候,一切都很正常,容器也起来了 docker run -dit -p 80:80 --name ...

  10. 虚拟环境管理之virtualenvwrapper

    上一篇写了下在linux上使用python的虚拟环境, 干脆把virtualenvwrapper也写一下 1.为什么要用virtualenvwrapper virtualenv 的一个最大的缺点就是: ...