common_tempaltes
文件不是requirejs文件 - 而是定义全局变量的文件。
common_templates
需要hogan
。他们或多或少同时被要求,但竞争条件正在受到影响。 common_templates
有时会赢,所以代码会因“hogan尚未加载”而失败。
require(['module1', 'hogan', 'common_templates'], function(Module){
Module.do_stuff() // this module also requires hogan and common_templates to be loaded
});
除了嵌套的需求之外,是否有内置的方法告诉需要在完全下载hogan
之前阻止?
嵌套:
require(['hogan'], function(Fn, Ui){
require(['common_templates'], function(){
require(['module1'], function(Module){
Module.do_stuff();
});
});
});
这种方法看起来有点笨拙。是否有内置的方法来解决这些竞争条件?
答案 0 :(得分:4)
如果common_templates不是AMD模块(不包含define([deps])
调用),那么您需要将其配置为垫片:
require.config({
shims: {
common_templates: {
deps: ["hogan"]
}
}
});
现在,require(['module1', 'hogan', 'common_templates'])
和require(['module1', 'common_templates'])
应该有效。
答案 1 :(得分:0)
我有同样的问题。 我需要基本上“阻止”我的程序流,以确保在第二个依赖项列表之前加载了一个初始的依赖项列表,最后是我的主应用程序代码。 这就是我解决的问题它即可。这是我在index.html文件中进行的Require.js调用:
np.array([[set(bi).issubset(set(ai))] for ai, bi in zip(map(tuple, a), map(tuple, b))])
<script src="/js/lib/require_2.1.22.js"></script>
<script>
//debugger;
//Load common code that includes config, then load the app
//logic for this page. Do the requirejs calls here instead of
//a separate file so after a build there are only 2 HTTP
//requests instead of three.
requirejs(['/js/common_libs.js'], function (common) {
//debugger;
//Ensure the the AdminLTE code and its dependencies get loaded prior to loading the Backbone App.
requirejs(['/js/lib/adminlte.js'], function (common) {
//debugger;
//The main file for the Backbone.js application.
requirejs(['/js/app/main_app.js']);
});
});
</script>
文件包含common_libs.js
内容。 requirejs.config({shim:...})
库执行它自己的依赖项检查,如果它没有检测到它的依赖项,它会在控制台上抱怨。我的问题是它与其依赖项异步加载并导致竞争条件。
我能够将adminlte.js
中的现有代码包装成这样:
adminlte.js
这允许我单独加载这个库及其依赖项。 //My experiments with Require.js to prevent race conditions.
define([
'jQuery-2.1.4.min',
'bootstrap.3.3.6',
'jquery.slimscroll.min'
], function($, Bootstrap, SlimScroll ) {
//Existing code goes here
...
//I knew to return this value by looking at the AdminLTE code. Your mileage may vary.
return $.AdminLTE;
});
中的代码仅在加载依赖项后执行。然后,只有在完成后,才会加载adminlte.js
及其依赖项。
以这种方式构建代码允许您批量显式加载依赖项。
为清晰起见进行编辑:
依赖项分阶段加载。澄清上面的例子:
在第一阶段加载jQuery,Boostrap和SlimScroll库,然后执行main_app.js
文件。
在第二阶段,加载所有其他依赖项,然后执行adminlte.js
文件。 main_app.js
将有自己定义的([],...)函数,该函数调出需要加载的其余依赖项。
这比为每个依赖项编写嵌套的require()调用要高效得多。而且,就我在requirejs.org网站上所知,这是加载串行依赖的“正确”方法。
编码更新:
我还必须将main_app.js
库中的代码包装在define()语句中,以便显式调用此库依赖于jQuery。否则它会在竞争条件下设置另一个机会。
答案 2 :(得分:-1)
这没有意义,你说“common_templates需要hogan”,但如果common_templates
需要hogan
,那么hogan
代码启动后就会加载common_templates
。< / p>
确保common_templates.js
的定义如下:
define(['hogan'], function(){
//common_templates suff here
});