一个极为简单的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 相关文章推荐
isArray()函数(JavaScript中对象类型判断的几种方法)
Nov 26 Javascript
javascript 清空form表单中某种元素的值
Dec 26 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
JS forEach跳出循环2种实现方法
Jun 24 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 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
Syphon 使用方法
2021/03/03 冲泡冲煮
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
浅析is_writable的php实现
2013/06/18 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
HTML5实现签到 功能
2018/10/09 HTML / CSS
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
实验心得体会
2014/09/05 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python