渐进增强与单页面应用程序


33

我刚从波士顿的一次会议“ An Event Apart”回来。

演讲者中一个真正流行的主题是渐进增强的想法-网站的内容应以HTML形式出现,而JavaScript仅应用于增强行为。

发言者提出的逐步提高的论点非常有说服力。它不仅是支持旧版浏览器和低带宽网络设备的可靠模式,而且HTML失败的可能性要远远超过JavaScript(例如,不支持的标记会被忽略,而如果浏览器在执行您的浏览器时抛出异常)脚本-您被水喉)。

杰里米·基思Jeremy Keith)对此进行了特别有见地的演讲。

但是,诸如Backbone和Angular的单页Web应用程序呢?这些框架背后的整个设计似乎促使开发人员将内容移出HTML,并移入JSON API之类的东西。

我似乎无法凝结这两种设计模式:渐进式增强与单页Web应用程序。有没有一种情况比另一种更好?还是它们甚至不是对抗性技术,而我的思维模式却在这里缺失了一些东西?


他们有两个不同的用例。是的,当服务器执行繁重任务时会出现重叠。
BobDalgleish 2014年

5
我认为可以公平地说,单页面应用程序的浏览器要求在设计上比对“普通” Web应用程序的要求更为严格。
罗伯特·哈维

3
您应该请Jeremy Keith举一个真实的例子,其中渐进式增强实际上值得让1-10%的总互联网用户感到烦恼,并询问其他90%的用户数据,他们是否真正关心渐进式增强或他们是否满意如果他们可以使用IE 5.0或不使用javascript来访问网站
kirie 2014年

1
如果禁用JS /图像/等功能的人不在您的核心目标人群中,则没有有效的商业理由进行渐进式增强。
格雷厄姆

1
对“低带宽网络上的设备”的支持实际上是SPA的理由,而不是反对它!在SPA中,您只发出一个大请求,而没有JS的情况下,您每次都会收到它!
Dmitri Zaitsev 2014年

Answers:


21

在我看来,单页应用程序在渐进式增强中划清了界限。在几十年前我们可以尝试解决不同浏览器的实现和功能变化的事实之前,SPA假设存在一定的基线,我们可以合理地同意给定站点的大多数访问者都可以满足。我认为这两者并不矛盾。在SPA启动之后,您仍然可以继续逐步增强功能,例如从<video>标签开始,然后在上面放置自己的功能丰富的播放器。

还有一些禁用了脚本的访问者,但是他们知道自己正在进入什么领域。除了“您需要为此站点编写脚本”注释之外,我看不出为什么开发人员应该为那些访问者弯腰。如果我们允许的话,为什么不同时照顾禁用CSS的访问者呢?禁用图片怎么样?这些是核心网络技术。他们去挑选物品时,不应期望他们具有完整的网络体验。

为确保没有汽车类比我无法逃脱,如果我决定不喜欢某些功能,就不应期望汽车能够正常工作。我可以告诉土木工程师:“我禁用了大灯,所以请确保在我可能到过的任何地方每125英尺安装一次路灯。” 没有大灯,我的汽车在很多时候都可以工作,但是有些地方我将无法访问。


3
I don't see why developers should bend over backwards for those visitors。如果您的合同规定您需要提供网站的可访问版本,则使用SPA可能会更加困难。SEO又如何呢?
西蒙·贝格

7
@Simon:您也可以使SPA可用(请参阅例如stackoverflow.com/questions/15318661/…)。对于SEO也是如此(如果SEO很重要,这取决于应用程序)。
sleske,2014年

2
您的某些类比有点像个稻草人。禁用Javascript具有安全性。很难争辩说在护理中增加头灯会降低安全性。
罗伯特·哈维

1
的确,禁用脚本具有安全性好处。但是对于大多数访问者而言,选择该选项所提供的额外安全性并不值得。如果没有脚本,Facebook将拒绝工作,LinkedIn中断,Pinterest中断,Instagram加载空白页等。如果主要参与者需要,您的SPA也可以。
Collin Allen'1

仅了解FB和LinkedIn,这些网站没有JS就没有充分的理由,只有安抚不想创建一个功能正常的网站的开发人员(或强迫用户接受不太安全的浏览方式,而这些开发人员会这样做)。可能有益于他们的底线)。如果它们是像Plunker这样的全功能Web应用程序,您可能会有一点要说,但是就它们构建在某种框架上而言,大多数“ Web应用程序”只是“应用程序”。在使用方面,它们只是比以往更多的网站。
持不同政见者的愤怒

6

如果您创建的应用程序不符合经典的请求/响应页面模型,则SPA最为有用。最近有一种趋势,即使常规网站恰好适合Web的请求/响应周期,也将它们写为SPA,恕我直言,他们的所作所为是愚蠢的。这些网站之类的功能是无法重新实现具有更多错误和更少功能的Web浏览器。

对于这些愚蠢的单页面应用网站,渐进增强和SPA的想法并不是相互排斥的。您只需要javascript进行一些内容协商(即Accept标头),以便它们接收JSON资源,SPA上的Javascript可以呈现自己的JSON资源,而不是预先呈现的HTML页面。这种网站SPA的问题很明显,您必须在服务器和客户端上都重复执行网站的呈现。

对于真正的Web应用程序,即真正必须是SPA的应用程序,因为它们不符合标准的请求/响应模式;对于真正的应用程序而言,渐进增强要困难得多,因为它们实际上只是将浏览器用作可移植地编写应用程序的技术平台。脚本语言是真正的Web应用程序的重要组成部分,而不仅仅是可以选择进行增强的应用程序。尽管某些渐进式增强技术仍然可以使用(例如,用<video>/ <audio>标签替换Flash视频/音频),但真正的Web应用程序将需要以javascript为基准。


+1,但要确定“真正”的内容是否需要SPA并不总是那么容易。例如,主要是数据输入的业务应用程序,其表单具有广泛的复杂性。如果大多数形式都很简单,那么就不需要“真正”使用SPA,因此SPA和非SPA解决方案之间仍然存在紧张关系。
sinelaw 2014年

@sinelaw:大多数业务应用程序通常不应该是SPA。有一些例外,例如电子表格,文字处理,但这些都是奇怪的例外。您需要SPA的指标:如果需要将数据从服务器推送到客户端,不仅用于一两个通知,还应作为应用程序的重要元素,例如游戏,股票跟踪,聊天应用程序;如果您的应用程序没有“页面”的合理概念,或者“页面”的概念已在应用程序中完全扭曲,例如Office应用程序。主要在表单上工作的业务应用程序最好还是保留为非SPA。
Lie Ryan

同意。SPA的另一个指标:开发SPA是否比开发“经典”网站便宜。面向特定受众的业务应用程序有时可能会提出诸如“使用现代浏览器”之类的要求,因此渐进式增强几乎没有好处。
sinelaw 2014年

@sinelaw:建立SPA几乎比开发多页面站点便宜。尤其是如果您仍然不适应较旧的浏览器。
Lie Ryan

如果您的团队由SPA专家组成,而这些专家在以服务器为中心的项目中几乎没有背景,那么它会更便宜。
sinelaw

2

我相信单页网络应用程序和渐进式增强功能几乎是对立的。如果html是根据从json api检索到的数据在客户端上计算出来的,则几乎无法正常降级。但是,它可以提供更丰富,更令人愉悦的用户界面。

您可以设置一个机器人,该机器人将对您的应用程序进行爬网并保存一个静态版本。此技术可用于向没有javascript(盲人或搜索引擎机器人使用)的浏览器提供HTML。这是一项投资,因此确实符合您的要求。

您是否正在为特定公司制作人力资源管理网络应用程序?您不需要正常降级,并且SPA可能更易于构建。该公司可能会强制使用特定的浏览器,因此您可以进行的测试较少。

您是否正在建立一个公共网站,以与可访问性要求和搜索引擎可见性需求相关联?然后考虑在服务器上构建HTML。或者根据您的预算制作带有静态版本的SPA。


1

我认为这取决于您要使用渐进增强功能的程度-它是一种设计范例,而不是一成不变的规则。

如果您使用的是SPA框架,那么我认为允许使用Javascript是必须的。但是,您编写的用于增强页面的Java脚本必须足够聪明,才能处理框架可以创建的任何HTML。

您还可以从其他PE技术中受益,例如在最新的浏览器版本中利用最新的CSS功能,或将HTML5转换为HTML4。


1
渐进增强的一部分是,基本内容应该没有javascript就可以使用。我不确定如何在不使用JavaScript的情况下编写SPA。
艾伦·舒特科

@AlanShutko也许使用iframe。多个页面,但是从技术上讲,URL不会改变...;)
Izkata 2014年

1
是的,我想我在考虑HTML 5和HTML 4以及关于特定于浏览器的CSS方面的思考更多(例如,您可能想使用最近实现的功能,该功能仅在最新版本的Chrome中可用,但会降级为更多功能)。旧版浏览器中的原始控件)。在SPA中,不使用JavaScript会很棘手,但这只是渐进增强概念的一部分。
philicomus

渐进式增强功能可用于圆角时,就像使用css3一样简单。基本思想与JavaScript无关。
丹尼尔·利特尔

1

渐进增强功能和单页应用程序可以共存。我听说过以这种方式构建应用程序的两个最引人注目的论点是:

  • 在HTML文件下载了完整但引用的脚本的情况下,由于网络连接的插入和退出(可能在移动网络上)而无法完全下载,因此具有容错能力
  • 潜在的改善初始页面加载时的感知性能(通过减少启动渲染时间)

服务器端渲染(这是针对用户的,而不仅仅是SEO的原因)和“最精打细算”是两项技术,可以帮助您使用现代的客户端JS框架逐步构建增强的单页应用程序。

一些客户端JS框架比其他客户端JS框架更易于使用服务器端渲染(请注意,某些服务器端渲染解决方案和框架组合不会产生有效的SPA,因为服务器渲染页面仅用于搜索引擎使用,而不是最终使用-用户)。

在撰写本文时,React.js和Ember(即将推出的FastBoot)是我所知道的已经或正在尝试使服务器端呈现一流公民的两个人。在客户端浏览器上解析后,服务器端呈现的页面仍然是有效的SPA。


0

我认为减少的页面负载对于服务器和网络来说可能是一个很好的选择。我希望看到更多使用正确的SPA。

我不认为这需要两件事:

1)在初始加载时将所有链接设置为标准请求/响应链接,让您的SPA框架/库在浏览器加载并且JS引擎识别出SPA支持可用后,用更新的(交互式)版本替换它们。这确实是进步的进步;JS会加载到现有html网站的顶部,这对于搜索引擎,辅助技术和较旧的浏览器来说更好。

2)服务器需要通过提供正确的格式来响应/ foo / bar / json和foo / bar之类的路由;实际上,如果您将所有内容包装在布局和局部中以获得第一页,那么您也应该能够通过布局和局部来获取第二页及后续页面的所有内容。

这里有很多工作。诚然,但是如果您可以控制整个堆栈,那么它确实可以平衡这两种技术。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.