使用 polyfills 的更轻松方式

Polyfills 是在支持旧版浏览器的同时使用现代代码的绝佳方式,但目前使用 polyfills 太困难了,因此我们在 FT 创建了一个新服务,以简化操作。我们诚邀您使用它,并帮助我们改进它

Image from https://www.flickr.com/photos/hamur0w0/6984884135

他们说要更多图片。所以这里有一只独角兽,它基本上是一匹带 polyfill 的马。

挑战

以下是我们尝试解决的一些问题

  • 开发人员不一定知道哪些功能需要 polyfill。您在某个旧版本的 IE(被令人沮丧的大量用户喜爱)中加载您的站点,发现该站点无法运行,然后必须调试它才能找出导致问题的功能。有时罪魁祸首显而易见,但通常并非如此,尤其是在旧版浏览器也缺乏好的开发人员工具时。
  • 每个功能通常都有多个可用的 polyfills。很难知道哪个 polyfill 最忠实地模拟了缺失的功能。
  • 一些 polyfills 作为包含大量其他 polyfills 的大捆绑包提供,而您并不需要这些 polyfills,以便全面涵盖大型功能集,例如 ES6。不应需要将所有这些代码发送到浏览器以修复非常简单的事情。
  • 较新的浏览器不需要 polyfill,但通常会将 polyfill 提供给所有浏览器。这会降低现代浏览器的性能,以提高与旧版浏览器的兼容性。我们不想做出这种妥协。我们宁愿只将 polyfills 提供给缺少该功能的原生实现的浏览器。

我们的解决方案:polyfills 作为服务

为了解决这些问题,我们创建了 polyfill 服务。这类似于去眼科医生那里检查眼睛,并获得一副完美设计的眼镜来矫正您的特定视力问题。我们对浏览器做了同样的事情。以下是它的工作原理

  1. 开发人员将其页面中插入一个脚本标记,该标记加载 polyfill 服务端点。
  2. 该服务分析浏览器的用户代理标头和请求功能列表(或使用所有可 polyfill 内容的默认列表),并构建一个针对此浏览器所需的 polyfills 列表
  3. 使用图形排序对 polyfills 进行排序,以将它们放在正确的依赖关系顺序中。
  4. 该捆绑包经过缩小,并通过 CDN 提供服务(对此我们非常感谢 Fastly 的支持)

我们真的需要这个解决方案吗?好吧,请考虑以下情况:Modernizr 是一个包含大量功能检测的大杂烩,所有明智的用例都受益于自定义构建,但很大一部分 Modernizr 用户只使用默认构建,通常来自 cdnjs.com 或作为html5boilerplate 的一部分。如果您没有使用它的功能检测,为什么还要包含 Modernizr?也许您误解了库的目的,只是认为 Modernizr“修复了某些东西”?我不得不承认,当我第一次听到这个名字时,我也是这么想的,我很失望地发现,Modernizr 并没有做任何实际的现代化,而是只是定义了现代化。

另一方面,polyfill 服务确实修复了某些东西。不想花时间深入了解所有旧版浏览器的缺点并没有错。让某人一次性弄清楚,然后我们就可以从中受益,而无需理解细节。

如何使用它

最简单的用例是

这包含我们的默认 polyfill 集。默认集是我们认为对现代网络开发至关重要的功能的手动整理列表,这些功能的 polyfills 相对较小且高度准确。但是,如果您想指定要 polyfill 的功能,请继续。






如果在解析您自己的代码之前加载 polyfills 很重要,您可以删除 `async` 和 `defer` 属性,或使用脚本加载器(一个不需要任何 polyfills 的加载器!)。

测试和记录功能支持

此表显示了 polyfill 服务对许多关键网络技术和一系列流行浏览器的影响

Polyfill service support grid

我们支持的功能完整列表显示在我们的功能矩阵中。为了构建此网格,我们使用Sauce Labs 的测试自动化平台,该平台在每个浏览器中对每个 polyfill 运行一系列测试,并记录结果。

那么,呃,用户代理嗅探?真的吗?

是的。有几个原因让我们选择UA 分析 而不是功能检测

  • 在某些情况下,我们对同一功能有多个 polyfills,因为某些浏览器提供了不符合标准的实现,只需要将其修复,而另一些浏览器则根本没有实现。使用 UA 检测,您可以选择提供 polyfill 的正确变体。
  • 使用 UA 检测,第一个 HTTP 请求可以直接用 polyfill 代码进行响应。如果我们使用功能检测,第一个请求将提供功能检测代码,然后需要第二个请求来获取特定 polyfills。

几乎所有规模较大的网站都进行 UA 检测。这并不意味着与之相关的污名一定是坏的。编写不好的 UA 检测规则很容易,而编写好的 UA 检测规则则很难。我们并没有排除通过功能检测使用该服务的方式(实际上,我们的跟踪器中有一个针对此问题的问题)。

面向所有人的服务

该应用程序的服务部分由 FT 维护,我们一直在努力扩展和改进工具、文档、测试和服务功能。源代码可以免费获得GitHub 上,这样您就可以轻松地自行托管它,但我们还在 cdn.polyfill.io 上托管该服务的实例,您可以免费使用它,而我们朋友Fastly 提供免费的 CDN 分发和 SSL。

我们已经创建了一个平台。我们需要社区的帮助来填充它。我们已经提供了一些来自Jonathan NealMathias Bynens 和其他人的最佳 polyfills,但我们希望更加全面。带上您的 polyfills,改进我们的测试,并将其打造为可以帮助推动网络发展的一项资源!

关于 Andrew Betts

FT Labs 主任,负责开发和推广金融时报的实验性网络技术

更多 Andrew Betts 的文章...

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道师和编辑。发表演讲并撰写有关 HTML5、JavaScript 和开放网络的博客文章。Robert 坚定地相信 HTML5 和开放网络,自 1999 年以来一直在从事网络前端开发工作 - 在瑞典和纽约市。他经常在http://robertnyman.com 上发表博客文章,并且喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章...


11 评论

  1. Petter

    UA 嗅探是可以的,但只作为最初的猜测。我认为它应该与下载的代码中的实际功能测试相结合。

    在 99% 的下载中,这只会增加微不足道的开销,但在 1% 的重要情况下,如果通过功能测试进行回退,则站点不会崩溃。

    2014 年 11 月 6 日 06:51

    1. Bart

      如果墨菲定律要求客户的计算机具有奇怪的 UA 字符串,则百分比是无关紧要的。这将不是有人第一次弄乱开发人员工具或隐私插件(然后忘记了它)。

      2014 年 11 月 7 日 11:38

  2. Conor Luddy

    干得好,伙计们,看起来很有趣!

    2014 年 11 月 6 日 07:02

  3. Alfonso

    如果功能矩阵中的每个链接都链接到一个页面,描述每个功能的作用以及正在使用的 polyfill,那会好得多,这样我们就可以更好地理解是否需要它。
    我真的很想知道为什么有一个“Window” polyfill 以及为什么 IE 和 Safari 需要一个“Event” polyfill。

    2014 年 11 月 6 日 09:52

  4. mario

    看起来很有用,非常有用

    2014 年 11 月 6 日 12:09

  5. Dorian

    有人在生产环境中使用它吗?

    2014 年 11 月 6 日 13:17

  6. Brenton

    我现在正在进行的项目是同构的(也就是说,它们在 Node 和浏览器中都可以渲染)。[jsx-loader](https://github.com/petehunt/jsx-loader) 非常适合支持 ES6 语法,但它不负责确保 Array、Object、Math 等被填充。

    如果这是个东西

    “`
    // polyfill.io.js

    if (global.hasOwnProperty(“window”)) {
    if (!window.hasOwnProperty(“__polyfillIOVersion”)) {
    console.warn(“polyfill.io 未找到。请确保将其包含在你的 ! 的顶部”)
    }

    } else {
    if (!process.version.contains(“0.11.13”))
    console.warn(“你正在使用旧版本的 polyfill npm 模块 - 请更新它。”)

    // 在这里扩充 Array、Object、Math 等的原型
    }
    “`

    我可以通过在我的同构应用程序中简单地 `require(“polyfill.io”)` (并在我的标记中添加相应的 “ 标签)来使用它吗?

    2014 年 11 月 6 日 下午 3:08

  7. Farid Nouri Neshat

    想知道有多少内容会发送到每个浏览器,这样我们就能知道是否应该避免使用默认列表。

    2014 年 11 月 7 日 上午 5:09

  8. Oisin G.

    很棒的工作,伙计们 - 我注意到你们在包含的脚本标签上不一致。在“关于”页面上,你们指定了

    src=”https://cdn.polyfill.io/…”

    而你们应该说的是

    src=”//cdn.polyfill.io/…”

    继续努力!

    2014 年 11 月 10 日 上午 9:03

  9. ingee

    很棒的文章。
    顺便问一下,第一张图片是什么?似乎图片链接已损坏。

    https://hacks.mozilla.ac.cn/wp-content/uploads/2014/10/6984884135_8823c68f9d_o-e1414691132239-500×250.jpg

    2014 年 11 月 27 日 上午 10:25

    1. Robert Nyman [编辑]

      现在已修复,感谢告知!

      2014 年 11 月 28 日 上午 10:33

本文评论已关闭。