将RequireJS配置为不重新加载页面上已包含的脚本

时间:2013-08-21 17:21:42

标签: javascript requirejs amd

我正在考虑将RequireJS集成到不使用AMD的现有Web应用程序中。我将包含我的脚本的页面已经包含了许多脚本,包括jQuery和一些常见的内部脚本。

我很好奇,如果我将这些脚本加载到传统的<script>标记后加载了一些这些脚本,会发生什么。这是我试过的:

的index.html

<script src="js/lib/jquery.js"></script>
<script src="js/lib/require.js" data-main="js/init.js"></script>

init.js

require.config({
   paths: { 
      jquery: "js/lib/jquery"
});
require(["jquery"], function($) {
   //Do stuff
});

我希望Require能够足够聪明地看到js/lib/jquery.js已经加载到页面上,并将其用作模块,而不是重新加载脚本。然后我检查了页面内容,发现Require实际上重新加载了脚本:

<script type="text/javascript" src="/js/libs/jquery.js"></script>
...
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="jquery" src="/js/libs/jquery.js"></script>

据我所知,这可能是一种预期需要足够聪明以实现我希望的目标,但如果开发人员将需要与现有网站集成,如果它以这种方式工作,那将非常方便。这样您就可以在闲暇时将遗留脚本移动到AMD模块中,而无需更改您的需求代码。也许我只是在做梦。 :)

任何人都有任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

奇怪的是,如果你交换脚本标签的顺序,它应该适用于jQuery:

<script src="js/lib/require.js" data-main="js/init.js"></script>
<script src="js/lib/jquery.js"></script>

jQuery的代码在定义名为“jquery”的模块之前检查AMD加载程序是否存在,因此如果先未加载RequireJS,那么该模块将不会被注册。

除非您修改它们以检查是否存在AMD加载程序,否则您的内部脚本将不会这样。有关如何执行此操作的背景信息,请参阅此处:When designing a JS library should I make it RequireJS/AMD compatible or not?

the data-main script is loaded async开始,您应该能够假设jquery和requirejs的脚本将首先加载到init.js之前,但为了减少它的混乱,您可能会这样做:

<script src="js/lib/require.js"></script>
<script src="js/lib/jquery.js"></script>
<script src="js/init.js"></script>