好问题。尤其是在 Backbone.js 之类的东西变得越来越流行的时候。
让我们一步一步看。
首先,服务器上生成 JSON 而不是 HTML 的负载可能或多或少是相同的。大多数资源不会将您的数据对象转换为 HTML 或 JSON,但它们会接受客户端请求,加载您的框架,在您的情况下为 CakePHP,路由请求,加载更多组件,建立数据库连接,向其抛出查询,接受结果,将它们转换为数组/对象,然后您才开始将该数据输出到您的视图的字符串(JSON 或 HTML)。问题是,尽管像 PHP 这样的服务器端语言并没有真正对遍历事物并将值输出到字符串中留下深刻印象,但它们可以毫无困难地做到这一点。
实际上,当您开始输出 JSON 时,性能差异不会那么大。至少,对于大多数事情来说还不够好。
当你想要使用 JSON 时,你有一个复杂的功能。例如 tweetdeck 的提要,其中有许多需要更新的小组件和数据片段;单个推文、推文列表、关注者数量等。加载这些小信息而不是每次都重新下载完整的 HTML 集是有意义的。您将使用 JSON 和客户端模板,因为您有许多可能会改变的东西。
然而,在更“正常”的应用程序中,如博客、电子商务网站、wiki 等,您实际上并不需要像这样的细粒度的东西。在这种情况下,您将使用 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