CakePHP:JSON与AJAX

时间:2012-04-08 15:46:23

标签: ajax json cakephp

我知道这个问题的标题可能有点误导;我意识到JSON是一种格式化数据的方式,而AJAX是一种在没有刷新的情况下从/向服务器提取/推送更新的方法。我问,因为我在这方面没有多少经验。

鉴于我有一个CakePHP网络应用程序:如果我选择只是一个偏好问题

  • 使用JSON来提取/推送数据,然后使用客户端上的脚本来更新页面?
  • 使用AJAX从服务器获取完整的HTML片段并将其插入页面?

我在两者之间看到的唯一区别是JSON意味着服务器上的负载和带宽的使用量减少了,也许开发人员使用哪种语言更合适(JSON可能意味着更多的客户端脚本?)。

有人可以为我解释这件事吗?

1 个答案:

答案 0 :(得分:3)

好问题。特别是在像Backbone.js这样的东西越来越流行的时候。

让我们一步一步地看一下。

首先,服务器上生成JSON而不是HTML的负载可能或多或少相同。大多数资源不会将您的数据对象转换为HTML或JSON,但是他们会接受客户端请求,加载框架,在您的情况下使用CakePHP,路由请求,加载更多组件,设置数据库连接,向它抛出查询,接受结果,将它们转换为数组/对象,然后只开始将该数据输出到视图的字符串(JSON或HTML)。虽然像PHP这样的服务器端语言并没有真正地通过循环并将值输出到字符串中而给人留下深刻印象,但是他们可以毫无困难地做到这一点。

实际上,当您开始输出JSON时,性能的差异并不会那么大。至少,对大多数事情都不够好。

如果您想要使用JSON,那么当您拥有复杂的功能时。例如像tweetdeck的feed这样的东西,其中有许多小组件和需要更新的数据片段;单个推文,推文列表,跟随者计数等。加载这些小信息而不是每次重新下载完整的HTML集都是有意义的。您将使用JSON和客户端模板,因为您有许多可能会发生变化的事情。

在更“正常”的应用程序中,如博客,电子商务网站,维基等,你不会真的需要像这样的细粒度的东西。在这种情况下,您将使用AJAX(使用您的定义)。

一些原因是,构建HTML视图更容易,更开发人员友好,而不是首先构建返回JSON的视图,然后构建客户端模板来呈现这些视图。在服务器端模板中更容易检查某些条件,创建循环,在需要时获取额外数据等。无论如何,它不会削减你的表现。

另一个原因是您可以使用服务器端的静态HTML来渲染非AJAX页面,作为后备。因此,当客户端可以使用AJAX时,您可以通过AJAX加载内容并替换我们从您获得的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回复了黑客新闻的一个主题,关于他们如何以及如何使用Basecamp进行设置;主要是服务器端脚本,小客户端MVC。

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

另一个有趣的链接。 LinkedIn描述了出于性能原因他们如何使用客户端模板。 http://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates