2013-08-06 13 views
7

Sto ricercando se c'è un modo per rilevare, di sicuro, se uno specifico script viene attualmente caricato da RequireJS. Una risposta per i moduli AMD in generale sarebbe ancora meglio, ma il mio caso d'uso è solo RequireJS.È possibile rilevare se uno script viene caricato come un modulo RequireJS?

jQuery e altre librerie "rilevare" in questo modo:

if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { 
     return jQuery; 
    }); 
} 

Questo è sufficiente nella maggior parte dei casi, ma il problema è che non rileva se lo script viene caricato come modulo AMD, rileva solo se esiste define e supporta le specifiche AMD.

C'è un modo, con RequireJS o con i moduli AMD in generale, per uno script per determinare (per reale) se viene caricato come un modulo?

+2

Il metodo che hai mostrato sta rilevando un caricatore AMD digitando a mano. Che cosa c'è che non va? –

+1

@RobW Rileva perfettamente la presenza di un caricatore AMD. Non rileva se lo script * sta caricando * come un modulo AMD. Ad un livello superiore, il codice sopra restituirà true se '' esiste, indipendentemente dal fatto che uno specifico script venga effettivamente caricato con RequireJS. – mwcz

risposta

4

Date un'occhiata a specified():

parentRequire.specified (moduleName): Restituisce true se è già stato richiesto il modulo o è in fase di carico e dovrebbe essere disponibili ad un certo punto.

if (typeof require === "function" && typeof require.specified === "function" && require.specified("jquery")) { 
    define("jquery", [], function() { 
     return jQuery; 
    }); 
} 

Ora la cosa problematica è come ottenere il nome del modulo, perché può variare in base alla configurazione dell'utente. C'è un special module for that, ma funziona solo se si è già in una chiamata di definizione. Vi consiglio di contattare jrburke chi è lo sviluppatore Requirejs.

+0

Vorrei cambiare 'typeof require ===" function "&& require.specified (" jquery ")' con 'typeof require ===" function "&& typeof require.specified ===" function "&& require.specified ("jquery") ' –

+0

@MatteoTassinari Yup è il modo più sicuro, grazie. – jgillich

+1

Questo è utile ma, IMHO, non risponde ancora completamente alla domanda in quanto richiede di conoscere il nome del modulo. Dal momento che RequireJS consente all'utente di configurarli, preferirei non dover codificarli qui, ma piuttosto definire il modulo in modo anonimo se possibile. :( –

Problemi correlati