一个极为简单的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 相关文章推荐
用JavaScript页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
JavaScript数组方法总结分析
May 06 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
ES6扩展运算符的用途实例详解
Aug 20 Javascript
ES6中的Promise代码详解
Oct 09 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
Jan 22 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 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
sql注入与转义的php函数代码
2013/06/17 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
js 学习笔记(三)
2009/12/29 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python概率计算器实例分析
2015/03/25 Python
Python2与Python3的区别实例总结
2019/04/17 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
python实现人脸签到系统
2020/04/13 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
后勤自我鉴定
2013/10/13 职场文书
大专生简历的自我评价
2013/11/26 职场文书
作文评语怎么写
2014/12/25 职场文书
初三英语教学计划
2015/01/23 职场文书
初中军训感言
2015/08/01 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python