自定义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 相关文章推荐
window.addeventjs事件驱动函数集合addEvent等
Feb 19 Javascript
javascript TextArea动态显示剩余字符
Oct 22 Javascript
JavaScript 快捷键设置实现代码
Mar 13 Javascript
JavaScript 拾漏补遗
Dec 27 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
Javascript中的异步编程规范Promises/A详细介绍
Jun 06 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
Node.js实用代码段之获取Buffer对象字节长度
Mar 17 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
解决vue中provide inject的响应式监听
Apr 19 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
PHP下判断网址是否有效的代码
2011/10/08 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
微信小程序 首页制作简单实例
2017/04/07 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
Python中os模块功能与用法详解
2020/02/26 Python
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
QA工程师岗位职责
2013/11/20 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
大学生实训报告总结
2014/11/05 职场文书
《我是什么》教学反思
2016/02/16 职场文书
2019秋季运动会口号
2019/06/25 职场文书