RequireJS, jquery ancora indefinito

So che questo è già stato discusso, ma dopo aver cercato per un po ‘non riesco a capire perché il mio piccolo setup non carichi correttamente jquery con requireJS.

Sto eseguendo una piccola pagina html di esempio da ‘file: //’ e provo a caricare 2 moduli con una chiamata per richiedere:

  • jquery
  • un modulo personalizzato che ho scritto

Se il mio modulo personalizzato viene caricato correttamente (posso usarlo con il suo alias nella chiamata require, jquery è sempre indefinito)

Ho provato a impostare i percorsi in require.config, così come shim (esportando ‘$’ o ‘jQuery’) ma non funziona.

L’unico modo per caricare correttamente jquery è la rimozione di tutte le definizioni dei percorsi e la denominazione del file jquery sul mio filesystem ‘jquery.js’

Ecco la mia configurazione:

main.js:

require.config({ baseUrl: 'scripts', paths: { jquery: 'jquery-2.1.3.min' //does not work //jquery: 'http://code.jquery.com/jquery-2.1.3.min.js' //does not work either } }); console.log( "main.js is loaded" ); //this is correctly ouputed to the console 

test.html:

          require( ['jquery','custom'], function($, Custom){ console.info('$:'); console.info($); //outputs undefined console.info('Custom:'); console.info(Custom); //outputs my custom object });    

Ancora una volta, funziona se rimuovo tutte le definizioni dei percorsi per jquery, e chiamo semplicemente il mio file jquery js ‘jquery.js’, ma questo è sciatto.

Qualcuno può indicarmi la giusta via da seguire?

Il problema è che si carica la configurazione RequireJS, che è in main , attraverso data-main . L’attributo data-main indica semplicemente a RequireJS di caricare il modulo elencato lì, ma il caricamento è ancora asincrono , quindi il main potrebbe caricarsi dopo che RequireJS tenta di caricare jQuery. Quando ciò accade, RequireJS non riesce a trovare jQuery e $ non è definito. (Per inciso, suggerirei di impostare enforceDefine su true nella configurazione RequireJS in modo da ottenere un messaggio di errore che ti dice quando un modulo non è stato caricato. È un indizio migliore di un simbolo non definito.)

Una soluzione sarebbe spostare la configurazione fuori dal main . Quindi lo rimuovi dal main e lo aggiungi ad un elemento di script di fronte a quello che richiede RequireJS:

   

Oppure puoi nidificare require chiamate per forzare il caricamento main prima di qualsiasi altro modulo:

 require(['main'], function () { require(['jquery','custom'], ... });