本文参考 High Performance Browser Networking,获取更多详细内容请查看原文。
深入探讨高性能浏览器网络
XMLHttpRequest(XHR)是一种浏览器API,使得客户端能够使用JavaScript进行数据异步传输。首次在Internet Explorer 5中引入,XHR迅速成为现代Web应用程序的基石,尤其在构建异步JavaScript和XML(AJAX)方面。
在XHR出现之前,网页的状态更新只能通过刷新页面来实现。但XHR的出现彻底改变了这一流程,让客户端能够在用户无感知的情况下从服务器请求数据,从而实现状态的更新和文档的及时保存。Outlook Web Access(OWA)的开发团队凭借此技术创建了接近桌面应用程序的体验,为AJAX的普及奠定了基础。
吉姆·范·伊顿提到,在XHR诞生之前,任何状态更新都需要通过刷新网页来实现,XHR的引入使得这一切变得简单和即时。它不仅仅是一种方法,更是一种在客户端和服务器间进行快速交互的桥梁。
另一个重要的里程碑是,XHR赋予开发者一种简单的控制方式。由于浏览器自动管理底层连接、协议协商及HTTP请求的格式,使得应用程序能专注于请求的发起、请求进度的跟踪和处理服务器返回的数据。可以说,XHR就是网络的“瑞士军刀”。
因此,尽管有时使用XHR并不是传输的最佳选择,它依然被广泛应用于多种网络场景,包括脚本下载、上传、流式传输,甚至实时通知。接下来,我们将深入探讨XHR的更新特性、应用场景及性能优化的注意事项。
XHR的发展历程
尽管名称中包含XML,XMLHttpRequest最初并不专注于XML数据。这一名称的来源可以追溯到其在IE5中作为MSXML库的一部分的推出,这是一个历史遗留问题。经过多次完善,XHR逐渐演变成今天我们所熟知的标准。
随着Mozilla和其他浏览器像Safari和Opera陆续实现XHR标准,XHR逐渐成为各大浏览器的通用解决方案。正式的W3C规范直到2006年才出台,彼时XHR已经被广泛应用。
早期版本的XHR具备的功能有限,主要面向文本数据的传输,支持上传的功能也较弱,并且对于跨域请求的处理几乎不存在。对此,2008年推出的“XMLHttpRequest Level 2”草案增加了许多新特性,如请求超时、支持二进制数据传输、跟踪请求进度及安全的跨域请求等。
跨域资源共享(CORS)
XHR作为浏览器API,自动处理多种低级细节,例如缓存、重定向和身份验证。这不仅简化了开发过程,还提升了安全性。XHR遵循严格的HTTP语义,确保应用程序只能使用受限制的HTTP头,以保护用户隐私与数据安全。比如应用需要遵循“同源政策”,限制请求源与目标资源必须相匹配。
然而,随着Web应用程序的复杂化,跨域资源共享(CORS)的需求也随之增强。CORS允许开发者安全地向不同源的服务器请求资源,通过检查HTTP的Origin头来确认请求的来源,从而决定是否允许访问。
使用XHR下载与上传数据
对于XHR的使用场景而言,下载和上传数据皆是一项基本功能。浏览器能够根据不同的数据类型自动进行编码与解码,支持如文本字符串、JSON对象、图像等多种格式的数据传输。例如,当发送二进制数据时,可以通过设置回应类型为’blob’来实现。
上传数据同样简单,浏览器可以处理多种数据类型,包括DOMString、Document、FormData以及Blob等。当需要上传大量数据时,可以将数据切片,并通过多个XHR请求分批发送,这样的方式能在网络不稳定的情况下保持良好的传输效果。
监控上传和下载的进度
XHR还提供了进度事件的监听功能,方便开发者在数据上传与下载过程中,跟踪请求的状态。XHR对象可通过添加事件监听器来处理各种状态事件,从而更好地掌握请求的进展。
实时通知与刷新
当谈及如何实时获取服务器更新时,XHR提供了一种简单有效的机制。不过要实现服务器主动推送更新则有一定难度。实时信息的推送通常需要客户端不断发起请求以检查是否有新数据,这种方式称为轮询。这种做法虽然简单,但效率较低。
小结
总的来说,XMLHttpRequest的出现使得Web开发者能够快速构建出动态交互的Web应用程序。从处理异步请求到实现数据的上传与下载,XHR为Web开发提供了强大的支持。然而需要注意的是,虽然XHR在许多情况下表现优异,但在某些方面它仍可能不如实时传输技术,如WebSocket及Server-Sent Events高效。