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

问:你能作为SPA的倡导者,证明我的前三个陈述是错误的吗?

                              === ADVANTAGES ===

1. SPA非常适合响应性非常强的网站:

服务器端呈现很难为所有的中间体实现 状态——小视图状态不能很好地映射到url。 单页应用程序的特点是它们能够重绘任何部分 的UI,而不需要服务器往返检索HTML。这 是通过将数据与数据的表示分开来实现的 拥有处理数据的模型层和读取数据的视图层 从模型中。

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

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

哈,用户在访问你的网站时可以下载多少页面?2、3 ?相反,出现了另一个安全问题,你需要把你的登录页面,管理页面等分开到单独的页面。反过来,它又与SPA体系结构冲突。

3.还有其他的优势吗?别再听别人说了。

                            === DISADVANTAGES ===

客户端必须启用javascript。 只有一个入口。 安全。

附注:我做过SPA项目和非SPA项目。我问这些问题是因为我需要加深我的理解。没有伤害七党联盟支持者的意思。不要让我读更多关于SPA的东西。我只是想听听你对此的看法。


当前回答

我知道这是一个老问题,但我想补充单页应用程序的另一个缺点:

If you build an API that returns results in a data language (such as XML or JSON) rather than a formatting language (like HTML), you are enabling greater application interoperability, for example, in business-to-business (B2B) applications. Such interoperability has great benefits but does allow people to write software to "mine" (or steal) your data. This particular disadvantage is common to all APIs that use a data language, and not to SPAs in general (indeed, an SPA that asks the server for pre-rendered HTML avoids this, but at the expense of poor model/view separation). This risk exposed by this disadvantage can be mitigated by various means, such as request limiting and connection blocking, etc.

其他回答

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

请注意,对于我给出的任何缺点,我都认识到它们是可以解决的。这就是为什么我不把任何事情看得非黑即白,而是成本和收益。

优势

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

缺点

Performance monitoring - hands tied: Most browser-level performance monitoring solutions I have seen focus exclusively on page load time only, like time to first byte, time to build DOM, network round trip for the HTML, onload event, etc. Updating the page post-load via AJAX would not be measured. There are solutions which let you instrument your code to record explicit measures, like when clicking a link, start a timer, then end a timer after rendering the AJAX results, and send that feedback. New Relic, for example, supports this functionality. By using a SPA, you have tied yourself to only a few possible tools. Security / penetration testing - hands tied: Automated security scans can have difficulty discovering links when your entire page is built dynamically by a SPA framework. There are probably solutions to this, but again, you've limited yourself. Bundling: It is easy to get into a situation when you are downloading all of the code needed for the entire web site on the initial page load, which can perform terribly for low-bandwidth connections. You can bundle your JavaScript and CSS files to try to load in more natural chunks as you go, but now you need to maintain that mapping and watch for unintended files to get pulled in via unrealized dependencies (just happened to me). Again, solvable, but with a cost. Big bang refactoring: If you want to make a major architectural change, like say, switch from one framework to another, to minimize risk, it's desirable to make incremental changes. That is, start using the new, migrate on some basis, like per-page, per-feature, etc., then drop the old after. With traditional multi-page app, you could switch one page from Angular to React, then switch another page in the next sprint. With a SPA, it's all or nothing. If you want to change, you have to change the entire application in one go. Complexity of navigation: Tooling exists to help maintain navigational context in SPA's, like history.js, Angular 2, most of which rely on either the URL framework (#) or the newer history API. If every page was a separate page, you don't need any of that. Complexity of figuring out code: We naturally think of web sites as pages. A multi-page app usually partitions code by page, which aids maintainability.

我再次承认,这些问题中的每一个都是可以解决的,只是需要付出一定的代价。 但总有一天,你把所有的时间都花在了解决问题上,而这些问题本来是可以避免的。这又回到了益处以及它们对你的重要性上。

我想说明的是,SPA最适合数据驱动应用程序。gmail当然是关于数据的,因此是SPA的一个很好的候选。

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

我认为最好的地方是拥有一个混合了SPA和静态/MVC样式页面的站点,这取决于特定的页面。

例如,在我正在构建的一个站点上,用户访问了一个标准的MVC索引页。但当它们进入实际应用程序时,它会调用SPA。这样做的另一个好处是,SPA的加载时间不在主页上,而是在应用程序页面上。首页的加载时间可能会让第一次访问网站的用户分心。

这个场景有点像使用Flash。经过几年的经验,由于加载因素,只使用Flash的网站数量几乎为零。但作为页面组件,它仍在使用中。

让我们来看看最流行的SPA网站之一,GMail。

1. SPA非常适合响应性非常强的网站:

Server-side rendering is not as hard as it used to be with simple techniques like keeping a #hash in the URL, or more recently HTML5 pushState. With this approach the exact state of the web app is embedded in the page URL. As in GMail every time you open a mail a special hash tag is added to the URL. If copied and pasted to other browser window can open the exact same mail (provided they can authenticate). This approach maps directly to a more traditional query string, the difference is merely in the execution. With HTML5 pushState() you can eliminate the #hash and use completely classic URLs which can resolve on the server on the first request and then load via ajax on subsequent requests.

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

The number of pages user downloads during visit to my web site?? really how many mails some reads when he/she opens his/her mail account. I read >50 at one go. now the structure of the mails is almost the same. if you will use a server side rendering scheme the server would then render it on every request(typical case). - security concern - you should/ should not keep separate pages for the admins/login that entirely depends upon the structure of you site take paytm.com for example also making a web site SPA does not mean that you open all the endpoints for all the users I mean I use forms auth with my spa web site. - in the probably most used SPA framework Angular JS the dev can load the entire html temple from the web site so that can be done depending on the users authentication level. pre loading html for all the auth types isn't SPA.

3.还有其他的优势吗?别再听别人说了。

现在,您可以放心地假设客户机将拥有支持javascript的浏览器。 网站只有一个入口。正如我之前提到的,状态维护是可能的,你可以有任意数量的入口点,但你应该有一个确定的入口点。 即使在SPA用户只看到他有适当的权利。你不需要一次注射所有的东西。加载不同的html模板和javascript async也是一个有效的SPA的一部分。

我能想到的优点是:

rendering html obviously takes some resources now every user visiting you site is doing this. also not only rendering major logics are now done client side instead of server side. date time issues - I just give the client UTC time is a pre set format and don't even care about the time zones I let javascript handle it. this is great advantage to where I had to guess time zones based on location derived from users IP. to me state is more nicely maintained in an SPA because once you have set a variable you know it will be there. this gives a feel of developing an app rather than a web page. this helps a lot typically in making sites like foodpanda, flipkart, amazon. because if you are not using client side state you are using expensive sessions. websites surely are extremely responsive - I'll take an extreme example for this try making a calculator in a non SPA website(I know its weird).

来自评论的更新

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

在我的发展过程中,我发现使用SPA有两个明显的优势。这并不是说在传统的web应用程序中不能实现以下功能,只是我看到了增量收益而不会引入额外的缺点。

Potential for less server request as rendering new content isn’t always or even ever an http server request for a new html page. But I say potential because new content could easily require an Ajax call to pull in data but that data could be incrementally lighter than the itself plus markup providing a net benefit. The ability to maintain “State”. In its simplest terms, set a variable on entry to the app and it will be available to other components throughout the user’s experience without passing it around or setting it to a local storage pattern. Intelligently managing this ability however is key to keep the top level scope uncluttered.

在我看来,除了需要JS之外(这对web应用程序来说并不是一件疯狂的事情),其他的缺点要么不是SPA特有的,要么可以通过良好的习惯和开发模式来缓解。

我知道这是一个老问题,但我想补充单页应用程序的另一个缺点:

If you build an API that returns results in a data language (such as XML or JSON) rather than a formatting language (like HTML), you are enabling greater application interoperability, for example, in business-to-business (B2B) applications. Such interoperability has great benefits but does allow people to write software to "mine" (or steal) your data. This particular disadvantage is common to all APIs that use a data language, and not to SPAs in general (indeed, an SPA that asks the server for pre-rendered HTML avoids this, but at the expense of poor model/view separation). This risk exposed by this disadvantage can be mitigated by various means, such as request limiting and connection blocking, etc.