自定义require函数让浏览器按需加载Js文件


Posted in Javascript onNovember 24, 2016

前言

本文介绍的是自定义require函数让浏览器实现按需加载Js文件,那到底要怎么自己写一个按需加载的库呢

为了实现按需加载:

//这是我们要实现的功能,require('str.js')时加载str.js文件,并创建一个叫str对象,等加载完毕之后执行str对象的ready方法里的函数。

var str = require('str.js');

str.ready(show);

//要执行的函数

function show(res){

 console.log(res);

}

//str.js 文件,提供"我是str"字符串

//require.js 这个是我们要写的库

实现思路

1、如何加载str.js文件呢?

     A:我们可以插入一个<script src="str.js"></script> ,这样不仅加载了str.js,里面的代码还可以被浏览器自动运行呢。

2、如何判断str.js文件已经加载完毕?

     A:可以在str.js文件里执行一个函数,通知大家,我已经加载完了。

3、require('str.js')返回一个对象,这个对象要怎么和str.js相关联呢?

     A:我们可以创建一个叫JS['str.js']的对象,使str指向这个对象就行了。

4、我不想把代码都写进一个ready里面,我要写在很多个ready里面,加载完之后它们都能执行吗?

     A:不管多少个ready,没加载完的时候,都会丢进一个队列里面先保存着,所以我们需要一个队列。

5、加载完的那个时刻触发ready,那加载完之后我再写的ready函数,就不执行吗?

     A:也会执行,所以,在加载完的那个时刻,我们将重写ready函数。

6、这么多东西20行代码能完成吗?

     A:....

执行方案

根据上诉思路,写了一个require.js文件:

function require(path){

 //比如我们require('js/str.js') , 我们需要获取'str.js'这个文件名
 var filename = path.split('/');
 filename = filename[filename.length-1];

 JS[filename]={
  fn:[/*这个就是(4)中提到的那个队列*/],

  //这是(2)中提到的方法,str.js文件里面执行这个方法就代表它加载完了
  ready:function(){
  
   JS[filename].fn.forEach(function(fn){
    //JS['str.js'].export就是str.js要提供的东西:'我是str'
    fn(JS[filename].export);
   });

   //这是(5)中提到的,ready函数的重写
   JS[filename].rt.ready = function(fn){
    fn(JS[filename].export);
   };
  },
  rt:{
   ready:function(fn){JS[filename].fn.push(fn)}//这个就是str对象的ready函数
  }
 };

 //这是(1)中提到的插入script标签
 var script = document.createElement('script');
 script.src = path;
 document.head.appendChild(script);

 //这是(3)中要返回的对象
 return JS[filename].rt;
}

接下来,就差str.js的写法了:

/*

 这里你想写什么代码都行,推荐写在闭包里,以免污染全局变量

*/
JS['str.js'].export = '我是str';//这个是供大家使用的参数
JS['str.js'].ready();//执行这个函数,通知大家,str.js加载完毕了

确认一下执行结果

<!DOCTYPE html>
<script src="require.js"></script>
<script>
 var str = require('str/str.js');
 str.ready(show);

 setTimeout(function(){
  str.ready(show);
 },3000);

 //要执行的函数
 function show(res){
  console.log(res);
 }
</script>

ok,一切正常。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
关于JavaScript中的关联数组分析
Apr 09 Javascript
javascript阻止scroll事件多次执行的思路及实现
Nov 08 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
Nov 23 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
JS获取当前时间戳方法解析
Aug 29 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
Nov 24 #Javascript
完美解决IE不支持Data.parse()的问题
Nov 24 #Javascript
JS 终止执行的实现方法
Nov 24 #Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 #Javascript
jquery网页日历显示控件calendar3.1使用详解
Nov 24 #Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 #Javascript
原生js实现addclass,removeclass,toggleclasss实例
Nov 24 #Javascript
You might like
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
newxtree.js代码
2007/03/13 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
带你了解python装饰器
2017/06/15 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python 读取.nii格式图像实例
2020/07/01 Python
python 制作本地应用搜索工具
2021/02/27 Python
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
另类冲刺标语
2014/06/24 职场文书
委托书的格式
2014/08/01 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
三八妇女节寄语
2015/02/27 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Redis高并发缓存架构性能优化
2022/05/15 Redis
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python