2012-05-29 4 views
9

Mit shim von requirejs2, gibt es eine Möglichkeit zu sagen, erfordert, dass ein Modul bereits geladen ist?Requirejs mit Shim

Beispiel:

<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> 

Antwort

23

Nun, wenn Strich bereits und verfügbar geladen ist, brauchen Sie nicht die Shim überhaupt. Backbone lädt glücklich. Wenn nicht, liegt es wahrscheinlich daran, dass der Unterstrich nicht tatsächlich geladen ist.

Es klingt aber falsch, nur teilweise require.js zu verwenden, könnten Sie auch alle AMD-laden. Dazu müssen Sie Ihre Shim wie dies ändern müssen:

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

    underscore: { 
     exports: "_" 
    } 
} 

und natürlich aktualisieren Sie Ihre paths.

1

Ich bin mir nicht sicher, ob Sie den besten Ansatz für Ihren Anwendungsfall finden konnten. Wenn Sie wirklich - aus irgendeinem Grund - Ihre anderen Skripts hinzufügen müssen, ohne RequireJS wie in Ihrem Codebeispiel @ js999 zu verwenden, müssen Sie überprüfen, ob die globale Variable (jQuery, _) dieser Skripts vorhanden ist, und sie dann definieren Module. In Ihrem Codebeispiel würde es in etwa so aussehen:

<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>