2013-02-13 11 views
27

Voglio essere in grado di definire opzionalmente un modulo e quindi usarlo o meno nel mio codice. La situazione particolare che sto considerando è il caricamento di moduli mock/stub nell'ambiente di debug/test ma non quando vado in diretta. Ecco l'esempio:Con requirejs è possibile verificare se un modulo è definito senza tentare di caricarlo?

nel file HTML i file js sarebbero opzionalmente caricati (pseudo codice):

//index.cshtml 
... 
<script src="/Scripts/lib/require.js"></script> 
<script src="/Scripts/app/service_user.js"></script> 
<script src="/Scripts/app/real_service.js"></script> 
#if DEBUG 
<script src="/Scripts/app/mock_service.js"></script> 
#endif 

In quanto sopra sia real_service e mock_service devono essere caricati nella versione di debug.

Ogni modulo sarebbe definito utilizzando requirejs, ad esempio:

//mock_service.js 
define('mock_service', [], 
    function() { 
     ... 
    }); 

//real_service.js 
define('real_service', [], 
    function() { 
     ... 
    }); 

Poi, quando si utilizza il servizio mi piacerebbe verificare se il mock_service è stata definita:

//service_user.js 
define(['require', 'real_service'], 
    function (require, real_service) { 
     if (require.isDefined('mock_service')) { // 'isDefined' is what I wish was available 
      var mock = require('mock_service'); 
      mock.init(real_service); 
     } 

     ... 
    }); 

Quindi il mio nozionale ' La funzione isDefined dovrebbe semplicemente verificare la presenza di un modulo con il nome (o i nomi) dato. Quindi nel mio codice, se è definito, posso richiederlo e usarlo. Se no, allora va bene anche questo.

La cosa importante per me è che non viene effettuato alcun tentativo di caricare il modulo opzionale. Potrei provare/prendere in giro l'istruzione require ma ciò provocherebbe un tentativo di caricarlo dal server e non lo voglio.

Un'altra opzione sarebbe quella di definire uno stub che carico sempre e quindi c'è sempre una finta da richiedere, che posso quindi interrogare sul fatto che sia quella vera o meno, ma che sembra troppo dispendiosa.

C'è qualcuno là fuori che è profondamente dentro require.js che ha scoperto che hanno bisogno di questa funzionalità e hanno elaborato una strategia per l'implementazione?

Grazie in anticipo, Rob

risposta

41

Anche se la risposta di David Wolf era vicina al marchio, non rispondeva pienamente alle mie esigenze.

Il problema è che richiedono i requisiti in modo asincrono in modo tale che nell'esempio che ho dato e utilizzando il suggerimento di David restituirà false perché sebbene sia stato specificato non è stato ancora risolto.

Durante l'indagine ho trovato un'altra funzione specified. Nell'esempio require.specified('mock_service') verrà restituito true ma successivamente si tenta di ottenere un riferimento utilizzando require('mock_service') perché non è stato ancora risolto.

Questo, per fortuna, è facilmente risolto utilizzando la versione di callback del require. Mettere tutto insieme abbiamo:

if (require.specified('mock_service')) { 
    require([ 'mock_service' ], function (mock) { 
     mock.init(real_service); 
    }); 
} 

@ David Wolf - grazie, non sarebbe arrivati ​​senza il vostro aiuto.

56

Stavo cercando per questo me stesso, la richiedono globale ha un metodo "definita" su di esso che prende il nome del modulo e restituisce vero o falso.

// returns true 
require.defined("my/awesome/defined/module"); 

// returns false 
require.defined("not/yet/loaded"); 
+0

Thx - Questo ha quasi soddisfatto le mie esigenze e mi ha aiutato a trovare la risposta giusta che ora ho aggiunto e contrassegnato come soluzione completa. – WooWaaBob

+0

+1 ottima risposta e una bella funzionalità, non sapevo di questo! – thomaux

+0

solo curioso, se qualche alternativa nella versione mandorla? –

Problemi correlati