自定义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 事件系统
Jul 22 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
Jun 26 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
Jul 10 Javascript
浅析Vue 生命周期
Jun 21 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
Jul 10 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 Javascript
vscode中使用npm安装babel的方法
Aug 02 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
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
php+highchats生成动态统计图
2014/05/21 PHP
php使用session二维数组实例
2014/11/06 PHP
简单谈谈php中的unicode和utf8编码
2015/06/10 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python while 循环使用的简单实例
2016/06/08 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
通过cmd进入python的实例操作
2019/06/26 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
护理专业自荐书
2014/06/04 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2014年消防工作总结
2014/11/21 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
人工作失职检讨书
2015/05/05 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS