2012-05-15 8 views
14

Estoy tratando de trabajar con requirejs y el complemento de texto y tengo un problema extraño.El complemento de texto require.js agrega ".js" al nombre de archivo

Tengo dos servidores web:

  1. localhost: 3000 - actuar como CDN y tiene todos los archivos estáticos: js, imágenes, CSS y plantillas
  2. localhost: 3001 - servidor - actuar como servidor REST y servir sólo un archivo, el archivo principal.html
  3. carga el archivo

el main.html todos los js archivos del sE cond servidor utilizando la siguiente línea:

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

Por alguna razón, cuando se utiliza el plug-in de texto RequireJS, que se suma a las plantillas ".js" sufijo cuando se navega a localhost: 3001

estoy usando la siguiente sintaxis:

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

cuando navego a localhost: 3000 funciona bien.

¿Puede pensar en algún motivo por el cual el complemento de texto tendría problemas para enviar archivos de texto desde un servidor remoto (por ejemplo, servidor CDN)?

Respuesta

3

He buscado el código del complemento de texto.

Descubrí que el complemento de texto asume que el desarrollador convirtió la plantilla de texto en html ya que reside en un dominio diferente.

He cambiado el código del complemento de texto para no asumirlo.

¿Alguien piensa que estoy haciendo algo mal?

El código original 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

solución ha sido dado por @ alex3683 –

15

he tenido problemas con el plugin de texto cuando se trabaja a través de dominios y tal vez sus dos servidores localhost están afectando esto también.

En el inspector web he visto que la require.js estaba tratando de buscar las cosas como some-content.html.js en lugar de some-content.html.

¿Está ejecutando este código en modo de desarrollo o creando un conjunto de producción? Cuando empaqueta todo, el complemento de texto no debería tener el mismo problema entre dominios.

Aquí está la parte documentación de la API que me avisó (de http://requirejs.org/docs/api.html):

El baseUrl puede ser una dirección URL en un dominio diferente que la página que se require.js carga. La carga de script RequireJS funciona en todos los dominios.¡La única restricción de es en el contenido de texto cargado por texto! complementos: las rutas deben estar en el mismo dominio que la página, al menos durante el desarrollo . ¡La herramienta de optimización insertará texto! plugin recursos por lo que después de usar la herramienta de optimización, puede utilizar los recursos ese texto de referencia! recursos de complementos de otro dominio.

Here's an article que me ayudó a evitar este para navegadores que soportan CORS:

+0

Sus puntos de enlace a un sitio web de artículos terriblemente rota – ruyadorno

+1

Whoa, tienes razón; se fue. Parece un dominio estacionado o algo así ahora. Lo he editado para que apunte a una versión archivada. Tenga en cuenta que esta respuesta se escribió hace aproximadamente 4 años ... así que hace 40 años "web" atrás :) – iX3

0

he hackeado en cada solución que he visto publicado en internet, aparte de correr r.js optimizador y la compilación de mis plantillas en archivo .js

Una solución temporal es colocar sus plantillas en el mismo directorio que su archivo index.html. Esto, por supuesto, no resuelve el problema, pero si estás paralizado como yo, entonces esto al menos te hará mover nuevamente.

+0

No resuelve el problema y no funcionó para mí. – Warpzit

0

Me encontré con el mismo problema y la solución era asegurarme de que el archivo main.js se cargara desde el mismo dominio que los archivos * .htm. Cuando difieren, requieren agregar los .js a los archivos html, lo que da como resultado 404s.

+0

Sigue teniendo este problema aunque el dominio del archivo main.js es el mismo que el de las plantillas. Podría ser una conjunción con el complemento de plantilla underscore-tpl – mix3d

15

El documentation of the text plugin da una pista sobre la solución: Es posible configurar el complemento de forma que siempre obtenga recursos remotos a través de XHR sin agregar el sufijo .js y cargarlo mediante una etiqueta de script. La solución más sencilla es hacer cumplir siempre utilizando XHR:

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

Tenga en cuenta que el servidor remoto tiene que establecer el encabezado CORS correcta y que esto podría ser un problema de seguridad. Por lo tanto, agregue las comprobaciones necesarias para las URL de confianza al usar esto en lugar de simplemente devolver true.

0

¡Tal configuración no funciona en el texto actual! enchufar. Mi solución fue en anulando método useXhr en el módulo de 'texto'

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 
}); 
Cuestiones relacionadas