2013-11-24 13 views
7

Così ho iniziato a imparare come usare requirejs e combinarlo con alcune delle altre librerie javascript disponibili. Come ho capito, è necessario shim tutte le librerie che non sono Asynchronous module definition compatible (AMD), ma oltre alla ricerca attraverso il codice della libreria per "require" c'è un modo più semplice per capire quali librerie supportano AMD e quali no? Ad esempio, so che jquery supporta AMD ma jqueryui no, e lo so solo perché "qualcuno mi ha detto".Come sapere se una libreria javascript supporta AMD

+0

Si potrebbe indurre la gente a parlare di questo quando parli di AMD, non stai parlando della CPU/società di semiconduttori video, ma suppongo tu stia parlando di [Asynchronous Module Definition] (http: // gregfranko. com/blog/registrazione-the-jQueryUI-widget di fabbrica-come-un-amd-modulo /). – jfriend00

+1

@ jfriend00, [Asynchronous_module_definition] (http://en.wikipedia.org/wiki/Asynchronous_module_definition), sai che cosa significa "OP", vero? –

+2

NON sapevo cosa volessero dire. Ho pensato che stessero chiedendo la compatibilità della scheda video AMD. Solo quando ho cercato su Google ho trovato quello che volevano dire. Modificherò la domanda personalmente per assicurarmi che sia chiaro agli altri lettori. – jfriend00

risposta

3

Ecco come jQuery dichiara il proprio AMD. Sono solo un mucchio di dichiarazioni if. A meno che le librerie non abbiano un numero di library.AMD === true, non c'è modo di controllare dalla libreria stessa.

if (typeof module === "object" && module && typeof module.exports === "object") { 
    module.exports = jQuery; 
} else { 
    window.jQuery = window.$ = jQuery; 
    if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { return jQuery; }); 
    } 
} 

Tuttavia, c'è un modo per controllare i moduli già caricati. This answer afferma che è possibile controllare require.s.contexts._.defined, che è un oggetto contenente la mappatura dei nomi-definizione dei moduli già caricati.

Ad esempio, se ho caricato jQuery (che di default ha AMD) nella pagina che ha anche RequireJS, una proprietà jquery esisterà in quell'oggetto e contiene lo stesso oggetto jQuery come globale. È quindi possibile confrontare. Di seguito tornerà true:

require.s.contexts._.defined.jquery === jQuery 
require.s.contexts._.defined.jquery === $ 

Tuttavia, questo presuppone che si conosce il nome del modulo e/o c'è un mondiale da confrontare. Questo potrebbe non funzionare in tutti i casi. Ad esempio, l'interfaccia utente di jQuery non è solo un grande pezzo di codice. È un mucchio di plugin alloggiati sotto un jquery-ui.js. C'è la possibilità che o possano essere nominati collettivamente o un modulo per widget. L'interfaccia utente di jQuery non ha nemmeno un globale.

2

Sarete alla ricerca di AMD formatdefine() chiamate nelle fonti, dove di solito vengono in tre gusti:

  • Nessun modulo AMD definiti, in cui dovrete configurare uno spessore in RequireJS;
  • Supporto AMD opzionale, in cui di solito si verificano degli sniffing per la dipendenza da define() nei globals nella parte inferiore;
  • Modulo AMD di prima classe, in cui tutto è incluso in una chiamata a define().

E 'bene notare che si otterrà un errore se il vostro cercando di spessorare un modulo AMD per errore, oppure caricare uno script come modulo di AMD che non chiama mai define() di crearne uno.

+1

Grazie per aver chiarito che Filip.Solo per curiosità ho fatto un rapido test per verificare se avrei ricevuto un errore se avessi sfogliato una libreria compatibile con AMD o visa-versa ma, per quanto posso vedere, non trovo nulla nel log della console. Hai un breve esempio che mostra questo? –

Problemi correlati