构建单页Web应用程序的优缺点


52

我正在为正在进行的辅助项目进行原型设计/概念验证阶段的结尾,并试图决定一些更大的应用程序设计决策。该应用程序是一个专为敏捷开发流程量身定制的项目管理系统。我需要做出的决定之一是是否要使用传统的多页应用程序还是单页应用程序。

目前,我的原型是传统的多页设置,但是我一直在寻找ribs.js来清理某些结构并将其应用于Javascript(jQuery)代码。骨干.js似乎可以在多页应用程序中使用,但在单页应用程序中却更具光芒。我试图提出使用单页应用程序设计方法的优缺点列表。到目前为止,我有:

好处

  • 所有数据都必须通过某种API才能获得-这对我的用例来说是一个很大的优势,因为无论如何我都希望为我的应用程序提供一个API。现在,大约60-70%的我获取/更新数据的调用是通过REST API完成的。做一个单页应用程序将使我可以更好地测试我的REST API,因为应用程序本身将使用它。这也意味着随着应用程序的增长,API本身也将增长,因为这就是应用程序所使用的。无需维护API作为应用程序的附件。

  • 响应速度更快的应用程序-由于将初始页面之后加载的所有数据保持在最低限度并以紧凑格式(例如JSON)进行传输,因此数据请求通常应该更快,并且服务器的处理量会稍少一些。

缺点

  • 代码重复-例如,模型代码。我将不得不在服务器端(在这种情况下为PHP)和Javascript的客户端上创建模型。
  • Java语言中的业务逻辑-我无法给出任何具体示例说明为什么这样做会很糟糕,但是我觉得所有人都可以阅读的Java语言中的业务逻辑对我来说是不合适的。
  • Javascript内存泄漏-由于页面永远不会重新加载,因此可能发生Javascript内存泄漏,而且我什至不知道从哪里开始调试它们。

还有其他一些东西是双刃剑。例如,对于单页应用程序,为每个请求处理的数据可能要少得多,因为该应用程序将要求特定请求所需的最少数据,但是这也意味着可能会有更多的小请求服务器。我不确定这是好事还是坏事。

在决定应该以哪种方式进行项目时,应牢记单页Web应用程序的哪些优点和缺点?


Basecamp,新版本的basecamphq在单页设置IMO方面做得很好。
哈坎·德里亚

您可以使用chrome的堆检查器找到内存泄漏:gent.ilcore.com/2011/08/finding-memory-leaks.html
Joeri Sebrechts

Answers:


17

最大的缺点是客户端必须启用JavaScript,并且必须足够强大才能运行大量的JavaScript。要满足可访问性问题或依赖于解析静态HTML的其他任何内容,也更加困难(尽管了解您的特定API可能比HTML抓取更好)。最后,内存泄漏很容易。

至于复制代码或将业务逻辑放在客户端上,我不确定您需要执行多少操作。如果客户端上的模型是View-Model(一种与UI所见的世界相匹配的模型,而不是业务模型),则将ViewModel与业务模型相匹配的逻辑可以驻留在客户端上,服务器,或两者兼而有之。这取决于您对API包含特定于客户端的外观的感觉,而取决于客户端将UI输入转换为API调用的感觉。

您可能还想看一下kickout.js。我不能说它是否比骨干更好,但它可能更适合您的项目。


是的,我想大多数代码重复都会有数据验证,这很好。我对启用javascript的要求非常满意,因为我不关心该项目的可访问性(例如屏幕阅读器等)。至于我所关心的javascript内存泄漏问题,我的问题评论中提供了链接,这实际上使我否定了(无论如何,chrome是我的主要开发浏览器)。
ryanzec

7

我经常在单页Web应用程序中看到的缺点:

  • 无法链接到网站的特定部分,通常只有1个入口点。
  • 后退和前进按钮失效。
  • 选项卡的使用是有限的或不存在的。

(尤其是移动电话:)

  • 加载时间很长。
  • 根本不起作用。
  • 无法重新加载页面,网络突然中断将您带回到站点的开始。

所有这些都可以解决,但是据我所见,大多数站点构建者都无法解决。


9
1,2和6基本上只是同一问题的症状。创建者不使用历史API /哈希链接。
马丁·汉森

11
这个答案已经过时,大多数单页面应用程序框架都有一种方法来解决上述问题
Luis

@Luis在存在该技术的情况下,经常不使用它。
Pieter B

5

有一个非常重要的客户端永远不会运行Javascript:Google搜寻器(截至2012年)。(我想,Bing也不运行JS。)

您将需要为每个需要索引的页面提供合理的非AJAX版本,或者为需要索引的页面提供链接。

如果您的网站很小,则可以提供一些页面的非常基本的版本,仅用于索引机器人。

如果网站的大多数内容仅用于注册用户,或者由于其他原因而无需编入索引,则可以将整个未编入索引的空间创建为一页应用程序,并使用自己的搜索,二十一点等方法。

如果两者都不是,那么您最好从一开始就开发一个多页面站点,并且仅在不更改页面“通用”的情况下提供AJAX更新。


4
Googlebot现在确实读取甚至执行了一些Javascript。见googlewebmastercentral.blogspot.com/2011/11/...
jfrankcarr

2
对于这个特定问题,它是一个项目管理应用程序。可能不是值得SEO的网站。
约旦

SEO对于大多数页面而言并不是一个大问题,尽管能够对单个问题进行SEO很好,因为可以将其配置为允许匿名访问它(因此,如果用户用谷歌搜索产品所遇到的问题,他们可以在跟踪器中找到与其相关的问题)。
ryanzec 2012年

1
2015年更新:Google 确实执行了JS
rinogo

3

-代码重复-例如,模型代码。我将不得不在服务器端(在这种情况下为PHP)和JavaScript的服务器端创建模型。

您在PHP世界中,但是.NET世界中有一些代码生成策略可用于自动创建JavaScript WCF代理。看这里

我不知道有哪些选项可以不必在PHP应用程序中的JavaScript中自行创建远程对象,但是对于那些用.NET编写单页应用程序的人来说,这是一个选择。


0

选择不必是一个或另一个。例如,JWt是一个Web工具包,它实现了多页网页的完美效果,但它是单页。此外,它将识别没有javascript的Google bot和浏览器(尝试使用),并在检测到它们时切换到传统的多页模型。

简而言之:

  • 无需编写API(但如果需要,您仍然可以)
  • 响应式应用程序:每次用户点击最多需要一次服务器往返(加上获取图像)
  • 没有重复的代码
  • 没有业务逻辑客户端
  • 最小复杂度的客户端
  • 搜索机器人可以将其编入索引

1
JWt是一个Java工具箱。问题是关于PHP的。
Joeri Sebrechts
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.