让我们来看一下最受欢迎的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的有效部分。
我能想到的优点有:
- 显然呈现HTML需要一些资源,现在每个访问您网站的用户都要这样做。此外,不仅如此,主要逻辑现在是在客户端而不是服务器端完成。
- 日期时间问题 - 我只提供客户端UTC时间以预设格式,并且甚至不关心时区,我让JavaScript处理它。这对于我以前必须根据用户IP推导出的位置猜测时区来说是很大的优势。
- 对我而言,在SPA中更容易维护状态,因为一旦设置了变量,就知道它会在那里。这给人一种开发应用而不是网页的感觉。这通常对于像食品熊猫、Flipkart、亚马逊等站点的制作非常有帮助,因为如果您不使用客户端状态,则将使用昂贵的会话。
- 网站肯定非常响应 - 我将进行一个极端的例子,尝试在非SPA网站上制作计算器(我知道这很奇怪)。
来自评论的更新
似乎没有人提到套接字和长轮询。如果您从另一个客户端(比如移动应用程序)注销,则您的浏览器也应该注销。如果您不使用SPA,则必须在重定向时重新创建套接字连接。这也应该适用于数据更新,例如通知、配置文件更新等。
另一种观点:除了您的网站外,您的项目是否涉及原生移动应用程序?如果是,您很可能会从服务器(即JSON)向该原生应用程序提供原始数据,并进行客户端处理以呈现它,对吧?因此,基于这个断言,您已经在使用客户端呈现模型。现在问题变成了,为什么不使用相同的模型来处理您的项目的网站版本?这有点显而易见。然后问题就变成了,您是否希望仅为了SEO效益和可共享/可书签的URL而呈现服务器端页面。