一个极为简单的requirejs实现方法


Posted in Javascript onOctober 20, 2016

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

require.js

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

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

 

//标记已经加载成功的个数
var REQ_TOTAL = 0;
//模块导出
window.exports = {};
//记录各个模块的顺序
var exp_arr = [];

//判断是否数组
function isArray(param) {
  return param instanceof Array;
}

//require 真正实现
function require(arr, callback) {

  var req_list;

  if(isArray(arr)) {
    req_list = arr;
  } else {
    req_list = [arr];
  }
  var req_len = req_list.length;

  //模块逐个加载
  for(var i=0;i<req_len;i++) {
    var req_item = req_list[i];

    var $script = createScript(req_item, i);

    var $node = document.querySelector('head');

    (function($script) {
      //检测script 的onload事件
      $script.onload = function() {
        REQ_TOTAL++;

        var script_index = $script.getAttribute('index');

        exp_arr[script_index] = exports;

        window.exports = {};

        //所有链接加载成功后,执行callback
        if(REQ_TOTAL == req_len) {
          callback && callback.apply(exports, exp_arr);

       
        }

      }

      $node.appendChild($script);
    })($script);

  }

}

//创建一个script标签
function createScript(src, index) {
  var $script = document.createElement('script');

  $script.setAttribute('src', src);
  $script.setAttribute('index', index);

  return $script;
}

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

define.js

exports.define = {
  topic: 'my export',
  desc: 'this is other way to define ',
  sayHello: function() {
    console.log('topic ' + this.topic + this.desc);
  }
}

define2.js

exports.define = {
  name: 'xm',
  age: 22,
  info: function() {
    console.log('topic ' + this.name + this.age);
  }
}

然后测试demo很简单

//测试demo
 require(['../res/define.js', '../res/define2.js'], function(def, def2) {
   def.define.sayHello();
 
   def2.define.info();
 });

以上就是小编为大家带来的一个极为简单的requirejs实现方法全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
Sep 09 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 Javascript
vue移动端轻量级的轮播组件实现代码
Jul 12 Javascript
小程序实现单选多选功能
Nov 04 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 07 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
Sep 08 Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 Javascript
JavaScript动态生成表格的示例
Nov 02 Javascript
JavaScript实现窗口抖动效果
Oct 19 #Javascript
原生js图片轮播效果实现代码
Oct 19 #Javascript
Angular2表单自定义验证器的实现
Oct 19 #Javascript
javascript滚轮控制模拟滚动条
Oct 19 #Javascript
Vue.js绑定HTML class数组语法错误的原因分析
Oct 19 #Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 #Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 #Javascript
You might like
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
理清apply(),call()的区别和关系
2011/08/14 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
Python实现二维曲线拟合的方法
2018/12/29 Python
Python多项式回归的实现方法
2019/03/11 Python
Python实现密码薄文件读写操作
2019/12/16 Python
python deque模块简单使用代码实例
2020/03/12 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
人事专员工作职责
2014/02/22 职场文书
公益广告语集锦
2014/03/13 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
学校班班通实施方案
2014/06/11 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
招商引资工作汇报
2014/10/28 职场文书
大学军训的体会
2014/11/08 职场文书
中班教师个人总结
2015/02/05 职场文书
亲戚关系证明
2015/06/24 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS