为什么我们需要单页应用程序?

45

单页面应用程序(SPA)已经出现了。 伴随着它的还有很多新的东西,如路由,客户端页面生命周期,MVC模式,MVVM模式,MV *模式等,一些Javascript模式也出现了,如AMD模式SingletonFacade等。

许多单页应用程序框架和库也得到了开发。我们可以在互联网上找到一些。它们包括AngularJsReactjsBackboneJsDurandalJs等,还有很多第三方组件,如RequireJsAmplifyjsBreezeJs,可以使JavaScript编码更加容易... 但我认为为什么我们需要SPA?因为它似乎在开发Web应用程序时引入了一些新的复杂事物。尽管有SPA,我们仍然可以使用传统的Web应用程序,每个请求都加载页面。我只看到一个好处,就是我们可以轻松地在移动设备上运行它,并适应新的Web应用程序开发趋势。能否有人更清楚地解释一下?
如果我们使用许多第三方组件来构成一个单页应用程序,那么这是否会使得这个Web应用程序具有一致性?我认为这将使得在我们的Web应用程序内维护大量组件变得复杂。您对此有何看法?欢迎提出所有建议。

3
你是否能够缩小你的问题范围?你在这里问了多个问题,其中大部分都相当主观。因此,你的问题很可能会被关闭。如果你有一个可以客观回答的具体问题,请编辑此问题以表达出来。 - Ben McCormick
“白屏、滚动到顶部、在移动射频上等待5秒钟” 是一种失败的用户体验。您会失去用户的关注、销售额,并浪费您试图打动的人们的时间。现今的网站非常复杂,使用单页应用程序则无需重新解释css、字体等。拥有重试逻辑也很不错。 - user1212212
许多单页应用框架......我认为主要的是AngularJS,而其他的框架加起来的市场份额还不到AngularJS单独的市场份额。如果您想学习单页应用程序,特别是使用AngularJS,请查看此教程 - Alex
1个回答

41

我认为考虑到用户现在使用的设备数量以及每个设备的能力和限制,大多数网站应该朝着这个方向发展。


重要提示:

在阅读本文其余部分之前,请理解此概念是建立在基本的网络设计原则基础上的。为了为所有设备和情况设计单页应用程序,它不能仅作为单页应用程序运行。您必须构建一个基础,该基础将适用于具有高度有限功能的最基本浏览器,并根据其设备的能力增强用户体验。

这可能会给您带来更多工作量,但您将能够满足更广泛、多样化的受众,这比仅针对现代桌面或手机浏览器构建的 Web 应用程序更令人印象深刻。



减少加载时间和/或重量

单页应用程序更能够减少页面的加载时间和从服务器到客户端的数据传输量。

这种方法影响最大的一些功能包括:

  • 一旦加载完成全局功能,就将其存储下来
  • 允许更容易地在页面之间传输数据和更复杂的用户界面
  • 在您只需要特定组件时,消除了后台提交后重新加载整个页面的成本

增加过度复杂化的可能性

这种设计方法可能会导致开发人员变得懒惰,并且会给最终用户带来更多干扰。 作为开发人员,请确保您的用户界面做好其工作(获取、显示并提交到服务器),并确保服务器做好其工作(提供、验证并提交到数据库)。大多数最终用户不会使用javascript文件中的信息来破坏您的系统,但是在我的意见中,包含有关数据结构的信息是在招惹麻烦。

从强大的架构开始!

与任何网页一样,可以将数据处理直接移动到服务处理程序中,而不是页面中,这可能导致一个利用以下层的体系结构:

  • 数据库(数据存储)
  • BL(数据处理和传输)
  • 用户界面(数据显示和用户交互)

页面处理的服务

在我的看法中,使用服务是网站中组织良好、模块化代码的基本要求。回溯兼容网站中使用的标准获取和提交方法也可以使用这些服务来命中表示业务对象的服务,而不是命中页面。这使得您的代码能够在涉及相同对象的模块间更为通用。

然后更新单页应用程序变得简单,因为您可以初始化任何 UI 来使用 AJAX 方法拾取获取或提交方法并执行它们,而不是为事件导致后退提交,从而实现单个页面实例。

使用这些服务处理 UI 事件的副作用是,除了生命周期事件外,消除了代码后台文件中事件处理的需要。生命周期事件对于根据情况处理和修改相关数据以显示以及修改返回的 HTML 以减轻用户设备的负荷是有用的。

延迟加载!

任何复杂的网站都将具有复杂的模块和大量独特的组件。

使用单页应用程序带来的好处是,您可以选择将加载时间延迟到 Ajax 过程,并在您喜欢的任何应用程序部分(即首次尝试使用模块、初始页面加载后的闲置时间等)中这样做,从而使初始加载更快,处理时间更可控。

我的最佳实践清单

至于最佳实践...有相当多的优化可以和应该对设计进行,以使用这种方法,例如:

  • 随着信息到来时存储信息,在不再相关时淘汰信息
  • 仅在需要时通过 AJAX 加载脚本、HTML 和 JS 文件
  • 如果可能的话,将在一个页面上加载的数据用于另一个页面,而不是为每个新“页面”重新加载
  • UI 的极简数据结构,因为它是一种用于显示而非处理的手段。
  • 不要过分关注UI上的验证,因为你的服务应该已经构建了对提交的所有信息进行验证的功能
  • 这些优化对于加载时间、数据处理和对象关联都很有帮助。显然这不是一个完整的清单,但它是构建单页面应用程序的良好起点。

    最后,我建议研究“为一网站设计”概念,以帮助建立坚实的基础。之后,其余的相对简单的增强就可以了。(提示:其中一种增强是捕获所有导致回发的操作,并使用这些信息构建异步调用)。

    这方面有各种各样的信息,以及各种库可以使用,但我建议尽可能使用自己的代码来实现基本功能并且研究解决你问题的库代码而不是尝试实现具有通用库代码的复杂系统。使用他们的代码作为示例可能会导致更小的开销和更强大的代码,适合你特定的情况。

    祝你好运!


    3
    加载时间: 听说过5G和4G吗?花费数周的时间微调加载时间可能几乎没什么回报。听说过http 2吗?通用服务: 它应该一直保持这样。唯一的区别在于,单页应用程序来回发送json数据。但最终您还是需要使用JavaScript框架来渲染页面。这就是通用性所在。但是:发生在客户端的页面渲染成本较高。服务器的计算成本较低。具有巨大流量的重型应用程序可以更节省成本。这是确定的。 - Toskan
    2
    我同意这些说法。如果您有任何评论,可以在我的经验基础上改进此答案,我将非常感激。就个人而言,我对4G或5G的了解不够深入,也没有足够的优化经验来进一步添加。 - Brett Weber
    4
    @Toskan:这不是绝对的。CPU速度、计算机内存和网络速度一直在快速增长,也许每几年翻一番,但人类对计算机施加的负载也在同步增加。谈到可用的并发硬件时,单页面应用仍然有所区别,并且提供更好的用户体验。总的来说,在MVC架构中,随着浏览器越来越成熟和客户端机器速度变得更快,更多的任务正在转向客户端。 - gm2008
    3
    @ gm2008,请引用一份参考文献,证明单页面应用程序能够提供更好的用户体验。在我看来,用户甚至不会意识到差异。http://ux.stackexchange.com/questions/61013/are-one-page-web-apps-always-better - Toskan
    3
    一个很好的例子可能是Gmail。您开始写一封电子邮件,例如点击“撰写”,然后开始写作。在文本正文中输入文本。现在点击“已发送邮件”或类似的链接。当页面正在加载时,点击文本内部的文本正文。您会意识到加载仅发生在收件箱中,但不影响撰写电子邮件部分。这种行为可能是单页应用程序(SPA)可以得分的地方。 - Toskan
    显示剩余5条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接