我使用require.js获得以下代码。
utilities.js:
define(["thirdparty-script-A.js"], function(){ ... });
的application.js:
define(["utilities", "order!thirdparty-script-A.js", "order!thirdparty-script-B.js"], function(){ ... });
thirdparty-script-B.js
依赖于thirdparty-script-A.js
,如果thirdparty-script-A.js
尚未加载(执行),则无法正确加载。
总而言之,依赖结构看起来像这样:
utilities +---> thirdparty-script-A.js <---+ thirdparty-script-B.js
^ ^ ^
| | |
| + |
| |
+------------+ application.js +----------------+
看着firebug,我看到获取顺序是:
从使用console.log()进行调试(从理论角度来看),加载(执行)顺序为:
现在问题就出现了。 在大多数情况下,上面的工作在firefox,chrome和IE9中都很好用。但是,有一种情况是thirdparty-script-B.js无法加载,因为thirdparty-script-A.js尚未完成加载。事实上,console.logs显示第三方脚本-B.js执行 FIRST ,然后是第三方-Aj,实用程序,最后是应用程序。到底是怎么回事?到目前为止,我只能在IE9中重现这个问题。
这很奇怪,因为在application.js中,我使用order plugin来保证两个第三方脚本加载的顺序。然而,脚本执行不正常。
经过进一步调查,我注意到只有当thirdparty-script-A.js需要的时间比第三方脚本-Bjs更长时才会出现问题。这让我猜测了这个命令!插件不能与define()一起使用。从理论上讲,即使thirdparty-script-A.js需要20秒才能获取并加载,第三方脚本-B.js应该等待执行。这就是订单!表现,不是吗?
另一个理论是,如果任何文件按顺序它将无法工作!在链中的另一个模块中需要(utilities.js中的thirdparty-script-A.js)。
我确实有解决方法。这就是将apply.js包装在require()中并让它首先加载所有传统脚本。
require(["order!thirdparty-script-A.js", "order!thirdparty-script-B.js", "application"], function(app){
//app.init
}
但是对于60多个脚本应用程序,需求列表会变得冗长而混乱...
任何人都可以启发我为什么定义()和订单!他们的行为方式如何?
非常感谢!
是的,第三方脚本-A和B被缓存。 =)
答案 0 :(得分:0)
诀窍是将所有内容包装在模块中。我通常在依赖于jQuery的第三方插件上进行“重新打包”。这样,您确定在加载插件时加载了jQuery(并且$
存在)。在此方法中,不需要订单插件。
通过“重新打包”,您只需将插件代码包含在define()
调用中,并使用它的依赖关系,然后正常加载。
在申请中:
define(['utilities','scriptA','scriptB'],function(){
//application code
});
实用程序中的:
define(['scriptA'],function(){
//utilities code
});
在scriptB中
define(['scriptA'],function(){
//scriptB code
});
在scriptA 中
define(function(){
//scriptA code
});
所以顺序是:
Loading | Application A
| Utilities, Script B |
V Script A | Execution
\----->----->----->----/
自应用程序依赖它以来,ScriptA 可以加载并执行。但为了安全起见,你应该这样做。这样,您确定正确加载了依赖项。