`

异步加载js文件: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 事件中指定的回调函数对它无效。

  外部函数库 LABjs 和 RequireJS,可以帮助我们更有效地管理 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 插件

分享到:
评论

相关推荐

    LABjs、RequireJS、SeaJS的区别

    一、LABjs 的核心是 LAB(Loading and Blocking):Loading 指异步...模块加载器也可降级为文件加载器用,因此使用 RequireJS 和 SeaJS,也可以达成 LABjs 的性能优化目的。 三、RequireJS 和 SeaJS 都是很不错的模块加

    使用jQuery异步加载 JavaScript脚本解决方案

    目前流行的几个加载器,像 curljs、LABjs 和 RequireJS 使用都很广泛。他们功能强大的,但有些情况下可以有更简单的方案。 如果你正在使用 jQuery,有一个内置的方法可以用来加载脚本。如果你想延迟加载插件或任何...

    详谈LABJS按需动态加载js文件

    LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加载不需用到的 JavaScript 文件,可以实现动态并行加载脚本文件,以及管理加载脚本文件的执行顺序...

    LABjs无阻塞脚本加载工具

    开源无阻塞脚本加载工具LABjs。该工具提供了对加载过程更精细的控制,并试图同时下载尽可能多的代码。

    LABjs-master--js有序加载.rar

    LAB.js解决ajax异步--js加载顺序不能自定义的问题,有实例。

    Web前端模块化框架BrowserRequire.zip

    BrowserRequire 是给浏览器使用的模块化框架,并且提供灵活加载js文件(非模块化文件)的功能。 中文使用指南:点击进入! 目录介绍 dist————BrowserRequire框架压缩文件 example————示范案例 ...

    自定义require函数让浏览器按需加载Js文件

    可能很多人看到这个题目就会想到LABjs、RequireJS、SeaJS... 这些库,但无奈小编没用过这些库,什么 AMD 、CMD 哪来那么多术语... 前端的库太多了,要看各种乱七八糟的文档,好难啊,还不如自己写一个库呢。于是就有...

    LABjs-2.0.3

    LABjs-2.0.3

    前端项目-labjs.zip

    前端项目-labjs,labjs(加载和阻塞javascript)是一个由getify解决方案支持的开源(mit许可证)项目。LabJS的核心目的是成为一个通用的、按需的JavaScript加载程序,能够随时从任何位置将任何javascript资源加载到...

    in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案

    但是本文将会向大家介绍一个新的开源的轻量级“多线程”异步模块加载器In.js,In的开发借鉴了Do的一些思路和使用习惯,在此期间感谢@kejun同我的耐心交流,In.js压缩后只有4.77k,不仅小巧而且十分好用。 优点: 按...

    labjs-downloader:一个在Rs VM中打包Ring VM的存储库,用于运行愚蠢的小Labjs脚本来解压缩SQLite实验数据

    Lab.js sqlite解压缩奇点R图像示例 奇点图像定义,从派生 如果这很安静,并且除非有问题,否则不要执行STDOUT / STDERR,那就太好了。 关于 r.def是用于生成图像的奇点定义。 见run_script.sh对于如何启动一个实例...

    lab.js-2.0.3

    lab.js它能够动态并行加载脚本文件 以及 管理加载脚本文件的执行顺序

    patchjs:Patch.js是用于移动Web的增量(字符级别)脚本加载器

    网站我们新的GitHub存储库关键的未来简单易用的API,例如Labjs。 支持localStorage / Web SQL数据库/ IndexedDB。 通过nginx进行实时差异计算。 通过webpack构建差异计算。装载机参考&lt; script src =" ./patchjs-...

    JavaScript将相对地址转换为绝对地址示例代码

    在看LABjs源代码时,发现里面有个将相对地址转为绝对地址的函数,将其拿出纪录如下: 代码如下: function canonical_uri(src, base_path) { var root_page = /^[^?#]*\//.exec&#40;location.href&#41;[0], root_...

Global site tag (gtag.js) - Google Analytics