javascript - 单页应用程序 : advantages and disadvantages

标签 javascript architecture client-side single-page-application

我读过 SPA 及其优势。我发现他们中的大多数都没有说服力。有 3 个优点引起我的怀疑。

问题: 您能否作为 SPA 的倡导者并证明我对前三个陈述的看法是错误的?

                              === ADVANTAGES ===

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

Server-side rendering is hard to implement for all the intermediate states - small view states do not map well to URLs.

Single page apps are distinguished by their ability to redraw any part of the UI without requiring a server roundtrip to retrieve HTML. This is achieved by separating the data from the presentation of data by having a model layer that handles data and a view layer that reads from the models.

为非 SPA 保留模型层有什么问题? SPA 是唯一与客户端 MVC 兼容的架构吗?

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

哈,用户在访问您的网站时可以下载多少页?二三?相反,会出现另一个安全问题,您需要将登录页面、管理页面等分成单独的页面。反过来,它与 SPA 架构冲突。

3.可能还有其他优势吗?没有听到任何其他的消息..

                            === DISADVANTAGES ===
  1. 客户端必须启用 javascript。
  2. 网站只有一个入口点。
  3. 安全性。

P.S.我从事过 SPA 和非 SPA 项目。我问这些问题是因为我需要加深理解。无意伤害SPA支持者。不要让我阅读更多关于 SPA 的内容。我只是想听听你对此的看法。

最佳答案

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

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

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

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

用户在访问我的网站期间下载的页面数??当他/她打开他/她的邮件帐户时,确实有多少邮件被阅读。我一口气读了> 50。现在邮件的结构几乎相同。如果您将使用服务器端呈现方案,则服务器将在每个请求上呈现它(典型情况)。 - 安全问题 - 您应该/不应该为管理员/登录保留单独的页面,这完全取决于您网站的结构,例如 paytm.com 也制作网站 SPA 并不意味着您打开所有端点的所有端点用户 我的意思是我在我的水疗网站上使用表单例份验证。 - 在可能最常用的 SPA 框架 Angular JS 中,开发人员可以从网站加载整个 html 寺庙,因此可以根据用户身份验证级别来完成。为所有身份验证类型预加载 html 不是 SPA。

3.可能还有其他优势吗?没有听到任何其他消息..

  • 如今,您可以放心地假设客户端将拥有启用 javascript 的浏览器。
  • 网站只有一个入口点。正如我之前提到的,状态维护是可能的,您可以根据需要拥有任意数量的入口点,但您肯定应该拥有一个。
  • 即使是 SPA 用户,也只能查看他拥有的适当权限。您不必一次注入(inject)所有东西。加载 diff html 模板和 javascript 异步也是 SPA 的有效部分。

我能想到的优点是:

  1. 渲染 html 显然需要一些资源,现在每个访问您网站的用户都在这样做。不仅渲染主要逻辑现在在客户端而不是服务器端完成。
  2. 日期时间问题 - 我只是给客户端 UTC 时间是一种预设格式,甚至不关心我让 javascript 处理它的时区。这对于我必须根据从用户 IP 派生的位置来猜测时区来说是一个很大的优势。
  3. 对我来说,状态在 SPA 中维护得更好,因为一旦你设置了一个变量,你就知道它会在那里。这给人一种开发应用程序而不是网页的感觉。这通常有助于制作像 foodpanda、flipkart、amazon 这样的网站。因为如果您不使用客户端状态,那么您正在使用昂贵的 session 。
  4. 网站肯定 react 灵敏 - 我将举一个极端的例子,尝试在非 SPA 网站中制作计算器(我知道这很奇怪)。

评论更新

It doesn't seem like anyone mentioned about sockets and long-polling. If you log out from another client say mobile app, then your browser should also log out. If you don't use SPA, you have to re-create the socket connection every time there is a redirect. This should also work with any updates in data like notifications, profile update etc

An alternate perspective: Aside from your website, will your project involve a native mobile app? If yes, you are most likely going to be feeding raw data to that native app from a server (ie JSON) and doing client-side processing to render it, correct? So with this assertion, you're ALREADY doing a client-side rendering model. Now the question becomes, why shouldn't you use the same model for the website-version of your project? Kind of a no-brainer. Then the question becomes whether you want to render server-side pages only for SEO benefits and convenience of shareable/bookmarkable URLs

关于javascript - 单页应用程序 : advantages and disadvantages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862054/

相关文章:

authentication - RESTful HTTP : Showing different representations to two users on the same URI

.net - 建模松散耦合的域模型

php - 我正在尝试找出合适的 CSS 以使此代码适用于网站上的 Facebook 提要

javascript - extjs 组合框

ios - MVVM 通用网络架构

web-services - 使用 SharePoint 客户端对象模型或 Web 服务访问列表项的属性包

javascript - 利用 JavaScript 的 eval() 方法

client-side - 如何使用grunt.js验证HTML/CSS文件?

javascript - 简单的股票代码 (jQuery)

javascript - 为什么我得到 : Uncaught SyntaxError: Unexpected token ILLEGAL here