为啥 Facebook、Twitter 和 GMail 将其所有数据以 JSON 而不是 HTML 的形式呈现给浏览器?

Posted

技术标签:

【中文标题】为啥 Facebook、Twitter 和 GMail 将其所有数据以 JSON 而不是 HTML 的形式呈现给浏览器?【英文标题】:Why do Facebook, Twitter and GMail render all their data to the browser as JSON as opposed to HTML?为什么 Facebook、Twitter 和 GMail 将其所有数据以 JSON 而不是 HTML 的形式呈现给浏览器? 【发布时间】:2011-11-12 14:33:39 【问题描述】:

如果您登录 Facebook、Twitter 或 Gmail 并查看源代码,您会发现一些非常奇怪的东西。您的所有推文和邮件都呈现为 JSON。没有尖括号。我的猜测是,这些数据都是动态呈现给 DOM 的。如果您检查页面上的任何元素,您会看到大量的 div 和其他 html 元素。这些都没有在原始标记中提供。问题是:

    为什么这 3 个大型网站要花时间来做这件事? 仅使用 HTML 不是更快吗? 由于 JSON 有效负载比 HTML 更小,是否可以节省带宽? 是因为这些网站严重基于 AJAX 吗?我的猜测是前者,但我不知道。我不确定你是否必须为 Google Twitter 或 Facebook 工作才能知道为什么会这样,但这个策略在 3 个站点之间共享,所以我认为它们有一个共同的目标。这让我觉得这更笼统。

【问题讨论】:

我刚刚在 Facebook 上发现了同样的事情。所以我将它添加到列表中。谢谢大家!! 我最近发现这是单页应用程序的概念。这些应用程序通常不会刷新页面,会触发大量事件(新电子邮件、新推文、新消息等),并通过轮询或持久连接与服务器进行大量交互。 Backbone.js 是完成此类任务的一个很好的框架,因此最近受到了很多关注。 【参考方案1】:

他们的设计被普遍应用有几个原因:

    正如前面的答案所提到的,可以在浏览器中使用缓存,并且 JSON 负载更轻 它们按照 MVC 模式在服务、UI 逻辑和数据之间提供了清晰的分离 JSON 作为模型 javascript UI 小部件作为呈现数据的视图 作为控制器的服务层提供业务逻辑/服务并馈送到 UI 层

    上面第 2 点中提到的 API 驱动架构和分离允许公司提供多渠道交付,而无需太多返工。考虑我们是否要为 android 构建 Twitter 应用程序:

    作为模型的 JSON 保持不变,因为数据是相同的,所以这里不需要返工 我们现在将 View 从 HTML 更改为 Android Native UI,在这种情况下,我们需要编写 UI 层代码 作为控制器的服务层保持不变,我们不必在这里做任何事情

    如您所见,此模型为 Google/Twitter 提供了一种无需重写其逻辑即可向多渠道投放的方式。这同样适用于移动 WebView 与普通桌面 WebView。我们需要更改的只是 UI 层,而不是数据或控制器层。

这就是他们花时间考虑设计和架构的原因。数据和表示之间的紧密耦合将要求他们重新编写大量代码,以便在多个渠道中交付。这不是关于 JSON 与 HTML 或只是网络,而是更多的架构决策,允许他们将内容交付到多渠道(ios、Android、第三方应用程序、移动 WebView、桌面视图、桌面应用程序等)。你在他们的 HTML 源代码中看到的是他们在 WebView 频道中策略的体现。

【讨论】:

【参考方案2】:

基本上,这是将表示和数据分离到另一个层次。服务器端有一层只提供数据。一般来说,JSON 是提供该数据的好方法。现在你如何呈现它可以分开处理。

此 JSON 可以通过 Web 服务传递给任何感兴趣的客户端(Web/桌面/移动/其他 API)。然后客户可以决定如何呈现它。在 Web 上,我们使用大量 javascript 来读取和解析这个 JSON 并操作屏幕/DOM。

【讨论】:

【参考方案3】:

我的猜测:避免重复 UI 相关代码。

我刚刚查看了 Twitter 的源代码,似乎他们希望将所有 UI 逻辑保留在 JavaScript 中。这是合理的,因为 Twitter 页面会不断获取新的推文,所以他们不得不用 JavaScript 编写 UI 相关的代码。因此,与其在后端重复相同的代码,它只是在使用 JavaScript 加载页面时播种初始数据以呈现推文。

缓存参数对我来说没有意义,因为初始页面请求不可缓存,因此在任何一种方法中它的工作方式都相同。

【讨论】:

【参考方案4】:

此技术允许浏览器缓存 HTML(和静态 javascript)并仅获取 json 字符串。它确实非常快并且带宽友好。

【讨论】:

JSON 数据仍然是初始响应的一部分,这不会改善缓存。 (他们不提供静态文件。) 嗯...确实可以缓存页面的特定部分。我已经在“甜甜圈缓存”中看到了这种技术。 weblogs.asp.net/scottgu/archive/2006/11/28/….【参考方案5】:

不,它不会更快。 JSON 比 HTML 更容易在服务器端生成。据我所知,Twitter 也使用Mustache 在客户端呈现这些数据。

因此,您只需提供静态模板(如果缓存正确,它们只需要加载一次)和 JSON 数据,然后让客户端完成所有渲染工作。一个优点是,客户端可以选择他们想要呈现数据的内容和方式,另一个优点是它可以从服务器承担所有繁重的 HTML 生成开销。

【讨论】:

以上是关于为啥 Facebook、Twitter 和 GMail 将其所有数据以 JSON 而不是 HTML 的形式呈现给浏览器?的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityViewController 和 facebook/twitter

如何在iOS中为twitter和Facebook实现通用深层链接?

通过 Twitter、Facebook、LinkedIn 和 Google Plus 分享

css 这会将facebook twitter和instagram图标添加到包含“facebook.com”,“twitter.com”和“instagram.com”的内容中的链接

css 这会将facebook twitter和instagram图标添加到包含“facebook.com”,“twitter.com”和“instagram.com”的内容中的链接

我可以在解析时将一个人与 twitter 和 facebook 联系起来吗?