2012-05-15 6 views
14

Ich versuche mit requirejs und Text-Plugin zu arbeiten, und ich habe seltsames Problem.require.js Text-Plugin fügt ".js" zum Dateinamen hinzu

Ich habe zwei Web-Server:

  1. localhost: 3000 - fungieren als CDN und alle statischen Dateien hat: js, Bilder, CSS und Templates
  2. localhost: 3001 - Server - fungieren als REST-Server und dienen nur eine Datei, die main.html Datei

die main.html Datei lädt alle js Dateien aus dem se cond-Server die folgende Zeile ein:

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

Aus irgendeinem Grund, wenn die requirejs Text Plugin verwenden, fügt er an den Vorlagen ".js" Suffix, wenn zu localhost Navigation: 3001

Ich verwende die folgende Syntax:

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

wenn ich localhost navigieren: 3000 es funktioniert gut.

Können Sie sich aus irgendeinem Grund, dass der Text Plugin Probleme dienen Text-Dateien von einem Remote-Server (zB CDN-Server) haben würde?

Antwort

3

Ich habe im Code des Textes Plugin ausgegraben.

Ich habe herausgefunden, dass der Text Plugin wird davon ausgegangen, dass der Entwickler die Textvorlage, da es auf einer anderen Domäne befindet in HTML konvertiert.

habe ich den Code des Textes Plugin ändern, um es nicht zu annehmen.

jemand denkt, dass ich etwas falsch mache?

Der ursprüngliche Code des Plug-in:

  //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

Lösung gegeben wurde, durch @ alex3683 –

15

ich Probleme mit der Text-Plugin gehabt habe, wenn über mehrere Domains und vielleicht Ihr zwei lokaler Host-Server schlagen zu dieser Arbeit. Ich

Im Web-Inspektor sah, dass require.js wurde versucht, die Dinge zu holen wie some-content.html.js statt some-content.html.

Laufen Sie diesen Code im Entwicklungsmodus oder Gebäude in eine Produktions Set? Wenn Sie alles zusammenfassen, sollte das Text-Plugin nicht die gleiche Problematik haben.

Hier ist die API-Dokumentation Teil, der mich weg gekippt (von http://requirejs.org/docs/api.html):

Die baseUrl kann eine URL auf einer anderen Domäne als der Seite sein, das wird Last require.js. Das Laden von RequireJS-Skripten funktioniert über Domänen hinweg.Die Einschränkung only gilt nur für Text, der per Text geladen wird! Plugins: diese Pfade sollten auf der gleichen Domain wie die Seite sein, zumindest während Entwicklung. Das Optimierungstool wird Inline-Text! Plugin Ressourcen so nach der Verwendung des Optimierungstools, können Sie Ressourcen , die Referenz-Text! Ressourcen aus einer anderen Domäne pluginieren.

Here's an article, die mich für Browser, um dieses half zu arbeiten, unterstützen CORS:

+0

Ihre Artikel-Link verweist auf eine schrecklich gebrochene Website – ruyadorno

+1

Whoa, du hast recht; es ist weg. Sieht aus wie eine geparkte Domain oder etwas jetzt. Ich habe es so bearbeitet, dass es auf eine archivierte Version zeigt. Beachten Sie, dass diese Antwort vor etwa 4 Jahren geschrieben wurde ... also wie 40 "Webjahre" her :) – iX3

0

ich bei jeder Lösung gehackt habe ich habe beiseite im Internet veröffentlicht gesehen von r.js Optimierer laufen und Kompilieren meine Vorlagen in .js-Datei.

Eine vorübergehende Lösung besteht darin, Ihre Vorlagen in dasselbe Verzeichnis wie Ihre index.html-Datei zu speichern. Das löst das Problem natürlich nicht, aber wenn Sie wie ich im Stillstand sind, wird Sie das zumindest wieder in Bewegung bringen.

+0

Löst das Problem nicht und es funktionierte nicht für mich. – Warpzit

0

Ich lief das gleiche Problem und die Lösung bestand darin, sicherzustellen, dass die Datei main.js von der gleichen Domäne wie die * .htm-Dateien geladen wurde. Wenn sie sich unterschieden, würde require die .js an die html-Dateien anhängen, was zu 404s führt.

+0

Immer noch dieses Problem, obwohl die Domäne der main.js-Datei die gleichen wie die Vorlagen ist. Könnte eine Verbindung mit dem Unterstrich-TPL Template-Plugin sein – mix3d

15

Die documentation of the text plugin gibt einen Hinweis auf die Lösung: Es ist möglich, das Plugin so zu konfigurieren, dass es immer Remote-Ressourcen über XHR abruft, ohne das .js Suffix anzufügen und über Script-Tag zu laden. Die einfache Lösung ist immer zu erzwingen XHR mit:

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

Beachten Sie, dass der Remote-Server die richtigen CORS-Header setzen muss und dass dies könnte ein Sicherheitsproblem sein. Fügen Sie daher die erforderlichen Prüfungen für vertrauenswürdige URLs hinzu, wenn Sie diese verwenden, anstatt einfach true zurückzugeben.

0

Eine solche Konfiguration funktioniert nicht im aktuellen Text! Plugin. Meine Lösung war in zwingenden useXhr Methode in ‚Text‘ Modul

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