Requirejs 具有yepnope的多个条件

Requirejs 具有yepnope的多个条件,requirejs,yepnope,labjs,Requirejs,Yepnope,Labjs,我使用yepnope.js作为加载的资源。我只想在加载了JS模块的所有依赖项后,在该模块中执行代码。我不想加载已经加载的JS依赖项 假设我有依赖项D1.js和D2.js。我试过了 yepnope({ load: ['D1.js', 'D2.js], complete: function() { //execute my code here } }); 这是可行的,但是,每次都会加载资源,即使它们以前已经加载过 如果我做了多个这样的测试: yepnope(

我使用yepnope.js作为加载的资源。我只想在加载了JS模块的所有依赖项后,在该模块中执行代码。我不想加载已经加载的JS依赖项

假设我有依赖项D1.js和D2.js。我试过了

yepnope({
    load: ['D1.js', 'D2.js],
    complete: function() {
        //execute my code here
    }
});
这是可行的,但是,每次都会加载资源,即使它们以前已经加载过

如果我做了多个这样的测试:

yepnope([{
    test: $().d1,
    nope: 'D1.js'
},
{
    test: $().d2,
    nope: 'D2.js'
}]);
现在还不清楚将整个完成的函数放在何处——加载所有资源后运行的函数

是否可以使用yepnope执行此操作,或者是否需要使用其他组件


谢谢。

回调将在执行相应的脚本(而不仅仅是加载)后运行。所有脚本都按顺序运行,因此如果您在最后一个对象上放置
回调
complete
属性,它将最后运行。

假设您需要有条件地加载jquery.js、jquery.jgrowl.js和jquery.powertip.js。 您希望以下代码能够正常工作:

yepnope([{
  test: typeof(window.jQuery) === 'undefined' || 
        jQuery.fn.jquery.match(/^1\.[0-9]+/) < 1.7,
  yep: '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js'
},
{
  test: typeof(window.jQuery) === 'undefined' 
        || typeof(window.jQuery.fn.jGrowl) === 'undefined',
  yep: ['//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.js',
        '//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.css'],
  complete: function() {
    console.log('completed loading jGrowl (should fire first, or not at all)');
  }
},
{
  test: typeof(window.jQuery) === 'undefined' 
        || typeof(window.jQuery.fn.powerTip) === 'undefined',
  yep: ['//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.js', 
        '//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.min.css'],
  complete: function() {
    console.log('completed loading powertip'); 
    jQuery.jGrowl("Growling!");
  }
}
]);
yepnope([{
测试:typeof(window.jQuery)=='undefined'||
jQuery.fn.jQuery.match(/^1\[0-9]+/)<1.7,
是:“//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js”
},
{
测试:typeof(window.jQuery)==“未定义”
||typeof(window.jQuery.fn.jGrowl)==“未定义”,
是:['//cdnjs.cloudflare.com/ajax/libs/jquery jgrowl/1.2.12/jquery.jgrowl.min.js',
“//cdnjs.cloudflare.com/ajax/libs/jquery jgrowl/1.2.12/jquery.jgrowl.css'],
完成:函数(){
日志('已完成加载jGrowl(应首先启动,或根本不启动)';
}
},
{
测试:typeof(window.jQuery)==“未定义”
||typeof(window.jQuery.fn.powerTip)==“未定义”,
是:['//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.js',
“//cdnjs.cloudflare.com/ajax/libs/jquery-powertip/1.1.0/jquery.powertip.min.css'],
完成:函数(){
console.log('completed loading powertip');
jQuery.jGrowl(“咆哮!”);
}
}
]);
但是,如果在jquery.powertip.js已加载但jquery.jgrow.js未加载的页面上运行,这将抛出一个错误,因为会立即触发“complete”回调,而不是在加载完所有文件后

下面的fiddle演示了yepnope 1.5.4中的此错误:

还要注意的是,在yepnope的当前主干(主分支)中,这个bug消失了。 它可能与以下票证有关(从未向后移植到1.5.4):


Alex,我仍然在使用多个条件时遇到问题,其中完整方法“附加”到最后一个条件。如果最后一个条件为TRUE,但“previous”条件为FALSE,则complete方法不会等待,而是在加载“FALSE”条件中的所有脚本之前执行。这是预期的吗?那是虫子吗?谢谢。Alex,你能对我之前关于yepnope的“load”属性的声明发表评论吗:“这是可行的,但是,每次都会加载资源,即使之前已经加载过。”。这真的是一个正确的假设吗?在页面的生命周期内,如果我尝试通过“load”属性加载相同的.JS资源,该文件会被物理下载多次吗?谢谢。如果测试为
false
,则不会加载脚本。这几乎就是yepnope的全部功能;)——至于
load
属性,我们确实进行了一些检查,以避免两次加载脚本,但我不建议构建完全依赖该功能的解决方案,因为您可能会在其他地方迷失方向。