一个极为简单的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 Column布局
Oct 08 Javascript
js 学习笔记(三)
Dec 29 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
Sep 28 Javascript
详解JavaScript操作HTML DOM的基本方式
Oct 21 Javascript
javascript this详细介绍
Sep 19 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
Oct 07 Javascript
小程序实现自定义导航栏适配完美版
Apr 02 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 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利用单例模式实现日志处理类库
2014/02/10 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
小程序实现投票进度条
2019/11/20 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
Django的信号机制详解
2017/05/05 Python
python读取和保存视频文件
2018/04/16 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
pandas中ix的使用详细讲解
2020/03/09 Python
python的launcher用法知识点总结
2020/08/07 Python
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
毕业生求职推荐信
2013/11/04 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
初中生活随笔
2015/08/15 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫