就像下面这样:
<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插件。
转自:http://www.ruanyifeng.com/blog/2011/10/javascript_loading.html
相关推荐
主要介绍了LABjs、RequireJS、SeaJS的区别、JS文件加载器、JS块加载器等知识,需要的朋友可以参考下
为了解决这个问题,LABjs应运而生,它提供了一种高效且灵活的方式来异步加载和执行JavaScript资源,从而显著提升网页性能。 LABjs的核心特性包括: 1. **无阻塞加载**:LABjs允许在不阻塞页面渲染的情况下加载脚本...
6. **压缩版本**: "LAB.min.js" 是LABjs的最小化版本,通过删除注释和不必要的空格进行了压缩,减小了文件大小,有利于提高页面加载速度。 7. **源代码版本**: "LAB.src.js" 提供了LABjs的原始源代码,对于需要...
它旨在解决在网页开发中遇到的一个常见问题:JavaScript文件的异步加载顺序无法自定义,这可能导致依赖关系混乱,影响页面的正常运行。LAB.js通过智能管理和控制脚本加载顺序,确保了即便在异步加载的情况下,也能...
目前流行的几个加载器,像 curljs、LABjs 和 RequireJS 使用都很广泛。他们功能强大的,但有些情况下可以有更简单的方案。 如果你正在使用 jQuery,有一个内置的方法可以用来加载脚本。如果你想延迟加载插件或任何...
LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加载不需用到的 JavaScript 文件,可以实现动态并行加载脚本文件,以及管理加载脚本文件的执行顺序...
JavaScript在浏览器中的性能优化是网页开发中的重要环节,因为JavaScript的加载和执行直接影响到页面的渲染速度和用户体验。本文主要探讨了JavaScript加载顺序与执行原理,以及如何通过优化策略提升性能。 首先,当...
有一些现成的JavaScript加载库,如RequireJS、LABjs等,它们可以帮助开发者更加方便地管理脚本文件的加载顺序和依赖关系。这些加载器通常支持异步和延迟加载等功能,并且可以优化文件的合并和压缩。 6. 预加载...
和requirejs一样,实用require指令导入模块或文件,但是相关参数和使用方法不一样; require指令是确保文件只会载入一次; 添加多个模块和响应 //BrowserRequire require('js/moduleA','js/moduleB')....
前端项目-labjs,labjs(加载和阻塞javascript)是一个由getify解决方案支持的开源(mit许可证)项目。LabJS的核心目的是成为一个通用的、按需的JavaScript加载程序,能够随时从任何位置将任何javascript资源加载到...
通过这种方式,我们可以实现一个基本的按需加载功能,尽管它可能没有像 LABjs、RequireJS 或 SeaJS 这样的成熟库那么强大和灵活,但对于理解模块化加载的基本原理和实践,这是一个很好的起点。当然,实际项目中,...
**基本原理**:通常情况下,浏览器会按照HTML文档中的顺序加载和解析内容。当遇到`<script>`标签时,浏览器会暂停HTML的解析过程,先去下载并执行脚本文件,这就导致了所谓的“阻塞”。为了避免这种现象,最简单有效...
In.js是一款轻量级的模块加载框架,支持异步加载和模块间依赖管理。它通过`In.add`方法添加模块定义,其中可以指定模块路径、类型(如JS或CSS)、字符集以及依赖的其他模块。`In.ready`方法用于指定一组模块加载完成...
由于JavaScript的加载和执行可能会阻塞页面渲染,因此开发者需要采取特定的策略来优化性能。 首先,我们来看静态加载。在早期的网页开发中,JavaScript文件通常会放在HTML文档的部分,这样做虽然可以保证文档按照...
国外的像基于jQuery的RequireJs,YUI Loader,LabJs,RunJs,国内也有淘宝的SeaJs,豆瓣的DoJs等,这些都是一些十分优秀的模块加载器。但是本文将会向大家介绍一个新的开源的轻量级“多线程”异步模块加载器In.js,...
这些库支持按需加载和依赖管理,它们可以简化动态加载资源的过程。 例如,RequireJS通过定义模块之间的依赖关系来按需加载脚本,使用它来动态加载jQuery库的代码可能如下: ```javascript require(['***'], ...