2012-12-29 71 views
5

我有一個基於Google App Engine(Python + Jinja2模板引擎)構建的工作網站。我想開始使用Backbone.js和Underscore.js將其重新設計爲單頁應用程序。目標是使用漸進增強策略。Jinja2,Backbone.js和漸進增強

該網站仍將在第一次訪問時使用後端呈現。如果瀏覽器支持JavaScript,Backbone.js將接管。

我決定這樣做有兩個原因。首先,我已擁有的所有鏈接將保持不變,其次Google索引機器人將能夠抓取網站內容。

我有兩個問題,這種方法:

  1. 我需要有兩個模板在後端(Jinja2的),一個在前端(Underscore.js)幾乎所有的東西在我的網站之一。我想知道這種情況下的最佳做法是什麼?有什麼建議可以避免爲所有內容設置兩個模板?

  2. 如何爲前端加載模板以使用Backbone.js + Underscore.js?我可以將它們全部加載到初始請求中,或者在需要時異步請求它們。

我欣賞任何想法! 謝謝。

一些資源:

http://ricostacruz.com/backbone-patterns/

這其中介紹瞭如何Backbone.js的綁定到現有的HTML: http://lostechies.com/derickbailey/2011/09/26/seo-and-accessibility-with-html5-pushstate-part-2-progressive-enhancement-with-backbone-js/

回答

7

所以最近我(今年)通過了類似的情況去了。我會告訴你一個時間的頭,第一個是非常難對付的事情。請記住,您不僅需要複製模板,還需要複製圍繞您網站的所有業務邏輯。例如,假設您允許用戶在特定頁面上添加評論。使用您描述的方法,您必須在服務器端和客戶端都有註釋模板,並且還需要複製在客戶端和服務器上添加/刪除/編輯註釋所需的邏輯(以適應有和沒有javascript的用戶)。使用Jinja2功能塊可以輕鬆複製模板,但是邏輯的重複是它變得有趣的地方。我試圖做到這一點,並在幾個月後完成了重寫。

所以,我給你的建議是溝通的想法,你可以同時支持JavaScript和非JavaScript用戶。讓您的網站爲其中一個或另一個。我個人選擇了自己的javascript路線。這給你兩個選擇。製作一個單頁面應用程序,或者創建一個應用程序,該應用程序在很大程度上利用JavaScript來實現功能,但是呈現服務器端的所有內容可能還有其他一些選項,但這些是我見過的最受歡迎的兩個選項。我去了第二個選項。所以我做的是,初始頁面加載是由服務器完成的。 Backbone.js然後消耗每個元素並使模型和視圖脫離它們。這主要是利用data屬性完成的。因此,例如創建註釋視圖我有一個這樣的元素:

<div class="comment" data-id="1" data-body="You Suck"></div> 

我會再消耗該註解,並創建一個模型,它像這樣:最後

var CommentModel = Backbone.Model.extend(); 

var comment_el = $('.comment'); 
var comment_model = new CommentModel($(comment_el).data()); 

,我將支持視圖與創建模型,這樣就可以將網站添加功能:

var CommentView = Backbone.View.extend({ 
    initialize: function() {}, 
    edit: function() {}, 
    delete: function() {} 
}); 

var comment_view = new CommentView({ 
    model: comment_model 
}); 

這時,你可能會問:「如果我需要重新渲染的東西,我不需要客戶端模板f或者那個?」不。客戶端模板是一件非常新穎的事情。我個人儘量避開它們,因爲我覺得我們還沒到那裏,我一直覺得單頁面應用程序對我的口味反應不夠。我確信有很多人會不同意我的看法,但這是我最近的項目採取的立場。所以說,我渲染了服務器上的所有內容,並以JSON的形式將HTML發送到客戶端,然後將其注入到DOM中。所以我有很多api端點,它們將JSON返回給我的Backbone.js代碼。這是目前正在爲我設計的,但這個問題通常在很大程度上是情境性的。你必須真正看看你的需求是什麼。值得一提的是,我基本上將我目前的系統基於Twitter最終決定在嘗試整頁單頁應用程序之後做出的決定。你可以閱讀關於它here

+0

非常感謝你這樣一個描述性的答案。 – Ralphz

+0

現在呢?客戶端模板仍然未被證實? – Kevin