2013-10-30 8 views
8

Utilizzando requireJS, sto tentando di specificare un percorso per il mio data-main diverso da baseUrl. Sembra che requireJS stia ignorando qualsiasi cosa io scriva prima del nome del file, e cerco sempre il file nella cartella baseUrl.RequireJS non segue il percorso relativo per data-main con baseUrl impostato

ho la seguente struttura di cartelle:

index.html 
scripts/ 
    lib/ 
    require.js 
    test/ 
    main2.js 
    config.js 

Contenuto del index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Test</title> 
     <script data-main="test/main2" src="scripts/lib/require.js"></script> 
     <script src="scripts/config.js"></script> 
    </head> 

    <body></body> 
</html> 

Contenuti di config.js:

requirejs.config({ 
    baseUrl: "scripts" 
}); 

E io sto ottenendo un 404 errore per: GET [...]/scripts/main2.js, anche se dovrebbe cercare [...]/scripts/test/main2.js. Se rimuovo il file config.js e utilizzo data-main = "scripts/test/main2", funziona, ma mi piacerebbe poter specificare un baseUrl per il mio progetto.

Qualche idea?

Edit: dopo la risposta Waxen:

  • Anche se uso "scripts/test/Principale2", "/ scripts/test/Principale2", o "whateverIWant/Principale2" nella mia data-principale , sembra stranamente sempre per "scripts/main2.js"

notare che io sto usando requirejs 2.1.8

+0

Ho eseguito il rollback dell'ultimo modifica - è stato fuorviante vedere il codice dalla risposta accettata nella tua domanda.Il fatto che tu abbia accettato una risposta è sufficiente per dire agli altri utenti quale sia la soluzione al problema nella tua domanda, è! – Luca

risposta

11

Questo non funziona come si desidera che perché si sta chiamando richiede con una data-main prima di impostare il valore baseURL. Non sono sicuro del perché stia provando ad andare su scripts/main2.js; Mi aspetto che tenti di caricare test/main2.js piuttosto che script/main2.js. Tuttavia, questo è oltre il punto.

Quello che devi fare è assicurarti che il tuo baseURL sia disponibile a richiedere prima di provare a caricare i dati principali. Ciò può essere ottenuto includendo prima la configurazione e utilizzando la sintassi dal secondo esempio qui: http://requirejs.org/docs/api.html#config.


Contenuto del index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Test</title> 
     <script src="scripts/config.js"></script> 
     <script data-main="test/main2" src="scripts/lib/require.js"></script> 
    </head> 

    <body></body> 
</html> 

Contenuti di config.js:

var require = { 
    baseUrl: "scripts" 
}; 
+0

Grazie mille per il tuo Ho testato il tuo metodo che non si basa sull'attributo data-main e funziona, tuttavia, se fornisco il percorso completo in data-main ("scripts/test/main2" o "/ scripts/test/main2 ") Ricevo ancora un errore 404 dicendo che non riusciva a trovare script/main2.js, che non corrisponde al percorso che ho dato. Sto usando requirejs 2.1.8. Preferirei il metodo data-main in modo da poter usare lo stesso file di configurazione f o l'applicazione principale e i test di unità. – personne3000

+0

Hai ragione, il primo non ha funzionato. Ho eseguito un paio di test localmente e ho aggiornato la mia risposta per rimuovere la prima opzione, e ho aggiornato la soluzione rimanente per utilizzare data-main. – Waxen

+0

Compresa la configurazione prima del file require.js come indicato nella documentazione ha fatto davvero il trucco, grazie mille – personne3000

7

ho letto questa discussione e non riuscivo a capire perché utilizzando l'attributo data-principale puntare a un file js di configurazione non sarebbe lo stesso che specificare la configurazione prima di caricare Richiedi, come suggerisce la risposta a questo thread.

Nei miei esperimenti, ho appreso che l'impostazione dei valori utilizzando un file di configurazione dati principale potrebbe essere (quindi, di nuovo, potrebbe non). Per quelli nuovi di Require e AMD e asincronismi in generale, la nozione "potrebbe funzionare" ha a che fare con il fatto che le operazioni asincrone vengono eseguite quando poi possono - e non in qualsiasi ordine prevedibile.

Una volta accertato che, v'è un punto molto importante realizzato nella versione corrente della documentazione RequireJS che mi sfuggiva fino ad ora:

È anche possibile chiamare require.config dal vostro punto di ingresso dati principale, ma essere consapevoli del fatto che lo script del data-main viene caricato in modo asincrono. Evitare gli script che presuppongono erroneamente che data-main e il suo numero require.config vengano sempre eseguiti prima del caricamento dello script.

Per ulteriori informazioni, si veda: http://requirejs.org/docs/api.html#data-main

Essendo nuovo RequireJS, ero leggermente costernato per imparare questo - e ho sprecato un sacco di tempo cercando di eseguire il debug di problemi di percorso di accesso. A questo punto non mi è chiaro perché qualcuno userebbe data-main (soprattutto per definire una baseUrl) poiché questo riferimento funzionerà solo in modo casuale. Invece la soluzione suggerita da questo thread (in cui si imposta la baseUrl in un tag script NON asincrono, funzionerà come previsto e imposterà in modo affidabile la configurazione RequireJS prima del kick-off RequireJS.

+4

il suo divertente si dice "leggermente inorridito", in realtà mi fa incazzare ... qual è il punto di requirejs allora, se requirejs non può nemmeno garantire che la sua configurazione sia stata caricata? imo, questa è una grave carenza. La risposta quindi, non è l'ottusa "basta richiedere ['scripts/config'] prima di tutto il codice" ma aggiungere una nuova funzione, "required" o "requiredWithConfig" che attendono fino a quando la configurazione non viene effettivamente caricata e potenzialmente non viene eseguita a tutti se config non riesce a caricare, che è meglio degli errori casuali di Javascript di non riuscire a caricare cose che la configurazione avrebbe caricato correttamente. – enorl76