一个极为简单的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 相关文章推荐
基于JQuery实现的类似购物商城的购物车
Dec 06 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
Jun 03 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
浅谈Vue.js
Mar 02 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
通过js给网页加上水印背景实例
Jun 17 Javascript
js实现前端界面导航栏下拉列表
Aug 27 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出现web系统多域名登录失败的解决方法
2014/09/30 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
2020/01/02 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python Paramiko模块的安装与使用详解
2016/11/18 Python
Python开发的HTTP库requests详解
2017/08/29 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
Python 没有main函数的原因
2020/07/10 Python
详解Python IO编程
2020/07/24 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
西式婚礼证婚词
2014/01/12 职场文书
指导教师推荐意见
2015/06/05 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
Python自动化实战之接口请求的实现
2022/05/30 Python