Polyfills 是在支持旧版浏览器的同时使用现代代码的绝佳方式,但目前使用 polyfills 太困难了,因此我们在 FT 创建了一个新服务,以简化操作。我们诚邀您使用它,并帮助我们改进它。
他们说要更多图片。所以这里有一只独角兽,它基本上是一匹带 polyfill 的马。
挑战
以下是我们尝试解决的一些问题
- 开发人员不一定知道哪些功能需要 polyfill。您在某个旧版本的 IE(被令人沮丧的大量用户喜爱)中加载您的站点,发现该站点无法运行,然后必须调试它才能找出导致问题的功能。有时罪魁祸首显而易见,但通常并非如此,尤其是在旧版浏览器也缺乏好的开发人员工具时。
- 每个功能通常都有多个可用的 polyfills。很难知道哪个 polyfill 最忠实地模拟了缺失的功能。
- 一些 polyfills 作为包含大量其他 polyfills 的大捆绑包提供,而您并不需要这些 polyfills,以便全面涵盖大型功能集,例如 ES6。不应需要将所有这些代码发送到浏览器以修复非常简单的事情。
- 较新的浏览器不需要 polyfill,但通常会将 polyfill 提供给所有浏览器。这会降低现代浏览器的性能,以提高与旧版浏览器的兼容性。我们不想做出这种妥协。我们宁愿只将 polyfills 提供给缺少该功能的原生实现的浏览器。
我们的解决方案:polyfills 作为服务
为了解决这些问题,我们创建了 polyfill 服务。这类似于去眼科医生那里检查眼睛,并获得一副完美设计的眼镜来矫正您的特定视力问题。我们对浏览器做了同样的事情。以下是它的工作原理
- 开发人员将其页面中插入一个脚本标记,该标记加载 polyfill 服务端点。
- 该服务分析浏览器的用户代理标头和请求功能列表(或使用所有可 polyfill 内容的默认列表),并构建一个针对此浏览器所需的 polyfills 列表
- 使用图形排序对 polyfills 进行排序,以将它们放在正确的依赖关系顺序中。
- 该捆绑包经过缩小,并通过 CDN 提供服务(对此我们非常感谢 Fastly 的支持)
我们真的需要这个解决方案吗?好吧,请考虑以下情况:Modernizr 是一个包含大量功能检测的大杂烩,所有明智的用例都受益于自定义构建,但很大一部分 Modernizr 用户只使用默认构建,通常来自 cdnjs.com 或作为html5boilerplate 的一部分。如果您没有使用它的功能检测,为什么还要包含 Modernizr?也许您误解了库的目的,只是认为 Modernizr“修复了某些东西”?我不得不承认,当我第一次听到这个名字时,我也是这么想的,我很失望地发现,Modernizr 并没有做任何实际的现代化,而是只是定义了现代化。
另一方面,polyfill 服务确实修复了某些东西。不想花时间深入了解所有旧版浏览器的缺点并没有错。让某人一次性弄清楚,然后我们就可以从中受益,而无需理解细节。
如何使用它
最简单的用例是
这包含我们的默认 polyfill 集。默认集是我们认为对现代网络开发至关重要的功能的手动整理列表,这些功能的 polyfills 相对较小且高度准确。但是,如果您想指定要 polyfill 的功能,请继续。
如果在解析您自己的代码之前加载 polyfills 很重要,您可以删除 `async` 和 `defer` 属性,或使用脚本加载器(一个不需要任何 polyfills 的加载器!)。
测试和记录功能支持
此表显示了 polyfill 服务对许多关键网络技术和一系列流行浏览器的影响
我们支持的功能完整列表显示在我们的功能矩阵中。为了构建此网格,我们使用Sauce Labs 的测试自动化平台,该平台在每个浏览器中对每个 polyfill 运行一系列测试,并记录结果。
那么,呃,用户代理嗅探?真的吗?
是的。有几个原因让我们选择UA 分析 而不是功能检测
- 在某些情况下,我们对同一功能有多个 polyfills,因为某些浏览器提供了不符合标准的实现,只需要将其修复,而另一些浏览器则根本没有实现。使用 UA 检测,您可以选择提供 polyfill 的正确变体。
- 使用 UA 检测,第一个 HTTP 请求可以直接用 polyfill 代码进行响应。如果我们使用功能检测,第一个请求将提供功能检测代码,然后需要第二个请求来获取特定 polyfills。
几乎所有规模较大的网站都进行 UA 检测。这并不意味着与之相关的污名一定是坏的。编写不好的 UA 检测规则很容易,而编写好的 UA 检测规则则很难。我们并没有排除通过功能检测使用该服务的方式(实际上,我们的跟踪器中有一个针对此问题的问题)。
面向所有人的服务
该应用程序的服务部分由 FT 维护,我们一直在努力扩展和改进工具、文档、测试和服务功能。源代码可以免费获得GitHub 上,这样您就可以轻松地自行托管它,但我们还在 cdn.polyfill.io 上托管该服务的实例,您可以免费使用它,而我们朋友Fastly 提供免费的 CDN 分发和 SSL。
我们已经创建了一个平台。我们需要社区的帮助来填充它。我们已经提供了一些来自Jonathan Neal、Mathias Bynens 和其他人的最佳 polyfills,但我们希望更加全面。带上您的 polyfills,改进我们的测试,并将其打造为可以帮助推动网络发展的一项资源!
关于 Andrew Betts
FT Labs 主任,负责开发和推广金融时报的实验性网络技术
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道师和编辑。发表演讲并撰写有关 HTML5、JavaScript 和开放网络的博客文章。Robert 坚定地相信 HTML5 和开放网络,自 1999 年以来一直在从事网络前端开发工作 - 在瑞典和纽约市。他经常在http://robertnyman.com 上发表博客文章,并且喜欢旅行和结识新朋友。
11 评论