唉?这种文章你也点进来看,你不知道有 LABjs、RequireJS、SeaJS... 这些库吗?

反正我是没用过这些库,什么 AMD 、CMD 哪来那么多术语... 前端的库太多了,要看各种乱七八糟的文档,看文档就想睡觉,就像学一门新语言一样,好烦啊,还不如自己写一个库呢。

剧透一下,实现这个功能只需要20行代码。

好了,要怎么自己写一个按需加载的库呢,为了实现按需加载:

//这是我们要实现的功能,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,一切正常。

自制 require 函数:让浏览器轻松实现 js 文件按需加载相关推荐

  1. html动态加载js方法,原生JS实现动态加载js文件并在加载成功后执行回调函数的方法...

    本文实例讲述了原生JS实现动态加载js文件并在加载成功后执行回调函数的方法.分享给大家供大家参考,具体如下: 有的时候需要动态加载一个javascript文件,并且在加载成功后执行回调函数(例如文件中 ...

  2. js资源按需加载和预加载

    . 很多同志可能忘记怎么写按需加载,一篇文章让你读懂. 1 这里资源指cssjs文件img图片 按需加载即加载现在需要使用的 预加载指在空闲的时间里加载其他的资源 <img src=" ...

  3. webpack中利用【require.ensure()】和【import()】实现按需加载

    1.require.ensure()themes为变量,设计多个文件名根据themes动态变化可以映入不同less文件如下require.ensure([], function (require) { ...

  4. 小程序登录问题--登录函数getUserInfo()写在app.js中,首次加载无法获取后台处理过的用户的信息,刷新一次后就可以获取的解决

    遇到这个问题,是因为自己需要写个登录的功能.需要用户自己点击登录后,才登录. 登录的功能函数写在app.js中,现在需要在user.js中使用这个全局的函数,来登录并获取用户信息.但是出现的问题就是, ...

  5. js加载html的head偶尔失效,外部 js 文件偶尔会加载失败

    最近有一个很奇怪的问题一直困扰着我: html 页面中,head部分引入了几个外部js文件. 比如: // 目前页面结构就是这样,其他的代码都和此异常无关,就不多贴了. // 这里就直接报错,显示 V ...

  6. js文件代码未加载或者没有js效果

    问题:在页面中js文件中的代码未加载或者没有任何效果. 原因: 成功引用了js文件,但无效果或者提示未加载该文档中的代码. 可能页面引用js文件的路径存在问题 解决: 重新检查你引用的js文件的路径是 ...

  7. PDF.js 实现pdf分页加载的前端优化(实现按需加载)-前端的demo也已经上传

    描述 pdf.js实现了分片加载,但是在首次加载时自动加载了全部的pdf分片,导致打开了几个超过1g的pdf时,浏览器报出内存不足的提示 解决方案 实现pdf.js的按需加载,只需要修改属性disab ...

  8. JS实现图片懒加载的几种简单方式,图片懒加载

    记得以前手机端有个业务时将用户上传的的图片在用户往上滑动手机的时候呈现,由于刚开始用户数量少就没留意,直接将后台的数据拉过来渲染,当时后台也没有分页,可是后来参与用户多了起来,跳转到这个页面就渲染个几 ...

  9. ensure函数_webpack中利用require.ensure()实现按需加载

    webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...

最新文章

  1. ext的ajax写法,ExtJs的Ajax示例
  2. 堆栈溢出从入门到提高
  3. WPF 关于鼠标事件和坐标
  4. 监视和排错客户端性能和连接性
  5. ArcMAP获取要素的外包多边形
  6. java获取音频_java获取音频文件播放时长
  7. STL : List使用时应注意的问题
  8. 数据结构与算法之美学习笔记:哈希算法-哈希算法在分布式系统中有哪些应用(第22讲)...
  9. js学习(六)- js对象创建
  10. 排序小记【1】基本排序算法
  11. windows2003 IIS6 部署MVC4程序等等
  12. jboss mysql amp amp_怎么在JBoss中配置MySQL数据库连接池让Mysql支持中文
  13. 手撕源码之SpringApplication.java【Spring Boot 2.4.4】
  14. spiders:你好污啊
  15. 用ruby写了一个简单的Gmail登陆和获取未读邮件(http协议)
  16. centos审计服务audit导致使centos服务器不能登录,部署的应用不能运行和访问。
  17. 苹果app退款_苹果app退款流程:App Store应用如何申请iOS退款教程
  18. MP | 东农吴凤芝/南农韦中-根系分泌物介导的植物种间互作塑造了根际微生物组抑病力...
  19. win10 如何快速显示桌面
  20. echarts 盒须图配置

热门文章

  1. string list 查找_手撕java集合源码——List篇
  2. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南
  3. linux怎么卸载evolution,linux - 如何在Ubuntu的系统托盘中最小化Evolution? - Ubuntu问答...
  4. 通过channel进行goroutine间的通信
  5. 转换json_使用Java将JSON转换为POJO
  6. mysql索引超出范围 index_输入查询条件会报参数索引超出范围的错误
  7. flex布局实现叠在另一个div之上_CSS3 flex弹性伸缩布局[上]
  8. linux启动日志服务命令,linux命令:syslog日志服务-系统缩减之增加日志服务功能...
  9. java动态工程_eclipse 创建maven 项目 动态web工程完整示例
  10. cocos 时间函数需要什么引用_与时间赛跑:微盟的数据恢复为什么需要这么长时间...