自定义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 相关文章推荐
jQuery使用手册之三 CSS操作
Mar 24 Javascript
使用C++为node.js写扩展模块
Apr 22 Javascript
JavaScript的RequireJS库入门指南
Jul 01 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
Nov 01 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
Angular2 多级注入器详解及实例
Oct 30 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
cdn模式下vue的基本用法详解
Oct 07 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
Nov 27 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
VUE动态生成word的实现
Jul 26 Javascript
JavaScript中的几种继承方法示例
Dec 06 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
jquery对表单操作2
2011/04/06 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
JavaScript中关于base64的一些事
2019/05/06 Javascript
python字典多条件排序方法实例
2014/06/30 Python
深入解析Python中的线程同步方法
2016/06/14 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
python对Excel的读取的示例代码
2020/02/14 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
计算机专业应届毕业生自荐信
2013/09/26 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
审计专业自荐信范文
2014/04/21 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
给领导敬酒词
2015/08/12 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
vue判断按钮是否可以点击
2022/04/09 Vue.js