垫片和填料的区别是什么?


406

两者似乎都在Web开发圈子中使用,请参见HTML5跨浏览器Polyfills,其中说:

所以在这里,我们收集了所有的垫片,后备和填充物...

或者,有es5-shim项目。

在我当前的项目中,我们使用了许多这样的工具,我想将它们全部粘贴在同一目录中。所以,我应该怎么称呼这个目录--- shimspolyfills


6
重新开放:我想“我应该怎么称呼这个目录”可能是基于观点的,但实际上并没有给出该问题的更大背景信息,也不是这个问题的最重要方面。这里的所有答案似乎都是一致的,并且大量使用事实,参考文献和专门知识。
nobar

Answers:


386
  • 垫片是任何一段代码,执行截取的API调用的,并提供了一个抽象层。它不一定限于Web应用程序或HTML5 / CSS3。

  • 一个填充工具是一种类型垫片与现代HTML5改造传统的浏览器/ CSS3特性通常是使用JavaScript或Flash。

回答您的特定问题,shims如果要保持目录的通用性,请呼叫目录。


234

垫片

如果您熟悉适配器模式,那么您将知道垫片是什么。Shims拦截API调用,并在调用者和目标之间创建一个抽象层。通常,垫片用于向后兼容。例如,es5-shim npm软件包将使您可以编写ECMAScript 5(ES5)语法,而不必关心浏览器是否在运行ES5。以Date.now为例。这是ES5中的新功能,其中ES3中的语法为new Date()。getTime()。如果使用es5-shim,则可以编写Date.now;如果您所运行的浏览器支持ES5,它将立即运行。但是,如果浏览器正在运行ES3引擎,则es5-shim将拦截对Date.now的调用并只返回new Date()。getTime()。这种拦截称为匀场。es5-shim的相关源代码如下所示:

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

保丽

实际上,Polyfilling只是匀场的专用版本。Polyfill是关于在API中实现缺少的功能的,而补片在实现缺失的功能方面并不一定要在纠正功能方面那么多。我知道这些似乎过于含糊,但是在使用垫片作为更广泛的术语的地方,polyfill用于描述为较旧的浏览器提供向后兼容性的垫片。因此,尽管使用垫片来掩盖旧的罪过,但是使用填充胶可以使将来的改进恢复原状。 例如,在IE7中不支持sessionStorage,但是sessionstorage npm软件包中的polyfill将通过使用诸如在窗口的name属性中存储数据或使用cookie的技术在IE7(及更早版本)中添加此功能。


107
因此,尽管使用垫片来掩盖旧的罪过,但是使用填充胶可以使将来的改进恢复原状。这总结了我的一切。谢谢您的明确解释。
JohnnyQ

这个答案很有帮助,谢谢。但是在我看来,包括es5-shim在内,这两个术语通常并未在网络上准确使用。我认为es5-shim是您定义的垫片和polyfill的混合体。
马特·布朗

哇->因此,尽管使用垫片来掩盖旧的罪过,但使用填充胶可以使将来的功能恢复原状。<-非常感谢!
齐柏林飞艇

3
日期示例对我来说就像一个Polyfill。为什么我认为它是Polyfill?因为Date.now是本机调用。Polyfill将使用与浏览器无缝的相同API添加该功能。垫片附带新的API,例如:MyShim.Date.now(); 如果我输入错误,请更正我。
TatzyXY

99

据我了解:

polyfill是用于检测是否缺少某些“预期” API并手动实现的代码。例如

if (!Function.prototype.bind) { Function.prototype.bind = ...; }

填充程序是拦截现有API调用并实现不同行为的代码。这里的想法是在不同的环境中标准化某些API。因此,如果两个浏览器以不同的方式实现相同的API,则可以在其中一个浏览器中拦截API调用,并使其行为与另一个浏览器保持一致。或者,如果浏览器在其API之一中存在错误,则可以再次拦截对该API的调用,然后规避该错误。


66

引用Axel Rauschmayer的《Speaking JavaScript》一书:

  • 填充程序是一个库,它仅使用那种环境的方法就可以将新的API引入较旧的环境。
  • polyfill是浏览器API的填充程序。它通常检查浏览器是否支持API。如果不是,则polyfill将安装自己的实现。无论哪种情况,都可以使用API​​。术语“填充料”来自居家装饰产品;根据雷米·夏普Remy Sharp)的说法:

    Polyfilla是英国的一种产品,在美国被称为Spackling Paste。牢记这一点:将浏览器视为一堵裂缝。这些[polyfills]有助于消除裂缝,并为我们提供了一个很好的平滑浏览器墙。


9

真是的 填充程序是一个库,它仅使用那种环境的方法就可以将新的API引入较旧的环境。

Polyfill。2010年10月,雷米·夏普(Remy Sharp)在博客上写了“ polyfill”一词[通过Rick Waldron]:

polyfill是一段代码(或插件),它提供开发人员希望浏览器本机提供的技术。如果可以的话,请展平API景观。


8

几年前写的一篇很棒的文章对此进行了很好的解释:

什么是Polyfill?

在文章中,仅将(2)作如下对比:

Shim:您可以添加(例如JavaScript)可以修复某些功能的一段代码,但通常会拥有自己的API

Polyfill:您可以插入的东西(即JavaScript),它将以静默方式模仿现有的浏览器API,否则这些API将不被支持。


1
我认为这是对常用用法以及Remy Sharp在您链接到的博客文章中实际上所说的内容的误导性表示。最常同义词使用填充工具时下(见特别是ES5,垫片ES6-垫片)和雷米讲究说,给他一个自定义的API字“垫片”提到(用比较shim.gif)。他不是很在意使用这种方式使用这些词,而是通过对我说“”来默认他的用法不是普遍的。
Mark Amery 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.