2012-05-15 71 views
14

我正在嘗試使用requirejs和文本插件,並且我有奇怪的問題。require.js文本插件將「.js」添加到文件名

我有兩個Web服務器:

  1. 本地主機:3000 - 作爲CDN並擁有所有靜態文件:JS,圖片,CSS和模板
  2. 本地主機:3001 - 服務器 - 充當REST服務器和服務只有一個文件,該文件main.html中

的main.html中文件加載所有JS從本質文件使用以下行COND服務器:3001

我使用:

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

出於某種原因,使用requirejs文本插件時,他瀏覽到本地主機當添加到模板".js"後綴語法如下:

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

,當我瀏覽到本地主機:3000它工作正常。

你能想到任何原因,文本插件將有問題從遠程服務器(例如,CDN服務器)提供文本文件?

回答

3

我已經挖掘了文本插件的代碼。

我發現文本插件假定開發人員將文本模板轉換爲html,因爲它位於不同的域上。

我已將文本插件的代碼更改爲不假設它。

有人認爲我做錯了什麼?

插件的原始代碼:

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

解決方案已經鑑於@ alex3683 –

15

跨域,也許你的兩個本地主機服務器打太多這方面的工作時,我已經受夠了文本插件的麻煩。

在Web檢查我看到require.js試圖像some-content.html.js而不是some-content.html去取東西。

您是在開發模式下運行此代碼還是將其構建到生產集?當你把所有東西都捆綁起來時,文本插件不應該有這個相同的跨域問題。

下面是我放倒關閉(從http://requirejs.org/docs/api.html)API文檔部分:

中的baseUrl可以在不同的域網址作爲網頁,將 負載require.js。 RequireJS腳本加載跨域運作。 只限文本內容加載文本!插件:那些 路徑應該與頁面在同一個域上,至少在 開發期間。優化工具將內聯文本!插件 資源使用優化工具後,可以使用參考文本的資源 !來自另一個域的插件資源。

Here's an article,幫助我解決這個爲支持CORS瀏覽器:

+0

你的文章鏈接指向一個非常損壞的網站 – ruyadorno

+1

哇,你是對的覆蓋useXhr方法;它消失了。看起來像一個停放的域名或現在的東西。我已編輯它,以便它指向一個存檔的版本。請注意,這個答案是大約4年前寫的...所以像40個「網絡年」前:) – iX3

0

我在每一個我見過在互聯網上發佈除了運行r.js優化和編譯我的模板到溶液砍死.js文件。

臨時解決方法是將您的模板放在與index.html文件相同的目錄中。這當然不能解決問題,但如果你像我一樣處於停滯狀態,那麼這至少會讓你再次移動。

+0

不解決問題,它不適合我。 – Warpzit

0

我遇到了同樣的問題,修復方法是確保main.js文件與* .htm文件是從同一個域加載的。當它們不同時,require會將.js附加到html文件中,導致404s。

+0

即使main.js文件的域與模板相同,仍然存在此問題。可以與下劃線-tpl模板插件結合使用 – mix3d

15

documentation of the text plugin給出瞭解決方案的一個提示:可以配置插件的方式是,它總是通過XHR獲取遠程資源,而不追加.js後綴並通過腳本標記加載它。簡單的解決辦法是使用XHR總是執行:

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

注意,遠程服務器需要設置正確的CORS頭,而這可能是一個安全問題。因此,在使用此時添加必要的可信網址檢查,而不是簡單地返回true

0

這樣的配置在當前文本中不起作用!插入。我的解決辦法是,在「文本」模塊

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