一个极为简单的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 避免闭包引发的问题
Mar 17 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
Nov 15 Javascript
在JavaScript的正则表达式中使用exec()方法
Jun 16 Javascript
详解javascript函数的参数
Nov 10 Javascript
微信小程序 location API实例详解
Oct 02 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
Dec 23 Javascript
js select下拉联动 更具级联性!
Apr 17 Javascript
vue使用drag与drop实现拖拽的示例代码
Sep 07 Javascript
基于vue2.0动态组件及render详解
Mar 17 Javascript
浅谈redux, koa, express 中间件实现对比解析
May 23 Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHP学习 变量使用总结
2011/03/24 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php无限级分类实现方法分析
2016/10/19 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
python字典按照value排序方法
2020/12/28 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
租车协议书范本
2014/04/22 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
单位授权委托书范本
2014/09/26 职场文书
2015年超市工作总结
2015/04/09 职场文书
纪委立案决定书
2015/06/24 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
Python函数式编程中itertools模块详解
2021/09/15 Python
Python中的 Set 与 dict
2022/03/13 Python
MySQL 条件查询的常用操作
2022/04/28 MySQL