2012-05-15 17 views
14

Sto provando a lavorare con requirejs e plug-in di testo e ho uno strano problema.aggiunge ".js" al nome del file

Ho due server Web:

  1. localhost: 3000 - agire come CDN e dispone di tutti i file statici: js, immagini, CSS e modelli
  2. localhost: 3001 - Server - agire come server di REST e servire un solo file, il file main.html
  3. caricamento del file

il main.html tutti i js file del vento server di cond utilizzando la seguente riga:

<script data-main="http://localhost:3000/js/main" 
     src="http://localhost:3000/lib/require-jquery.js"></script> 

Per qualche ragione, quando si utilizza il requirejs testo plugin, aggiunge ai modelli ".js" suffisso quando si naviga a localhost: 3001

sto usando la seguente sintassi:

define ['jquery','backbone','underscore','models/model','text!templates/main.html', 
     'views/navigation', 'views/player', 'views/content', 'views/header'] 

quando naviga verso localhost: 3000 funziona benissimo.

Riuscite a pensare a qualsiasi motivo che il plugin di testo avrebbe problemi che servono i file di testo da un server remoto (ad esempio, il server CDN)?

risposta

3

ho scavato nel codice del plugin di testo.

ho scoperto che il plugin di testo presuppone che lo sviluppatore ha convertito il modello di testo in formato html dal momento che risiede su un dominio diverso.

ho modificare il codice del plugin di testo di non assumerla.

Qualcuno pensa che io sto facendo qualcosa di sbagliato?

Il codice originale del plugin:

  //Load the text. Use XHR if possible and in a browser. 
      if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { 
       text.get(url, function (content) { 
        text.finishLoad(name, parsed.strip, content, onLoad, config); 
       }); 
      } else { 
       //Need to fetch the resource across domains. Assume 
       //the resource has been optimized into a JS module. Fetch 
       //by the module name + extension, but do not include the 
       //!strip part to avoid file system issues. 
       req([nonStripName], function (content) { 
        text.finishLoad(parsed.moduleName + '.' + parsed.ext, 
            parsed.strip, content, onLoad, config); 
       }); 
      } 
+1

soluzione è stata data dal @ alex3683 –

15

ho avuto problemi con il plugin di testo quando si lavora a livello di dominio e, forse, i vostri due server localhost stanno colpendo anche questo.

Nella finestra di ispezione web ho visto che require.js stava cercando di prendere le cose come some-content.html.js invece di some-content.html.

sono in esecuzione questo codice in modalità di sviluppo o di un edificio in un set di produzione? Quando si raggruppa tutto il plug-in di testo non si dovrebbe avere lo stesso problema di dominio incrociato.

ecco la parte documentazione API che mi soffiata (da http://requirejs.org/docs/api.html):

Il baseurl può essere un URL in un dominio diverso, come la pagina che verrà require.js carico. Il caricamento di script RequireJS funziona su tutti i domini.La limitazione è solo sul contenuto di testo caricato da testo! plugin: i percorsi devono trovarsi sullo stesso dominio della pagina, almeno durante lo sviluppo . Lo strumento di ottimizzazione integra il testo! plugin risorse quindi, dopo aver utilizzato lo strumento di ottimizzazione, è possibile utilizzare le risorse tale testo di riferimento! estrai le risorse da un altro dominio.

Here's an article che mi ha aiutato ovviare a questo per i browser che supportano CORS:

+0

tuo link articolo punti a un sito web terribilmente rotto – ruyadorno

+1

Whoa, hai ragione; è andato. Sembra un dominio parcheggiato o qualcosa ora. L'ho modificato in modo che punti a una versione archiviata. Nota che questa risposta è stata scritta circa 4 anni fa ... così come 40 "anni web" fa :) – iX3

0

Ho messo ad ogni soluzione che ho visto pubblicato su Internet a parte l'esecuzione r.js ottimizzatore e la compilazione i miei modelli in file .js.

Un lavoro temporaneo in giro è quello di mettere i modelli nella stessa directory del file index.html. Questo naturalmente non risolve il problema, ma se sei fermo come fossi, allora almeno ti farai muovere di nuovo.

+0

Non risolve il problema e non ha funzionato per me. – Warpzit

0

Ho incontrato lo stesso problema e la correzione è stato quello di assicurarsi che il file è stato caricato main.js dallo stesso dominio, come i file * .htm. Quando erano diversi, richiedevano aggiungere il file .js ai file html, risultando in 404s.

+0

Ancora questo problema, anche se il dominio del file main.js è uguale ai modelli. Potrebbe essere una combinazione con il plug-in del modello underscore-tpl – mix3d

15

Il documentation of the text plugin dà un suggerimento per la soluzione: E 'possibile configurare il plugin in un modo che va a prendere sempre le risorse remote attraverso XHR senza aggiungere il suffisso .js e il caricamento tramite tag script. La soluzione più semplice è quella di far rispettare sempre utilizzando XHR:

requirejs.config({ 
    config: { 
     text: { 
     useXhr: function (url, protocol, hostname, port) { 
      return true; 
     } 
     } 
    } 
}); 

Nota che il server remoto ha bisogno di impostare l'intestazione CORS corretta e che questo potrebbe essere un problema di sicurezza. Quindi aggiungi i controlli necessari per gli URL attendibili quando usi questo invece di restituire semplicemente true.

0

Tale configurazione non funziona nel testo attuale! collegare. La mia soluzione era in sovrascrivendo il metodo useXhr nel modulo 'testo'

require(["text"], function (text) 
{ if(location.port == '4502' || location.port == '4503')// AEM env-t 
     text.useXhr = function(){ return true; } 
    require(["loader/widget/WidgetLoader"]); // dependent on HTML templates by text! plugin 
}); 
Problemi correlati