2012-05-29 72 views
9

使用shim by requirejs2,有一種方法可以告訴要求模塊已經加載?Requirejs using shim

例子:

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="undescrore.js"></script> 
<script type="text/javascript" src="require.js'"></script> 
<script type="text/javascript"> 
    require.config({ 
     paths: { 
      "backbone": '/vendor/js/backbone-min.js' 
     }, 
     shim: { 
      'backbone': { 
       //These script dependencies should be loaded before loading 
       //backbone.js 
       deps: ['underscore', 'jquery'], // here I would like to load the already loaded library 
      } 
     } 
    }); 
</script> 

回答

23

好吧,如果下劃線已經加載並且可用,你不需要墊片的。骨幹將愉快地加載。如果沒有,可能是因爲下劃線是而不是實際加載。

這聽起來不錯,只是部分使用require.js,你可能還不如AMD加載它們。要做到這一點,你需要改變你的墊片這樣的:

shim: { 
    backbone: { 
     deps: ["underscore", "jquery"], 
     exports: "Backbone" 
    }, 

    underscore: { 
     exports: "_" 
    } 
} 

,當然更新paths

1

我不確定您是否能夠爲您的用例找到最佳方法。 如果您真的 - 由於某種原因 - 需要添加其他腳本而不使用RequireJS,如代碼示例@ js999那麼您需要檢查這些腳本的全局變量(jQuery,_)是否存在,然後將它們定義爲模塊。從你的代碼示例看起來像這樣:

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="undescrore.js"></script> 
<script type="text/javascript" src="require.js'"></script> 
<script type="text/javascript"> 
    // check for jQuery 
    if (window.jQuery) { 
     define('jquery', [], function() { 
      return window.jQuery; 
     }); 
    } 

    // check for underscore 
    if (window._) { 
     define('underscore', [], function() { 
      return window._; 
     }); 
    } 

    require.config({ 
     paths: { 
      // remove the file extension (.js)   
      "backbone": '/vendor/js/backbone-min' 
     }, 
     shim: { 
      'backbone': { 
       deps: ['underscore', 'jquery'] 
      } 
     } 
    }); 
</script>