自定义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 相关文章推荐
html超链接打开窗口大小的方法
Mar 05 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
Jan 06 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
Jul 21 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
JavaScript中各数制转换全面总结
Aug 21 Javascript
Javascript实现秒表倒计时功能
Nov 17 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
Sep 09 Javascript
vuex实现数据状态持久化
Nov 11 Javascript
js通过canvas生成图片缩略图
Oct 02 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
php 动态添加记录
2009/03/10 PHP
PHP 一个随机字符串生成代码
2010/05/26 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
JQuery 入门实例1
2009/06/25 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
浅谈React碰到v-if
2018/11/04 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
Python中分数的相关使用教程
2015/03/30 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
英语演讲稿范文
2014/01/03 职场文书
小摄影师教学反思
2014/04/27 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
刑事上诉状范文
2015/05/22 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL