自定义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 相关文章推荐
select标记美化--JS式插件、后期加载
Apr 01 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
一波JavaScript日期判断脚本分享
Mar 06 Javascript
在Html中使用Requirejs进行模块化开发实例详解
Apr 15 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
JavaScript计算器网页版实现代码分享
Jul 15 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
Aug 08 Javascript
通过AngularJS实现图片上传及缩略图展示示例
Jan 03 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
vue自定义一个v-model的实现代码
Jun 21 Javascript
js实现动态增加文件域表单功能
Oct 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python实现ID3决策树算法
2018/08/29 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
python 实现兔子生兔子示例
2019/11/21 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
新教师工作感言
2014/02/16 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python