自定义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 Demo模态窗口
Dec 06 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
get(0).tagName获得作用标签示例代码
Oct 08 Javascript
javascript实现淘宝幻灯片广告展示效果
Apr 27 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
vue-cli3.0配置及使用注意事项详解
Sep 05 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
Vue动态路由缓存不相互影响的解决办法
Feb 19 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
vue中watch和computed的区别与使用方法
Aug 23 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
PHP中for循环语句的几种变型
2006/11/26 PHP
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JavaScript延迟加载
2021/03/09 Javascript
JS Timing
2007/04/21 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
Vue-component全局注册实例
2018/09/06 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
列举Python中吸引人的一些特性
2015/04/09 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python Process多进程实现过程
2019/10/22 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
商务助理岗位职责
2013/11/13 职场文书
班主任班级寄语大全
2014/04/04 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
群众路线个人整改方案
2014/10/25 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书