Json只有网络应用程序。有什么缺点? (或优点)

时间:2011-04-10 09:19:29

标签: javascript json architecture

我想设计一个Web应用程序,其唯一的接口是json,即所有的http请求只接收json格式的响应,并且不在服务器端呈现任何html。所有表单帖子都将表单数据转换为json对象,然后将其作为字符串发布。所有渲染都是由客户端javascript完成的。

我知道这种方法的一个缺点是没有javascript的浏览器无法对这种架构做很多事情,但是网站上的交互非常丰富,无论如何都对非JavaScript浏览器毫无用处。

这种设计Web应用程序的方法还有其他缺点吗?

4 个答案:

答案 0 :(得分:16)

这是一种越来越常见的模式,使用GWT和ext-js等工具。像GMail这样的复杂网络应用程序已经有超过90%的JS创建DOM一段时间了。如果您正在开发一个传统的“期刊”类型的网站,主要是要阅读的书面内容,这种方法将是过度的。但对于希望避免页面刷新的复杂应用程序,它可能是合适的。

一个缺点是,它不仅需要支持JavaScript的浏览器,而且应用程序所需的计算资源也很容易爬到需要相当强大的浏览器的程度。如果您在顶级PC上使用Chrome进行开发,您可能会在功能较弱的计算机(如上网本或移动设备)上运行应用程序,并发现它已经变得非常缓慢。

另一个缺点是你在页面上工作时失去了使用HTML工具的机会,并且在Firebug或Chrome开发者工具下查看应用程序页面的DOM树可能很难,因为元素和代码之间的关系可能不是要清楚。

编辑:要考虑的另一件事是,让页面更易于访问是更多的工作,因为可能必须添加键盘快捷键(您可能无法使用此处内置的浏览器)和有特殊需求的用户可能发现改变应用程序外观更加困难,例如增加字体大小。

另一个编辑:现在不太可能搜索引擎成功抓取您网站上的文字内容。因此,您有时会看到服务器创建的仅文本页面表示相同的内容,这些页面将浏览器引用到启用JS的页面版本。

答案 1 :(得分:5)

除了你指出的问题,还有另外一个:速度。但这不一定是一个大问题,实际上使用JSON而不是HTML可能(通过较慢的连接)改善而不是阻碍速度。

Web浏览器经过高度优化,可以呈现HTML,包括整个页面(例如,通常)和片段(例如innerHTML及其各种包装器,如jQuery的html或Prototype的{{1} })。您可以做很多事情来最小化处理返回数据和渲染结果的速度影响,但是没有什么能够像从服务器获取某些HTML标记并将其转储到其中一样快 用于显示的浏览器。

现在,那说,它根本不一定是问题。如果您使用有效的技术(一些注释in this article),并且如果您主要通过构建HTML字符串来呈现结果,那么您将转移给浏览器(再次,通过update或包装器为它),或者如果你一次只渲染几个元素,那么速度差异就不大可能存在。

相反,如果通过DOM API或包装器创建和附加单个元素来构建实质树,则很可能会注意到性能影响。 似乎是正确的事情,但它涉及到跨DOM / JavaScript边界的大量旅行,这意味着浏览器必须在所有中间步骤中向您的代码提供DOM版本的东西;相比之下,当你把它变成一个HTML字符串时,它可以完成它的事情,并全速前进。您可以在this performance test中看到差异。这很重要。

由于线路尺寸较小,如果JSON数据比HTML更紧凑,速度影响可以弥补甚至克服,可以弥补甚至克服速度影响。

答案 2 :(得分:5)

当您构建类似这样的东西时,您必须更加关注高延迟,低带宽连接。可能的情况是,您将要进行大量的Ajax调用以同步数据并从服务器获取新数据,如果存在大量延迟,则滞后可能会很明显。您需要制定策略,以便让用户了解客户端和服务器之间的任何通信进度。

在开发过程中,这是一件可以忽略的事情,特别是如果您正在使用本地Web服务器,但它可能会在生产中成为杀手锏。这意味着要研究预取和缓存策略。

您还需要一种有效的方法来管理HTML片段/模板。显然,有一些很好的模块用于渲染模板--Mustache.js,Underscore模板等 - 但是保持在HTML片段之上可能会导致一些维护问题。我倾向于将HTML模板存储在单独的文件中,并通过Ajax调用动态加载它们(加上缓存以最小化HTTP请求)。

编辑 - 另一个骗局:

数据同步 - 如果您使用服务器数据库作为数据“权限”,那么保持服务器和客户端之间的数据同步非常重要。如果对一个客户端上的数据的更改影响多个客户端,则这更加相关。然后,您将进入处理实时异步更新的领域,这可能会导致一些有趣的概念性挑战。 (幸运的是,使用Socket.IO和Backbone.js之类的框架和库可以让事情变得更容易。)

编辑 - 专业人士:

这种类型的应用程序有一些巨大的优势 - 响应速度更快,并且可以真正增强用户体验。现在可以快速无缝地执行通常需要往返服务器并产生网络开销的微不足道的操作。

此外,它还允许您更有效地将数据耦合到您的视图。如果你在客户端处理数据,你可能会有一个框架,允许你组织数据并使用ORM - 无论是Backbone.js,Knockout.js还是类似的东西。您不再需要担心将数据存储在html属性或临时变量中。一切都变得更易于管理,它为一些非常复杂的UI开发打开了大门。

此外,JavaScript开启了事件驱动交互的可能性,这是高度交互式应用程序的完美范例。通过使用事件循环,您可以将数据直接挂钩到用户启动和自定义事件,这开辟了很多可能性。通过将数据模型直接挂接到用户驱动的事件,您可以稳健地处理数据的更新和更改,并以最小的麻烦呈现适当的输出。而这一切都在高速发生。

答案 3 :(得分:0)

我认为最重要的是你的要求是什么,如果你想构建一个交互式应用程序,给桌面感觉,然后去客户端开发。使用像backbone.js或knockout.js这样的Javascript框架将真正有助于组织和维护代码。优点已在之前的答案中详述。关于服务器端渲染的渲染性能,这里有一个很好的博客文章,它提出了思考。 http://openmymind.net/2012/5/30/Client-Side-vs-Server-Side-Rendering/