单页应用程序:优缺点

215

我已经了解了单页应用程序(SPA)及其优点,但我认为其中大部分都不令人信服。有三个优点让我怀疑。

问题:你能够担任SPA的支持者并证明我对前三个陈述是错误的吗?

                              === ADVANTAGES ===

1. SPA非常适合实现高度响应式网站:服务器端渲染很难实现所有中间状态——小的视图状态不易映射到URL。单页应用程序的特点是能够重新绘制UI的任何部分,而无需进行服务器往返以检索HTML。这通过将数据与数据呈现分离来实现,具有处理数据的模型层和读取模型的视图层。 2. 使用SPA,我们不需要向服务器发送额外的查询以下载页面。 3. 可能还有其他优点吗?没有听说过其他的...
                            === DISADVANTAGES ===
  1. 客户端必须启用javascript。
  2. 网站仅有一个入口点。
  3. 安全性。

P.S. 我参与过SPA和非SPA项目的开发。我提出这些问题是因为我想深入了解。并不是要伤害SPA的支持者。请不要要求我阅读更多关于SPA的文章。我只想听听你们对此的考虑。


1
我建议你不要只是阅读有关单页应用程序的内容,而是花些时间去实际使用像extjs这样的框架进行实践。这些时间的投入将会得到回报,你将能够回答自己的问题。 - Wiktor Zychla
3
@WiktorZychla 我正在开发一个SPA项目。我使用JQuery + Backbone。我还编写了一个JSP网站。我无法回答那些问题。你能吗? - VB_
1
关于你提到的缺点,JavaScript 相当广泛地启用(但与任何依赖项一样,了解你的用户是有帮助的),因为安全性是在请求中管理的,所以任何方法之间的安全性都是相同的。SPA仍然是HTTP,只是在每个请求中不需要加载“页面的其余部分”。 - Jason Sperske
3
@VolodymyrBakhmatiuk: 那不重要,用户可能会妥协的是界面而不是数据,因为数据受到服务器端的保护。 - Wiktor Zychla
6
如果这个问题是基于个人观点的,该怎么办?我常常想知道何时以及为什么应该编写单页应用程序(SPA)。如果Stack Overflow也允许“优缺点”类型的问题,那将会很有帮助。 - Anurag Awasthi
显示剩余17条评论
11个回答

149

让我们来看一下最受欢迎的SPA网站之一,GMail。

1. SPA非常适合响应速度非常快的网站:

服务器端渲染不像以前那么困难,采用简单的技术,如在URL中保留“#hash”,或者更近期的HTML5 pushState。采用这种方法,Web应用程序的确切状态嵌入到页面URL中。就像在GMail中,每次打开邮件时,在URL中添加一个特殊的哈希标签。如果将其复制并粘贴到其他浏览器窗口中,可以打开完全相同的邮件(前提是它们可以进行身份验证)。这种方法直接映射到更传统的查询字符串,区别仅在于执行方式。使用HTML5 pushState(),您可以消除#hash并使用完全经典的URL,在第一次请求时可以在服务器上解决,然后在后续请求中通过ajax加载。

2. 使用SPA,我们不需要使用额外的查询向服务器下载页面。

The number of pages a user downloads during their visit to my website is similar to how many emails someone reads when they open their email account. Personally, I read over 50 emails at once and the structure of the emails is almost always the same. If you use a server-side rendering scheme, the server will render it on every request (typical case).
Regarding security concerns, whether or not to keep separate pages for admins/login depends entirely on the structure of your site. Take paytm.com for example. Making a website SPA does not mean that you should open all endpoints for all users. I use forms auth with my SPA website.
In probably the most used SPA framework, Angular JS, the developer can load the entire HTML template from the website depending on the user's authentication level. Pre-loading HTML for all auth types isn't SPA.
Are there any other advantages? I haven't heard of any others.
  • 现在可以安全地假定客户端将使用启用了JavaScript的浏览器。
  • 网站只有一个入口点。正如我之前提到的,维护状态是可能的,您可以拥有任意数量的入口点,但是必须确保有一个入口点。
  • 即使在SPA中,用户也只能看到他拥有适当权限的内容。您不必一次性注入所有内容。异步加载不同的HTML模板和JavaScript也是SPA的有效部分。

我能想到的优点有:

  1. 显然呈现HTML需要一些资源,现在每个访问您网站的用户都要这样做。此外,不仅如此,主要逻辑现在是在客户端而不是服务器端完成。
  2. 日期时间问题 - 我只提供客户端UTC时间以预设格式,并且甚至不关心时区,我让JavaScript处理它。这对于我以前必须根据用户IP推导出的位置猜测时区来说是很大的优势。
  3. 对我而言,在SPA中更容易维护状态,因为一旦设置了变量,就知道它会在那里。这给人一种开发应用而不是网页的感觉。这通常对于像食品熊猫、Flipkart、亚马逊等站点的制作非常有帮助,因为如果您不使用客户端状态,则将使用昂贵的会话。
  4. 网站肯定非常响应 - 我将进行一个极端的例子,尝试在非SPA网站上制作计算器(我知道这很奇怪)。

来自评论的更新

似乎没有人提到套接字和长轮询。如果您从另一个客户端(比如移动应用程序)注销,则您的浏览器也应该注销。如果您不使用SPA,则必须在重定向时重新创建套接字连接。这也应该适用于数据更新,例如通知、配置文件更新等。
另一种观点:除了您的网站外,您的项目是否涉及原生移动应用程序?如果是,您很可能会从服务器(即JSON)向该原生应用程序提供原始数据,并进行客户端处理以呈现它,对吧?因此,基于这个断言,您已经在使用客户端呈现模型。现在问题变成了,为什么不使用相同的模型来处理您的项目的网站版本?这有点显而易见。然后问题就变成了,您是否希望仅为了SEO效益和可共享/可书签的URL而呈现服务器端页面。

4
谢谢你将这个回答变成了社区Wiki,很不错!这些观点也很棒。 - Jason Sperske
@Parv Sharma 如果您能在示例(例如计算器)中解释所有这些内容,包括状态保持、视图渲染、安全等方面,那将非常好。无论如何,感谢您。 - VB_
5
SPA不易于对页面进行SEO优化索引。 - Ankit_Shah55
2
@Ankit_Shah55 这可能不再是真的了(至少对于拥有大部分搜索引擎市场份额的谷歌来说)。请参阅谷歌的“弃用我们的AJAX爬行方案”。我的理解是,您现在不必为了让Google索引您的SPA而做任何特殊的事情。但是,我认为您需要确保支持pushstate,因为我认为谷歌不会索引哈希片段。 - Kevin Wheeler
3
似乎没有人提到套接字和长轮询。如果你从另一个客户端(比如移动应用程序)注销,则你的浏览器也应该注销。如果你不使用单页应用程序,每次重定向时都必须重新创建套接字连接。这也适用于任何数据更新,例如通知、个人资料更新等。 - Taku
显示剩余6条评论

74

我是一个实用主义者,所以我会尝试从成本和收益的角度来看待这个问题。

需要注意的是,对于我提出的任何不利因素,我都认为它们可以解决。这就是为什么我不把任何事情看作是非黑即白的原因,而是考虑成本和收益。

优点

  • 更容易的状态跟踪 - 不需要使用cookie、表单提交、本地存储、会话存储等来记住两个页面加载之间的状态。
  • 每个页面上的样板内容(页眉、页脚、标识、版权横幅等)仅在典型浏览器会话中加载一次。
  • 在切换“页面”时没有额外的延迟。

缺点

  • 性能监控-无法监控: 我看到的大多数基于浏览器的性能监控解决方案仅关注页面加载时间,比如首字节时间、构建DOM的时间、HTML的网络往返时间、onload事件等。通过AJAX更新页面后将无法进行测量。有一些解决方案可以让你对代码进行仪器记录,例如单击链接时启动计时器,然后在呈现AJAX结果后结束计时器并发送反馈。例如,New Relic就支持此功能。通过使用SPA,您已经将自己限制在了只有几种可能的工具。
  • 安全/渗透测试-无法测试: 当整个页面都是由SPA框架动态构建时,自动化安全扫描可能会难以发现链接。这个问题也许有解决方案,但同样地,您也将自己限制了。
  • 打包:很容易陷入这样一种情况:在初始页面加载时下载整个网站所需的所有代码,这对于低带宽连接的性能来说可能非常糟糕。您可以将JavaScript和CSS文件捆绑在一起,尝试按需加载更多的内容,但现在您需要维护该映射,并注意避免因未实现的依赖关系而导致不必要的文件被拉入(我就碰到过这种情况)。同样地,这是可以解决的,但需要付出一定代价。
  • 大爆炸重构:如果您要进行重大架构更改,比如从一个框架切换到另一个框架,为了最小化风险,建议进行渐进式更改。也就是说,开始使用新的框架,按页面、按功能等基础来逐步迁移,然后再弃用旧的框架。对于传统的多页面应用程序,您可以将一个页面从Angular切换到React,然后在下一个迭代中切换另一个页面。但是对于单页应用程序(SPA),就必须一次性完成整个应用程序的更改。
  • 导航复杂性:有一些工具可帮助维护SPA中的导航上下文,例如history.js、Angular 2等,其中大多数依赖于URL框架(# )或较新的history API。如果每个页面都是单独的页面,则不需要任何这些工具。
  • 代码理解的复杂性:我们自然地将网站视为页面。多页面应用程序通常按页面对代码进行分区,这有助于可维护性。
  • 同样地,我认识到这些问题都可以通过某种方式解决,只是需要付出一定代价。但是总有一个度,您可能会花费所有时间来解决那些本来可以避免的问题。这又回到了利益和它对您有多么重要的问题。


    2
    我认为这个回答提供了非常有效的反馈,来自一个实际构建了大型复杂系统并经历了SPA带来的长期损失(或看起来是这样)的人。 - DanielCuadra
    4
    这个回答想表达的意思是,如果你在做任何稍微严肃的事情,最好避免使用单页面应用程序(SPA)。 - IvanP
    3
    我同意。当我们进行概念验证时,SPA看起来很棒。现在已经过去三年了,我们遇到了这篇回答中提到的所有问题,并且我们继续花费大量时间来解决它们。框架更改不再是一个选择,我们被困在一个基本停止开发的框架中。 - Qi Fan
    1
    我直接经历了最后4个缺点。我使用Angular、Bootstrap和PHP构建了一个10K LOC的Web应用程序,其中约有5K的Angular JS代码。Angular有一些非常棒的功能,但此时此刻,我真希望我只是采用了传统的基于页面的方法,我认为这将显著加快网站开发的速度。 - Zack Macomber
    1
    @Prometheus 我在应用的 REST API 部分只使用了 PHP(通过 Slim 框架)作为后端。SPA 部分则是使用 Angular 构建的。 - Zack Macomber
    显示剩余3条评论

    42

    缺点

    1. 客户端必须启用JavaScript。 是的,这是SPA明显的缺点。在我的情况下,我知道可以期望我的用户启用JavaScript。如果不能,则无法使用SPA。这就像试图将.NET应用程序部署到未安装.NET Framework的计算机上。

    2. 网站只有一个入口点。 我使用SammyJS解决了这个问题。花费2-3天的时间来正确设置路由,人们就可以创建深链接书签,并且你的服务器只需要公开一个终点 - “给我这个应用程序的HTML + CSS + JS”的终点(将其视为预编译应用程序的下载/更新位置)- 而你编写的客户端JavaScript将处理实际进入应用程序的问题。

    3. 安全性 这个问题并不是SPA特有的,在“老式”客户端-服务器应用程序(使用超文本链接页面之间的HATEOAS模型)中,您必须以完全相同的方式处理安全性。只是用户发出请求而不是你的JavaScript,并且结果是HTML而不是JSON或某种数据格式。在非SPA应用程序中,您必须在服务器上保护单个页面,而在SPA应用程序中,您必须保护数据端点。(如果您不希望客户端访问所有代码,则还必须将可下载的JavaScript拆分为单独的区域。 我只是将其绑定到基于SammyJS的路由系统中,因此浏览器仅请求客户端知道它应该访问哪些内容(根据用户角色的初始加载),然后这将成为一个非问题。)

    优点

    1. 单页应用程序(SPA)的主要架构优势之一(很少被提到),在许多情况下是大大减少您的应用程序的“通信量”。如果您正确设计它以在客户端上处理大部分处理过程(毕竟这是整个重点),那么向服务器发出请求的数量(读作“可能破坏用户体验的503错误”)将大大减少。实际上,SPA使得完全离线处理成为可能,在某些情况下非常重要。

    2. 如果你做得好,客户端渲染的性能肯定更好,但这并不是建立SPA最有说服力的原因。(毕竟网络速度正在改善)。不要仅基于这个理由去建立SPA。

    3. 另一个我发现的主要优势是界面设计的灵活性。一旦我定义了我的API(带有JavaScript的SDK),我就可以完全重写我的前端而对服务器只有一些静态资源文件产生影响。试着用传统的MVC应用程序做到这一点吧!:)(当您需要考虑API的版本一致性和实时部署时,这变得非常有价值。)

    4. 所以,最终结论是:如果您需要离线处理(或至少希望客户端能够在偶尔的服务器故障中生存) - 大大减少自己的硬件成本 - 并且可以使用JavaScript和现代浏览器,则需要SPA。在其他情况下,它更多是一种权衡。


    6
    另一个优点是单页应用可以在iOS上被保存为书签(“添加到主屏幕”),并以全屏模式打开(假设您定义了正确的元标记),让它感觉像本地应用而不是网页。 - Strille
    9
    在传统的MVC应用程序中,也同样容易实现。如果您使用相同的数据,则只需在应用程序的V(视图)部分进行更改。这通常涉及到模板、CSS和JS。 - karantan
    单页应用程序版的 Stack Overflow 是否可以有链接到单个问题以进行分享,或者它会带来什么优缺点,例如在搜索引擎优化方面(过去问题的可搜索性)? - sçuçu
    6
    我看到的大多数SPA应用程序比服务器端应用程序更喜欢聊天。你不是通过单个请求获取数据,而是每页向服务器发送更多的请求。 - Matthew Whited

    30

    SPA的一个主要缺点是SEO。最近Google和Bing开始通过执行JavaScript来索引基于Ajax的页面,但在许多情况下仍然会将页面索引错误。

    在开发SPA时,您将被迫处理SEO问题,可能是通过后渲染整个站点并创建静态HTML快照供爬虫使用。这将需要对适当的基础设施进行坚实的投资。

    更新19.06.16:

    自从我写下这篇答案以来,我对单页应用程序(即AngularJS 1.x)有了更多的经验 - 所以我有更多的信息可以分享。

    在我看来,SPA应用程序的主要缺点是SEO,使它们仅限于“仪表板”类型的应用程序。此外,与传统解决方案相比,缓存会更加困难。例如,在ASP.NET中,缓存非常容易 - 只需打开OutputCaching即可:整个HTML页面将根据URL(或任何其他参数)进行缓存。但是,在SPA中,您需要自己处理缓存(使用一些解决方案,如二级缓存,模板缓存等)。


    将流量转发到单个页面还是分散到几个页面,对于SEO来说哪种更好? - SILENT
    @SILENT - 不确定,但由于所有页面都在同一个域上,我认为不应该有任何区别。 - Illidan
    我不理解关于SEO的争论。你不能在SPA中定义相同的路由,同时也在服务器端定义,这样搜索引擎爬虫就可以轻松地爬取你的网站,同时人们也可以获得直接指向你内容的URL。因此,你可能需要维护两套模板,但这有什么大不了的。如果这是一个问题,你可以尝试使用通用模板。 - Kalnode
    @火星与返回:不确定您所说的服务器链接是指哪些。如果您是指站点地图,那对于单页应用程序来说是无用的:搜索引擎不会执行JavaScript(至少几年前是这样),它们只会下载和解析HTML。因此,即使您准备了站点地图,页面也将无法正确构建。 - Illidan

    15

    我认为SPA最适合数据驱动的应用程序。当然,像Gmail这样的应用程序全部围绕数据展开,因此是SPA的一个好选择。

    但如果您的页面主要用于显示,例如服务条款页面,那么SPA就完全是杀鸡焉用牛刀了。

    我认为最好的方案是在网站中混合使用SPA和静态/MVC风格的页面,具体取决于页面的特定需求。

    例如,在我正在构建的一个网站上,用户会首先看到标准的MVC索引页面。但是当他们进入实际应用程序时,就会调用SPA。另一个优点是SPA的加载时间不在主页上,而是在应用程序页面上。SPA加载时间在主页上可能会干扰首次访问网站的用户。

    这种情况有点像使用Flash。经过几年的经验积累,由于负载因素,仅使用Flash的网站数量已经接近于零。但作为页面组件,它仍在使用中。


    1
    多年的网站开发经验告诉我,你应该将SPA和MVC应用程序混合使用。不能只有一个答案。我曾经把整个应用程序都做成了SPA,但后来发现谷歌没有正确地列出我的应用程序。因此,我转向了MPA,并仅在必要情况下使用SPA。WordPress也不是SPA,但它是一个流行的框架,有很多好的理由。 - Rudolf Schmidt
    1
    这也是我的方法。我把SPA作为用户快速浏览搜索结果的主要区域,无论是在地图上还是动态列表中。然后,在查看详细信息时,这些详细信息会作为标准的服务器呈现的页面打开。我的路由既可以在SPA内部工作,也可以作为首次加载服务器路由。我复制了模板代码和路由代码,但我不太关心,这是必要的恶。 - Kalnode

    9
    对于像 Google、Amazon 等公司来说,他们的服务器在24/7模式下运行,减少流量意味着节约成本——减少硬件、能源和维护成本。将 CPU 使用从服务器转移到客户端是值得的,单页应用程序表现出色。优点远远超过缺点。因此,SPA还是非SPA取决于具体使用情况。
    另外,提到了一个可能对Web开发人员不太明显的 SPA 使用案例:我目前正在寻找一种在嵌入式系统中实现 GUI 的方式,基于浏览器的架构似乎很有吸引力。传统上,嵌入式系统中的UI选择很少——Java、Qt、wx等或专有商业框架。几年前,Adobe尝试通过Flash进入市场,但似乎并不成功。
    如今,“嵌入式系统”与数年前的大型机一样强大,连接到控制单元的基于浏览器的UI是一种可能的解决方案。优势在于可以免费使用大量的UI工具(例如,Qt每个销售单位需要支付20-30美元的版税费用以及每位开发人员3000-4000美元的费用)。
    对于这种架构,SPA提供了许多优点——例如,对于桌面应用程序开发人员来说,更熟悉的开发方法,减少服务器访问(在汽车行业中,UI和系统混杂是分别作为硬件的,系统部分具有实时操作系统)。由于唯一的客户端是内置浏览器,因此不再考虑JS可用性、服务器端日志记录、安全性等缺点。

    1
    亚马逊并不太担心带宽或请求计数。每个页面大约为10MB,超过200个请求。 - Matthew Whited

    3

    缺点: 技术上,SPA的设计和初始开发是复杂的,可以避免。不使用这个SPA的其他原因可能包括:

    • a) 安全性:与传统页面相比,单页应用程序由于跨站脚本(XSS)而不太安全。
    • b) 内存泄漏:JavaScript中的内存泄漏甚至会导致强大的计算机变慢。因为传统网站鼓励在页面之间导航,所以任何由前一页引起的内存泄漏几乎都被清除了,留下很少的残留物。
    • c) 客户端必须启用JavaScript才能运行SPA,但在多页面应用程序中可以完全避免JavaScript。
    • d) SPA增长到最佳大小,导致等待时间过长。例如:在较慢的连接上使用Gmail。

    除了以上缺点外,其他架构限制还包括导航数据丢失,在浏览器中没有导航历史记录以及使用Selenium进行自动化功能测试的困难。

    此链接说明了单页应用程序的优缺点。


    12
    这是错误的。a) XSS 对于服务器生成的页面和客户端生成的文档同样容易受到影响。我认为在服务器端更容易受到影响,因为客户端有非常简单和有效的XSS缓解解决方案。如果你不想允许XSS攻击,请不要将用户提交的内容解释为HTML。任何合格的程序员都可以处理这个问题。使用任何可用的技术(pushState、哈希路由等)都可以轻松进行导航。对于一个正确构建的SPA,AFT与任何其他Web应用程序完全相同。你的回答总结就是你不知道如何为客户端构建应用程序。 - Jason Miller
    @JasonMiller:同意。我刚意识到摘要并不是整篇博客的全部内容。我会对其进行修改。谢谢。 - Vish
    6
    点a和点b完全无效。它们更多与糟糕的编程有关,而不是单页面应用程序的特性,传统网站也同样可能存在这些问题;即使您没有编写JS代码,XSS漏洞也可能影响您的网站。服务器端和客户端一样都可能出现内存泄漏。至于点c,如今禁用JavaScript的人很可能会发现在使用Web时会遇到很大问题,这在我看来不是一个问题。 - garryp

    3

    2. 使用SPA,我们不需要使用额外的服务器查询下载页面。

    虽然我还有很多要学习,但自从我开始了解SPA以来,我就喜欢它们。

    这一点可能会产生巨大的差异。

    在许多非SPA的Web应用程序中,您会发现它们仍然通过发出ajax请求来检索和添加内容到页面。因此,我认为SPA更进一步考虑:如果使用ajax检索并显示的内容是整个页面?而不仅仅是页面的一小部分呢?

    让我举个例子。假设您有两个页面:

    1. 产品列表页
    2. 查看特定产品详细信息的页面

    考虑您是否在列表页面上。那么您单击产品以查看详细信息。客户端应用程序将触发2个ajax请求:

    1. 请求获取包含产品详细信息的json对象
    2. 请求获取将插入产品详细信息的html模板

    然后,客户端应用程序将数据插入html模板并显示它。

    然后,您返回到列表(没有请求!)并打开另一个产品。这次,只需要一个ajax请求即可获取产品详细信息。html模板将保持不变,因此您无需再次下载。

    您可能会说,在非SPA中,当您打开产品详细信息时,只会进行1个请求,在这种情况下我们做了2个。是的。但是从总体上看,您会获得收益,因为在跨多个页面导航时,请求的数量将更少。客户端和服务器之间传输的数据也将更少,因为html模板将被重用。此外,您无需在每个请求中下载所有页面中存在的css、图像和javascript文件。

    另外,让我们考虑您的服务器端语言是Java。如果分析我提到的两个请求,其中一个下载数据(您不需要加载任何视图文件并调用视图渲染引擎),而另一个下载静态html模板,因此您可以拥有一个HTTP Web服务器,可以直接检索它,而无需调用Java应用程序服务器,不执行任何计算!

    最后,大型公司正在使用SPA:Facebook、GMail、Amazon。他们不开玩笑,他们有最优秀的工程师在研究所有这些。因此,如果您看不到优势,您可以最初信任他们,并希望未来发现它们。

    但是,使用良好的SPA设计模式很重要。您可以使用AngularJS等框架。不要尝试在不使用良好设计模式的情况下实现SPA,因为您可能最终会混乱不堪。


    1
    Facebook不是单页应用程序(SPA),实际上是多页应用程序(MPA)样式的应用程序,他们在评论、聊天等方面使用ReactJS。 Instagram是启用PWA的完整SPA页面的良好示例。同样适用于Amazon、Youtube,它们都是MPA应用程序。 - Peter Húbek

    1
    我知道这是一个老问题,但我想补充一下单页应用程序的另一个缺点:
    如果您构建一个返回数据语言(如XML或JSON)而不是格式化语言(如HTML)结果的API,则可以实现更大的应用程序互操作性,例如在企业对企业(B2B)应用程序中。这种互操作性具有巨大的好处,但确实允许人们编写软件来“挖掘”(或窃取)您的数据。这个特定的缺点适用于使用数据语言的所有API,而不是一般的单页应用程序(实际上,要求服务器提供预渲染的HTML的SPA可以避免这种情况,但代价是模型/视图分离差)。可以通过各种手段来减轻由此缺点暴露出来的风险,例如请求限制和连接阻止等。

    2
    1.) 没有API并不意味着不能挖掘HTML页面。 2.) 您可以在一定程度上防止API的滥用。 3.) 通过拥有API,您不仅可以轻松构建网页,还可以在其之上构建移动应用程序,我认为这远远超过了任何缺点。 - Jan Kalfus
    1
    1. 我并没有说非 API 会防止数据挖掘。我只是说 API 可以让数据挖掘更容易。
    2. 这就是我上一句话所解决的问题。
    3. 拥有 API 有很多优点,对于我通常遇到的大多数用例,我个人更喜欢 API/SPA 的组合。然而,我只想在列表中添加一个缺点(回想起来,我应该将其添加为评论而不是完整答案)。
    - magnus
    抱歉,如果我没有误解的话,你并没有说“这种互操作性有很大的好处,但确实允许人们编写软件来“挖掘”(或窃取)你的数据。”。如果我稍微改变一下你的句子,我也可以说“网站允许人们编写软件来“挖掘”(或窃取)你的数据。”并且是正确的。现在我不是说你的想法是错误的,我同意挖掘更容易,我只是说这不是你所写的内容 ;) - Jan Kalfus
    1
    同意。它不够清晰。嵌入HTML的数据是可挖掘的。嵌入JSON/XML等的数据也是可挖掘的,只是更容易。 - magnus

    1
    尝试在未定义如何处理服务器端的安全性和API稳定性之前,不要考虑使用单页应用程序。然后,您将看到使用单页应用程序的一些真正优点。具体来说,如果您使用实现OAUTH 2.0进行安全性的RESTful服务器,则可以实现两个基本关注点的分离,从而降低开发和维护成本。
    这将将会话(及其安全性)移至SPA,并使您的服务器免除所有这些开销。
    您的API将变得稳定且易于扩展。
    暗示了早期,但没有明确说明;如果您的目标是部署Android和Apple应用程序,则编写一个JavaScript SPA,由本机调用包装以在浏览器(Android或Apple)中托管屏幕,可以消除维护Apple代码库和Android代码库的需要。

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