Javascript文件加载:LABjs和RequireJS

传统上,加载Javascript文件都是使用<script>标签。

就像下面这样:

  <script type="text/javascript" src="example.js"></script>

<script>标签很方便,只要加入网页,浏览器就会读取并运行。但是,它存在一些严重的缺陷。

(1)严格的读取顺序。由于浏览器按照<script>在网页中出现的顺序,读取Javascript文件,然后立即运行,导致在多个文件互相依赖的情况下,依赖性最小的文件必须放在最前面,依赖性最大的文件必须放在最后面,否则代码会报错。

(2)性能问题。浏览器采用"同步模式"加载<script>标签,也就是说,页面会"堵塞"(blocking),等待javascript文件加载完成,然后再运行后面的HTML代码。当存在多个<script>标签时,浏览器无法同时读取,必须读取完一个再去读取另一个,造成读取时间大大延长,页面响应缓慢。

为了解决这些问题,可以使用DOM方法,动态加载Javascript文件。

  function loadScript(url){     var script = document.createElement("script");     script.type = "text/javascript";     script.src = url;     document.body.appendChild(script);   }

这样做的原理是,浏览器即时创造出一个<script>标签,然后"异步"读取Javascript文件。这样不会造成页面堵塞,但会造成另外一个问题:这样加载的Javascript文件,不在原始的DOM结构之中,因此在DOM-ready(DOMContentLoaded)事件和window.onload事件中指定的回调函数对它无效。

外部函数库LABjsRequireJS,可以帮助我们更有效地管理Javascript加载。

下面根据ScriptJunkie的文章,举一个最简单的例子,来说明这两个函数库的基本用法。更高级的用法,请参阅它们的文档。

  <script src="script1.js"></script>   <script src="script2-a.js"></script>   <script src="script2-b.js"></script>   <script type="text/javascript">     initScript1();     initScript2();   </script>   <script src="script3.js"></script>   <script type="text/javascript">     initScript3();   </script>

上面这段代码,将依次加载4个javascript文件:script1.js、script2-a.js、script2-b.js和script3.js。在加载完前三个文件后,运行两个函数initScript1()和initScript2();加载完第四个文件后,再运行函数initScript3()。

下面,用LABjs对其进行改写:

  <script src="LAB.js"></script>   <script type="text/javascript">     $LAB      .script("script1.js").wait()      .script("script2-a.js")      .script("script2-b.js")      .wait(function(){        initScript1();        initScript2();      })      .script("script3.js")      .wait(function(){        initScript3();      });   </script>

首先,$LAB对象替代了<script>标签,然后.script()方法表示加载Javascript文件,不带参数的.wait()方法表示立即运行刚才加载的Javascript文件,带参数的.wait()方法也是立即运行刚才加载的Javascript文件,但是还运行参数中指定的函数。

这里需要注意的是,可以同时运行多条$LAB链,但是它们之间是完全独立的,不存在次序关系。如果你要确保一个Javascript文件在另一个文件之后运行,你只能把它们写在同一个链操作之中。只有当某些脚本是完全无关的时候,你才应该考虑把它们分成不同的$LAB链,表示它们之间不存在相关关系。

接下来是requireJS的改写:

  <script src="require.js"></script>   <script type="text/javascript">     require([       "script1.js",       "script2-a.js",       "script2-b.js",       "script3.js"      ],      function(){       initScript1();       initScript2();       initScript3();      }     );   </script>

require()接受两个参数,第一个数组表示所要加载的Javascript文件,第二个是加载完成后所要运行的回调函数。原生的require()不支持按次序加载,所以四个Javascript文件到底先加载哪个,无法事前知道,require()只保证这四个文件全部加载完成之后,才会运行所指定的回调函数。

如果按次序加载对你很重要,你可以使用官方提供的order插件

(完)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

解决安卓微信浏览器中location.reload 或者 location.href失效的问题

在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会  存在问题,但早上测试的同学会提出了一个bug:...

6677
来自专栏前端大白专栏

angular2中在使用路由懒加载时候出现的错误

1634
来自专栏从零开始学 Web 前端

从零开始学 Web 之 移动Web(八)Less

LESS 是一种动态的样式表语言,通过简洁明了的语法定义,使编写 CSS 的工作变得非常简单,本质上,LESS 包含一套自定义的语法及一个解析器。

793
来自专栏编程直播室

html的base标签为什么不起作用

1592
来自专栏守望轩

Visual Studio 2008 每日提示(二十六)

#251、在文件中保存扩展名的映射 原文链接:You can save your file extension mappings to a file 操作步骤...

3534
来自专栏Ryan Miao

Hello ReactJS

前言 React学习前先搭好环境,官网的例子看着比较分散。结合webpack就可以体验完整的es6开发流程了。 源码:https://github.com/R...

2517
来自专栏web

webstorm常用功能快捷方式

1773
来自专栏Linux驱动

12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示

2197
来自专栏向治洪

关于React Native 报Export declarations are not supported by current JavaScript version错误的解决问题

设置.js文件默认以jsx的语法打开 在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示: ? 当然我们点击转换...

2476
来自专栏BY的专栏

使用 .gitignore 忽略 git 仓库中的文件

2845

扫码关注云+社区