原文:What is a Polyfill?
链接:https://remysharp.com/2010/10/08/what-is-a-polyfill
翻译:Robin

Polyfill 或者 Polyfiller,就是一段代码(或者插件),能够提供开发者希望浏览器原生 支持的功能。它能抹平API差异。

Polyfill 的由来

2009年,我正在写《HTML5简介》。当时,我坐在咖啡店里思索我需要一个词能够表达出“使用Javascript(或Flash甚至任何语言)来复刻浏览器原生的API”这样一种意思。

Shim 对于我来说,意味着一段你可以用来修复某些功能的代码,但是通常有可替代的API。我想要的是你可以随手可得并且能够默默工作的东西(还记得之前的shim.gif吗?需要你插入图片来修复空td单元格,我需要这样一个能够自动为我做这些事情的东西)。

我真正想要的并不是渐进增强,因为我所追求的底线是使用 Javascript 和最新的技术。因此,现有的词汇(Shim)并不能够满足我。

同时,脱离了原生功能和 Javascript(假定你使用 Javascript 实现 polyfill)就无法工作,这不是一种优雅降级。

我希望这个词容易脱口而出,并且让人能够在脑海中立刻联想到它是干什么的。我想到了 Polyfill。 Poly 意味着可以使用多种技术——不限于 Javascript 来解决问题,而 fill 可以使用这些技术修复浏览器的问题。 同时,它没有一点暗示 “旧版本浏览器”的意思(因为新版本浏览器同样会被 polyfill)。

对于我来说,Polyfilla (在美国用来修墙)是一种糊剂产品用来修补墙面裂缝和孔洞。这就像我们修复浏览器一样非常有画面感。一旦墙面平整,你就可以随心所欲的在墙面上绘制你心中的内容。

之后,我收到了“这个词需要改变”的反馈,但是此时的社区需要这样一个词,就像我们需要 Ajax、HTML5和Web2.0一样表达出我们想法的词。无论这个词是否完美,事实上开发者和设计者开始理解了这一概念。

我不打算推广这个词,只是把它放在了一些关键地方(尤其是在书中),还有就是 Paul Irish 几(好多?)个月后的演讲中,直接的引用 polyfill 这个词,它会有一个大量的曝光(我认为这有助于 Modernizr HTMl5 shims 和 polyfill 页面的增加)。

定义

Alex Sexton把 polyfill 归为回归增强的一种。我认为他总结的很好。

Paul 也把它定义为:

  1. 一个 shim,用来模拟超前API,为旧版本浏览器提供后备功能。

例子

这里有个例子:sessionStorage 在最新的(IE8及更高版本)浏览器中可用,但在IE7或更低版本中不可用。

可以使用 polyfill 为不支持 sessionStorage 的旧版本浏览器提供支持

通过加入 polyfiller,我可以依赖 Web Storage API 进行开发工作而不必在代码中进行特性测试和分散精力去处理各种情景。

另一个例子是在 IE 中提供 canvas 支持。在这里你可以看到 poly 部分的含义。如果没有原生 canvas,我们可以使用 Silverlight 提供 canvas 支持。如果 Silverlight 不可用,我们可以使用 VML 或者 excanvas(注意 excanvas 实际上也包括 Silverlight 桥)。使用这两种脚本可以给开发者提供一个(相当)可靠的非浏览器原生 canvas 支持。

从何处来,往何处去

年初,我和 Bruce Lawson 合著了《HTML5简介》一书。在 R&D 阶段我在看 shims 和填补缺失 API 的技术,但是它们都不是渐进增强的。我想要一个单词能够表达这样一层意思,就是一个东西能够填补浏览器的同时既不是渐进增强也不是优雅降级的。

Polyfilling 看起来满足了我所要说的(在我看来)。

Polyfilla 是一个英国产品,在美国用作裂缝糊剂而被熟知。想象一下,浏览器就像是一堵有裂缝的墙。这些 polyfills 有助于修补裂缝并给我们一个“光滑”的浏览器墙面去工作。

我会暂时在我早在6月的思维维他命HTMl5 演说中用到这个新的词汇,但是我并不会推广这个词汇,因为推广一个新词太难了。然而,我会偷偷地把它放进介绍 HTML5中,这样会起到一个引导的作用。

近期在 Js 大会,Paul Irish 会发布一个 polyfills 和 shims 列表,一个能够把我们从饱受旧版本浏览器折磨的开发中拯救出来的列表。

看起来 polyfilling 说的像那么一回事,那么让我们把它用起来,让那些旧版本(甚至是新版本)浏览器达到我们所期望的效果。