我正在考虑将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模块中,而无需更改您的需求代码。也许我只是在做梦。 :)
任何人都有任何想法如何做到这一点?
答案 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>