require.js命令传统文件的插件问题

时间:2012-05-11 03:41:26

标签: javascript internet-explorer-9 requirejs

我使用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,我看到获取顺序是:

  1. 应用
  2. 第三方脚本-A.js
  3. 应用
  4. 第三方脚本-B.js
  5. 从使用console.log()进行调试(从理论角度来看),加载(执行)顺序为:

    1. 第三方脚本-A.js
    2. 应用
    3. 第三方脚本-B.js
    4. 应用
    5. 现在问题就出现了。 在大多数情况下,上面的工作在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被缓存。 =)

1 个答案:

答案 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 可以加载并执行。但为了安全起见,你应该这样做。这样,您确定正确加载了依赖项。