自定义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----文件操作
Jan 18 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
Nov 24 Javascript
JS读取cookies信息(记录用户名)
Jan 10 Javascript
js面向对象 多种创建对象方法小结
May 21 Javascript
Javascript中的五种数据类型详解
Dec 26 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
JavaScript中定义对象原型的两种使用方法
Dec 15 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 Javascript
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
js实现简单的日历显示效果函数示例
Nov 25 Javascript
Json实现传值到后台代码实例
Jun 30 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
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
Python中的闭包总结
2014/09/18 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
Django实现跨域请求过程详解
2019/07/25 Python
Python中常用的os操作汇总
2020/11/05 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
开学季活动策划方案
2014/02/28 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
霸气队列口号
2014/06/18 职场文书
作风大整顿心得体会
2014/09/10 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
庆七一活动简报
2015/07/20 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server