下面requireJS实现的基本思路  项目地址https://github.com/WangMaoling/require

var require = (function(){
//框架版本基本信息
var __BASEINFO__ = {
__VERSION__ : "1.0.1",
__AUTHORS__ : "WANGMAOLING",
__GIT__ : "... "
}; // 设置默认路径
var __DEFAULTS__ = {
// 配置个常量 module_script 里面为用户自定义的js 把用户写的给包起来
__EXPORTS__ : "(function(){var exports;{{module_script}};return exports;})();",
main : "index.js",//默认入口文件
path : "./node_module/"//默认路径
}; var __PROTOTYPE__ = {
// 获取版本信息
version : function(){
return this.__VERSION__;
},
// 单独写个函数写文件路径,为了日后改起来方便
file : function(module){
// 改变this指向的方法
return this.path+module+"/"+this.main;
},
load : function(module){
//ajax 请求js内容 并想办法吧内容包装到闭包里面return出去,这样避免全局污染 // (function(){var exports;{{module_script}}return exports;})(); var oAjax = null;
var _this = this;
var _exports_ = null;//定义导出的对象,给个空
var url = this.file(module);
if(window.XMLHttpRequest){
oAjax = new XMLHttpRequest();
}else{
oAjax = new ActiveXObject('Microsoft.XMLHTTP');
}
oAjax.onreadystatechange = function(){
if(oAjax.readyState==4){
if(oAjax.status==200){
// 把module_script 替换为相应过来的文件内容
var _module_ = _this.__EXPORTS__.replace("{{module_script}}",oAjax.responseText);
_exports_ = eval(_module_);//执行以下 获取执行结果
// console.log(_exports_);
}
}
}
// oAjax.open('GET', url, true);true 表示 ajax为异步请求,这里这样会报错,因为当页面请求返回时
//_exports_还明没有响应过来 所以会返回null,所以要变成同步,一个执行完接着在执行
oAjax.open('GET', url, false);
oAjax.send();
// console.log(_exports_);
return _exports_;//返回执行后的结果,当调用 load 的时候就会返回结果
// this.path+module+"/"+this.main;
// console.log(this.file(module));
}
}; //整个放在闭包里面,因为其他插件也有的有require 万一有冲突 只需改变最外面的名字即可;
var __require = function(module){
//调用load 改变this指向 写call方法只是为了加强理解 下面也可以 __require.load(module) 这样写
// 当调用 __require的时候也就调用了 load 把结果返回出去
return __require.load.call(__require,module);
// console.log(this.path);
}
// 配置require全局参数
__require.config = function(options){
this.extend(options);
// console.log(this.path);
}
// 扩展require函数对象的功能 或许有多个参数传进来 这里用了arguments
__require.extend = function(){
for(var i=0;i<arguments.length;i++){
var obj = arguments[i];
for(var prop in obj){
this[prop] = obj[prop];
}
}
}
// 继承扩展 通过extend方法吧下面两个方法里面的属性方法 全部赋给了require
__require.extend(__BASEINFO__,__DEFAULTS__,__PROTOTYPE__);
return __require;
})();

requireJS实现原理分析的更多相关文章

  1. browserify运行原理分析

    目前对于前端工程师而言,如果只针对浏览器编写代码,那么很简单,只需要在页面的script脚本中引入所用js就可以了. 但是某些情况下,我们可能需要在服务端也跑一套类似的逻辑代码,考虑如下这些情景(以n ...

  2. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  3. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  4. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  5. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  6. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  7. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  8. NOR Flash擦写和原理分析

    NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...

  9. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

随机推荐

  1. 【POJ 2182】Lost Cows

    [题目链接] http://poj.org/problem?id=2182 [算法] 树状数组 + 二分 [代码] #include <algorithm> #include <bi ...

  2. DB-MySQL:MySQL 复制表

    ylbtech-DB-MySQL:MySQL  复制表 1.返回顶部 1. MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TA ...

  3. ubuntu下谷歌浏览器字体模糊解决方案

    一般来说,这种问题应该是缺少字体造成的,因此重新安装字体就可以解决问题. 1.双系统下,查找Windows C盘下:Windows/font/???? ???可在3中查找相应字体 2.分别双击安装那两 ...

  4. 谈谈javascript中原型继承

    什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...

  5. Java操作Kafka执行不成功

    使用kafka-clients操作kafka始终不成功,原因不清楚,下面贴出相关代码及配置,请懂得指点一下,谢谢! 环境及依赖 <dependency> <groupId>or ...

  6. python3 pymysql学习笔记

    练手项目需要用到mysql就顺手把mysql也学了,这个模块没什么好说的,比较简单,实际整个过程我都是在学mysql语句,但还是发现了一些问题. fetchall() 获取结果集中的所有行 这个函数难 ...

  7. CF1042F Leaf Sets (贪心+树上构造)

    题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数 手动yy的贪心竟然对的 对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶 ...

  8. Linux磁盘分区--MBR分区

    今天心情不高兴,做IT不容易被公司重视,一定要速度学会运营,成为一个高逼格的技术男. 今天我要熟练掌握linux系统分区的能力.大家都知道,linux系统分区有两种分区格式:GTP和MBR. MBR作 ...

  9. Linux之awk使用

    基本语法 $n :当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 $0:执行过程中当前行的文本内容 \t:制表符 \n:换行符 -F'[:#/]' : 定义三个分隔符,注意有-F ...

  10. django-1-框架介绍

    <<<python虚拟环境>>> 用django框架做web开发必须要用到python虚拟环境,而且一个虚拟环境只能创建一个django项目,如果创建多个djang ...