构建一个更具互操作性的 Web 与 Microsoft Edge






4.56/5 (6投票s)
Microsoft Edge 项目经理负责人 Frank Olivier 详细介绍了新的浏览器引擎如何得到改进,以提供更无缝的 Web 开发体验。
在过去的一年里,Microsoft Edge 团队一直在努力开发一款新的浏览器引擎,它将比以往任何时候都更准确、快速、可靠地渲染 Web。作为用户,您喜欢的网站将正常运行,作为 Web 开发人员,您会发现 Microsoft Edge 应该像其他浏览器一样正常运行,从而比以往任何时候都更容易创建在任何地方都能正常运行的网站。
我们实现了 45 项新标准——比以往任何一个版本都多。我们还对成千上万项大大小小的改进进行了优化,以提高 Edge 与其他浏览器的互操作性,从而确保您获得更无缝的 Web 开发体验。
对齐浏览器、内容和规范
Web 的构建原则是拥有多个独立的、可互操作的 Web 标准实现,我们认为推动 Web 发展是我们的责任。真正的互操作性意味着所有 Web 内容、浏览器和规范都遵循相同的明确定义的行为。
在我们不断改进引擎以提高与 Blink 和 WebKit 的互操作性时,我们花费了大量时间与所有浏览器供应商合作,以修复浏览器和规范中的互操作性问题。
如前所述,我们分叉了我们旧的 MSHTML (Trident) 引擎,该引擎试图平衡向后兼容性和现代 Web 互操作性,并将其发展为一款名为 Microsoft EdgeHTML 的全新“互操作性优先”引擎。在这次旅程开始时,我们必须做出一些改变
不断增长的谎言集合
改进 Microsoft Edge 最具影响力的更改之一也是最简单的——更改识别浏览器身份的用户代理字符串,以便 Web 服务器能够识别。
即使在今天,仍然有大量的 Web 服务器会嗅探用户代理字符串以向浏览器提供不同的内容。我们通过更改用户代理字符串,并获得更多在现有 IE11 引擎中无需任何问题即可正常运行的现代内容,从而修复了大量问题。
所有用户代理字符串都包含有关您正在使用的实际浏览器之外的其他浏览器的信息——不仅是令牌,还有“有意义”的版本号。
Internet Explorer 11 的 UA 字符串
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like GeckoMicrosoft Edge UA 字符串
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136
在 W3C 的讨论中,Patrick H. Lauke 在W3C 讨论中恰当地将 userAgent 属性描述为“一个不断增长的谎言集合”。(“或者更确切地说,是一种权衡,即添加足够的旧式关键字,以免旧的 UA 嗅探代码立即失效,同时仍然试图传达一点真正有用和准确的信息。”)
我们建议 Web 开发人员尽可能避免进行 UA 嗅探;现代 Web 平台功能几乎都可以通过简单的方式检测到。在过去的一年里,我们看到一些 UA 嗅探网站已被更新以检测 Microsoft Edge……然后就为它提供了旧的 IE11 代码路径。这不是最好的方法,因为 Microsoft Edge 匹配的是“WebKit”行为,而不是 IE11 行为(任何 Edge-WebKit 的差异都是我们有兴趣修复的 bug)。根据我们的经验,Microsoft Edge 在这些网站上运行在“WebKit”代码路径上效果最好。此外,随着互联网在各种设备上的普及,请假定未知浏览器都是好的——请不要将您的网站限制为仅能在少数当前已知浏览器上运行。如果您这样做,您的网站将来几乎肯定会中断。
过去的麻烦
为了进一步确保网站不会将我们的新引擎识别为 Internet Explorer,我们还花费了大量时间移除旧的 IE 特性(不再支持 ActiveX!)。
在理想世界里,Web 开发人员会编写包含带前缀和不带前缀 CSS 的互操作性内容——不幸的是,情况并非如此。2014 年,我们不得不添加对 WebKit 前缀 CSS 的支持,以渲染大量的现代(移动)网站,之后我们观察到超过 40% 的移动网站得到了改进。渲染一个可用的移动 Web 现在取决于您的浏览器是否支持 WebKit CSS 前缀,就连 Firefox 也在使用这种方法。
接受 WebKit CSS 比解析静态 CSS 更棘手;我们还需要优先列出“--webkit--”属性,因为有大量的网站在发现第一个供应商前缀时就准备好了带前缀的 CSS。
为未来做准备
我们非常关心 Web 开发人员在浏览器之间获得一致的功能集——这就是为什么我们花了很多时间添加最受请求的功能,如ES6(得分最高!)、HTTP/2、响应式图片和媒体捕获,以及 XPath 和 Motion JPEG 支持等旧功能。XPath 和 Motion JPEG 支持。如果您想了解我们不断更新的浏览器将带来什么,请参阅我们新的平台状态和变更日志页面。
数据 数据 数据
浏览器互操作性需要永无止境的功能和 bug 修复;为了最大限度地发挥我们的工作效果,我们需要数据来辅助确定互操作性工作的优先级。我们 300 多万 Windows 10 预览体验成员用户一直在向我们报告网站问题;这些数据在确定修复优先级方面具有宝贵的价值。
我们还使用来自 Bing 爬虫的数据来指导我们的决策。该爬虫可以访问 33 万亿个页面、440 亿个网站,并使用七千个 API,它帮助我们了解大型网站的构建方式以及我们的浏览器更改将如何影响 Web。结合我们能够快速发布新版本浏览器版本的能力,我们能够比以往任何时候都更快地发现并修复互操作性问题。许多网站依赖于 JavaScript 库和框架,因此我们也向这些库提交修复程序,以确保它们在所有浏览器中都能正常工作。
有时标准并不描述实际的 Web 内容
互操作性不仅仅是完全按照规范实现。我们也遇到过许多情况,标准并没有真正描述 Web 开发人员的实际做法,因此我们必须在解析和接受内容时更加宽松——即使这意味着偏离规范。
一个简单的例子是格式不正确的 Meta-Refresh 元素。Web 服务器经常使用 meta refresh 将浏览器重定向到其网站的移动版本。一些移动网站发送的 meta refresh 标签格式不正确(缺少“url=”令牌),这导致 IE 进入无限重定向循环。
“格式不正确”
<meta http-equiv="refresh" content="0;http://foo.com" />正确
<meta http-equiv="refresh" content="0;url=http://foo.com" />
这里的解决方案是解析并处理“格式不正确”的标记——Web 最终会依赖于更宽松浏览器的行为。
我们也遇到过许多情况,规范在定义行为方面(也许)过于死板。有时标准过于 pedantic;很容易看出 Web 开发人员会犯错误
例如,页面经常使用 <meta charset="utf8"> 来定义页面的字符集。“utf-8”是“技术上正确”的描述。这是一个很容易“犯”的“错误”;仅在 GitHub 的 HTML 文件中就有近 60 万个结果。
这导致 IE11 中页面的渲染不正确——在这种情况下,引语
借助 Microsoft Edge,我们现在更加宽松地接受“utf8”值,从而实现了正确的渲染
另一个例子是,移动 Web 依赖于您的浏览器下载字体资源,而不检查CORS 标头和“可嵌入”(根据规范)标志——我们不得不更改移动浏览器中的 WebKit 行为,以使移动 Web 正常工作。
在我们为了更宽松地接受内容而进行更改的同时,我们也在努力确保规范与 Web 开发人员习惯的行为保持一致。
有时 Web 依赖于非标准化行为
现代网页的很大一部分依赖于非标准化的浏览器行为,Web 开发人员必须依赖于未明确定义的浏览器行为。在这些情况下,我们正在努力添加和修复规范,以确保所有浏览器中的 Web 内容行为都能得到可靠的指定。
有时 Web 依赖于浏览器 bug
我们遇到过许多情况,Web 开发人员开始依赖一个浏览器中的不正确行为,这导致了拙劣的 hack 或 UA 嗅探来修补问题。一个很好的例子是scrollTop bug——一旦(主要)网站开始依赖非互操作性行为,就无法在所有浏览器中修复该问题而不破坏 Web 内容。有时最好的前进方向是提供损坏 API 的替代方案——Chrome、Opera 和 Microsoft Edge 现在都支持替代的 document.scrollingElement 属性。
另一个例子是将DOM 属性移动到原型链——这是浏览器工作方式的一个非常根本性的变化,最近才在所有浏览器中统一——这使得在 Web 页面中可靠地编程 DOM 行为变得容易得多。
让 Microsoft Edge 为 Web 做好准备
这些只是我们为浏览器引擎所做的数千项大小互操作性更改中的一小部分示例。在开发过程中,Microsoft Edge 始终比以前任何 Microsoft 浏览器都更具互操作性。我们努力与其他浏览器保持一致,因为这对 Web 最有利,并且我们与其他供应商和标准机构合作在他们那边修复问题。我们长期的希望是,Web 内容、所有浏览器和规范都能在单一、明确定义的、设计良好的行为上保持一致。
每个浏览器供应商都非常关心创建互操作性 Web。在不破坏 Web 的前提下发展 Web 非常困难——任何错误都非常、非常难以修复——但一个在所有浏览器和设备上都能正常工作的互操作性 Web 比以往任何时候都更接近。如果您看到 Microsoft Edge 在与现代浏览器互操作性方面表现不佳的情况,请通过 Twitter @MSEdgeDev 或在 Connect 上提交 bug Connect 通知我们。
更多 Web 开发实践
本文是 Microsoft 技术布道者关于实际 JavaScript 学习、开源项目和互操作性最佳实践的 Web 开发系列文章的一部分,包括Microsoft Edge 浏览器和新的EdgeHTML 渲染引擎。
我们鼓励您在包括 Microsoft Edge(Windows 10 的默认浏览器)在内的各种浏览器和设备上进行测试——使用 dev.modern.IE 上的免费工具。dev.modern.IE
- 扫描您的网站是否存在过时库、布局问题和可访问性问题
- 将虚拟机用于 Mac、Linux 和 Windows
- 在您自己的设备上远程测试 Microsoft Edge
- GitHub 上的编程实验室:跨浏览器测试和最佳实践
来自我们工程师和布道者的 Microsoft Edge 和 Web 平台深度技术学习
- Microsoft Edge Web Summit 2015(关于新浏览器的预期、新支持的 Web 平台标准以及来自 JavaScript 社区的特邀演讲者)
- 哇,我可以在 Mac 和 Linux 上测试 Edge 和 IE!(来自 Rey Bango)
- 在不破坏 Web 的前提下推进 JavaScript(来自 Christian Heilmann)
- 让 Web 正常工作的 Edge 渲染引擎(来自 Jacob Rossi)
- 使用 WebGL 释放 3D 渲染能力(来自 David Catuhe,包括vorlon.JS 和babylonJS 项目)
- 托管 Web 应用和 Web 平台创新(来自 Kevin Hill 和 Kiril Seksenov,包括manifold.JS 项目)
更多免费的跨平台工具和网络平台资源
- 适用于 Linux、MacOS 和 Windows 的 Visual Studio Code
- 使用 Node.JS 进行代码编码,并在 Azure 上获得免费试用