2014-03-27 37 views
4

我想要在前端和node.js/express作爲服務器上使用backbone.js構建一個單獨的頁面應用程序,我想要有一個基礎HTML文件的根目錄,然後當用戶瀏覽到諸如使用pushstate和node.js/express作爲服務器來獲得骨幹路由

mydomain.com/foo/bar 

我希望能夠通過JavaScript來處理,而不是使往返於服務器的客戶端上的這條道路的任何路徑。我正在閱讀關於骨幹路由和HTML5推送狀態。在this article他介紹了推動國家尚且如此,

事實上,pushState的實在沒有什麼比JavaScript的標準API,它允許我們通過「推」荷蘭國際集團全網址到瀏覽器的URL未做操縱瀏覽器歷史記錄更多到服務器的往返旅程,並使用Javascript響應URL中的更改 - 所有這些都不使用URL散列碎片。

但是當我使用push狀態時,它確實會發出服務器請求,並期望服務器在/ foo/bar下提供內容。我不明白我能如何避免這種情況。

現在讓我們假設,即使在推送狀態下,當您直接訪問此URL時,您的客戶端將在mydomain.com/foo/bar下發出服務器請求。在這種情況下,因爲我服務的默認HTML文件,這個默認的HTML文件中有鏈接腳本:

<script type="text/javascript" src="/scripts/myscript.js" ></script> 

當這個HTML的負載,它開始尋找/ foo的目錄,而不是根目錄下的腳本因爲服務器在/ foo下被請求,這顯然不存在。我該如何解決?

我真的很困惑在這一點上。我想知道URL路由通常如何在單個頁面應用程序中完成。任何幫助將不勝感激。您也可以參考我發佈的關於同一問題的其他問題:Backbone Router : Get rid of # in the URL

+0

我剛剛在前些日子有同樣的問題。除了我使用node.js並在後端表示服務路由。我認爲按照我的經驗,推送狀態可能需要一些服務器端的響應,用一點鹽就可以實現。在服務器上,我允許express在此路由上呈現一個文件'localhost:3300/chat',在客戶端我允許push狀態,並在此路由命中'localhost:3300/chat'時呈現視圖。 –

+0

另一個有助於寫作backbone.history這樣的''Backbone.history.start({pushState:true,root:'/'});'嘗試添加一個根'/'您的應用程序/網站是否在主路線上啓動'/' –

+0

然後確保你的路由器設置正確'appRoutes:{ '':'profile', 'chat':'chat' }' –

回答

4

您嘗試實施的解決方案非常有趣,但並不那麼簡單。當您的服務器收到mydomain.com/foo/bar的請求時,您應該使用前端(JavaScript)應用可以提取的某些參數重定向到您的根目錄,以瞭解原始請求的用途。例如:

  1. 客戶端發送GET http://mydomain.com/foo/bar
  2. 服務器重定向(響應302 Location頭設定)http://mydomain.com/#!/foo/bar
  3. 您的SPA被加載到瀏覽器中,並在啓動時,你檢查的哈希和發現#!/foo/bar ,所以你刪除散列並觸發/foo/bar路由(這是一個推送狀態)。您的結果URL也是http://mydomain.com/foo/bar:用戶瀏覽到的原始URL。

Grooveshark做一些與此類似,但它實際上與一個頁面中1發來的請求,這確實哈希更換客戶端響應,然後發送另一個請求到服務器。對我來說看起來沒有必要,也許我忽略了一些東西。