自定义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 相关文章推荐
ext监听事件方法[初级篇]
Apr 27 Javascript
js 刷新页面的代码小结 推荐
Apr 02 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
js调用activeX获取u盘序列号的代码
Nov 21 Javascript
jquery map方法使用示例
Apr 23 Javascript
node.js中的http.response.addTrailers方法使用说明
Dec 14 Javascript
JS实现简单的键盘打字的效果
Apr 24 Javascript
基于axios封装fetch方法及调用实例
Feb 05 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
Nov 16 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
Array.filter中如何正确使用Async
Nov 04 Javascript
Vue h函数的使用详解
Feb 18 Vue.js
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
yum命令安装php7和相关扩展
2016/07/04 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 空位补零实现代码
2010/02/26 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
react redux入门示例
2018/04/19 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
Python list操作用法总结
2015/11/10 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Python 实现进度条的六种方式
2021/01/06 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
标准自荐信范文
2014/01/29 职场文书
小学校园活动策划
2014/01/30 职场文书
工程技术员岗位职责
2014/03/02 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
Python基础之元类详解
2021/04/29 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis