CakePHP: JSON vs AJAX



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

鉴于我有一个 CakePHP Web 应用程序:如果我选择

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

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

有人可以为我阐明此事吗?

好问题。尤其是在像Backbone.js这样的东西变得越来越流行的时代。

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

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

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

当您想要使用 JSON 时,当您拥有复杂的功能时。例如,像 tweetdeck 的提要这样的东西,其中有很多小组件和数据片段需要更新;单条推文、推文列表、关注者数量等。加载这些小块信息而不是每次都重新下载完整的 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回复了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

最新更新