2012-04-08 22 views
5

我知道這個問題的標題可能有點誤導;我意識到JSON是格式化數據的一種方式,而AJAX是一種將刷新/推送到服務器的更新而不刷新的方式。我在問,因爲我在這方面合法地沒有太多的經驗。CakePHP:JSON vs AJAX

假設我有一個CakePHP的web應用程序:這純粹是喜好問題,如果我選擇

  • 要使用JSON拉/推數據,然後使用一個腳本,在客戶端更新這一頁?
  • 要使用AJAX從服務器獲取完整的HTML片段並將其插入到頁面中?

我看到兩者之間唯一的區別是JSON意味着更少的服務器負載和帶寬使用,也許開發人員使用更舒適的語言(JSON可能意味着更多的客戶端腳本?)。

有人能幫我解釋一下這個問題嗎?

+0

好問題 - 屬於程序員交換,但我相信。 – 2012-04-08 16:49:02

+0

@MichaelDurrant我不知道程序員交換,但它更多的是一個開放式問題是。我不太確定真正的「答案」是什麼,因爲它更像是OP的編程哲學。也許在論壇上?然後,我可以想象自己正在查找'我可以更好地爲我的新應用使用客戶端或服務器端模板嗎?'在Stackoverflow和這個問題涉及到。 – Mosselman 2012-04-08 23:01:46

+0

@Purren大約一年前,您在StackOverflow上提出了兩個問題,一個是另一個問題,而您沒有跟上答案。儘量做到這一點,因爲它使社區更好。 – Mosselman 2012-04-10 20:26:39

回答

3

好問題。特別是在Backbone.js等事情變得越來越流行的時代。

讓我們一步一步來看看它。

首先,生成JSON而不是HTML的服務器上的負載可能差不多是相同的。大多數資源不會將數據對象轉換爲HTML或JSON,但它們會接受客戶端請求,加載您的框架,CakePHP,路由請求,加載更多組件,設置數據庫連接,對它進行查詢,接受結果,將它們轉換爲數組/對象,然後你纔開始將數據輸出到視圖的字符串(JSON或HTML)。事情是,儘管像PHP這樣的服務器端語言並沒有被循環遍歷事物和輸出值給字符串留下深刻的印象,但他們可以毫無困難地做到這一點。

實際上,當您開始輸出JSON時,性能的差異並不會很大。至少,對大多數事物來說都不夠好。

當你想要使用JSON的時候,當你有一個複雜的功能。例如tweetdeck的提要,其中有很多小組件和需要更新的數據片段;單個推文,推文列表,跟隨者計數等。加載這些小塊信息比每次重新下載完整的HTML集合都有意義。你會使用JSON和客戶端模板,因爲你有很多事情可能會改變。

然而,在更多'正常'的應用程序中,比如博客,電子商務網站,維基等等,你不會真的需要像這樣的細粒度的東西。在這種情況下,你會使用AJAX(使用你的定義)。

其中一個原因是,構建HTML視圖比創建返回JSON的視圖更容易,更易於開發人員構建,然後構建客戶端模板以呈現這些視圖。在服務器端模板中檢查某些條件,創建循環,在需要時獲取額外的數據等等更容易。無論如何,它不會影響你的表演。

另一個原因是您可以使用服務器端的靜態HTML來渲染非AJAX頁面,作爲後備。所以,當客戶端可以使用AJAX時,您可以通過AJAX加載內容,替換可以使用從HTML獲得的HTML來表示內容,但當沒有任何AJAX可用時,您只需重定向到該頁面。所以現在你對javascript和非javascript客戶端都有支持。你也可以通過服務器和客戶端模板來實現這一點,但這需要雙重工作或使用諸如Mustache之類的東西。

最重要的是,使用JSON在客戶端進行所有渲染的一個缺點是,某些信息片段需要渲染頁面,但不應該由用戶掌握。在服務器端渲染之前,我可以想象諸如信用卡數據,社會安全號碼,真實姓名等,在代碼中執行某種檢查。爲了在客戶端執行同樣的檢查,您必須將其全部發送給客戶端,然後將其發送給用戶。當然,你不能這麼做,並且首先在服務器端處理所有數據,然後再發送給客戶端,但這意味着你已經在HTML模板中做了越來越多的事情。

綜上所述:

對我來說,服務器或客戶端HTML渲染的性能不會在現實生活中那麼明顯。我使用了很多JSON,但通常用於非視圖相關的東西。像通過AJAX調用保存某些內容,然後使用JSON返回狀態報告。所以我可以做像if data.status == 'awesome'等東西。如果我完全將AJAX作爲一個普通的網站,我會使用類似pjax(下面)的東西從服務器加載HTML片段。在我看來,javascript應該用現有的HTML來做事,不應該再加上太多的東西。在構建真正複雜和實時的應用程序時,也有例外,這些應用程序需要同時跟蹤大量較小的數據,因此客戶端模板具有其自身的地位,但不僅限於其他地方。

看看pjax,它是一個JavaScript庫,用於從服務器端動態地將HTML片段加載到頁面上的元素中。 http://pjax.heroku.com/

DHH回覆了Hacker News上關於Basecamp如何以及如何設置的主題;主要是服務器端腳本,小客戶端MVC。

https://news.ycombinator.com/item?id=3603898

另一個有趣的鏈接。 LinkedIn描述他們如何使用客戶端模板出於性能原因。 http://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates