一个极为简单的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 相关文章推荐
一些mootools的学习资源
Feb 07 Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 Javascript
基于jquery的图片幻灯展示源码
Jul 15 Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
jquery判断复选框是否选中进行答题提示特效
Dec 10 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
seajs和requirejs模块化简单案例分析
Aug 26 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
浅析vue-router原理
2018/10/19 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
python实现Decorator模式实例代码
2018/02/09 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
Python中pass的作用与使用教程
2020/11/13 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
前台接待岗位职责
2013/12/03 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
女生节标语
2014/06/26 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
自我检讨书怎么写
2015/05/07 职场文书
银行服务理念口号
2015/12/25 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis