自定义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 相关文章推荐
struts2 jquery 打造无限层次的树
Oct 23 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
js中for in语句的用法讲解
Apr 24 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
Sep 19 Javascript
Js实现简单的小球运动特效
Feb 18 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
详解JS模块导入导出
Dec 20 Javascript
Node+OCR实现图像文字识别功能
Nov 26 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
JavaScript canvas绘制折线图
Feb 18 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
js运动应用实例解析
2015/12/28 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
Python中实现对list做减法操作介绍
2015/01/09 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
便利店促销方案
2014/02/20 职场文书
创业培训计划书
2014/05/03 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技