自定义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 相关文章推荐
番茄的表单验证类代码修改版
Jul 18 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
Sep 08 Javascript
js function使用心得
May 10 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
Three.js实现浏览器变动时进行自适应的方法
Sep 26 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
layui radio性别单选框赋值方法
Aug 15 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
vue页面跳转实现页面缓存操作
Jul 22 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
博士208HAF收音机实习报告
2021/03/02 无线电
php GD绘制24小时柱状图
2008/06/28 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
对Python中内置异常层次结构详解
2018/10/18 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Python 字符串池化的前提
2020/07/03 Python
python 实现aes256加密
2020/11/27 Python
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
担保贷款承诺书
2015/04/30 职场文书
给下属加薪申请报告
2015/05/15 职场文书
汉字听写大会观后感
2015/06/12 职场文书