1

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

<script>我很好奇如果在将这些脚本中的一些脚本加载到传统标签中之后使用 Require 加载它们会发生什么。这是我尝试过的:

索引.html

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

初始化.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>

我知道,期望 Require 足够聪明地做我希望它做的事情可能有点遥不可及,但如果它以这种方式工作,对于将 Require 与现有站点集成的开发人员来说真的很方便。这样您就可以在闲暇时将遗留脚本移入 AMD 模块,甚至无需更改您的需求代码。不过,也许我只是在做梦。:)

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

4

1 回答 1

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 加载程序。有关如何执行此操作的背景信息,请参见此处:在设计 JS 库时,我是否应该使其与 RequireJS/AMD 兼容?

由于data-main 脚本是异步加载的,您应该能够假设 jquery 和 requirejs 的脚本将在您的 init.js 之前首先加载,但为了减少混淆,您可以这样做:

<script src="js/lib/require.js"></script>
<script src="js/lib/jquery.js"></script>
<script src="js/init.js"></script>
于 2013-08-21T17:59:53.383 回答