垫片和填充物的区别是什么?

两者似乎都在web开发圈子中使用,参见e.g. HTML5跨浏览器填充,它说:

所以我们在这里收集所有的垫片、备用材料和填充物……

或者,有es5-shim项目。

在我目前的项目中,我们使用了许多这些,我想把它们都放在同一个目录中。那么,我应该如何称呼这个目录——shims,还是polyfills?

97545 次浏览
  • shim是执行API调用拦截并提供抽象层的任何一段代码。它并不一定局限于web应用程序或HTML5/CSS3。

  • polyfill是一个类型的shim,通常使用Javascript或Flash将传统浏览器与现代HTML5/CSS3功能进行改造。

回答你的具体问题,如果你想保持目录的通用,调用你的目录shims

据我所知:

polyfill是检测是否缺少某个“预期的”API并手动实现它的代码。如。

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

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

引用他的书< em >说JavaScript < / em >中的阿克塞尔Rauschmayer:

< p > < ul > shim是一个库,它将一个新的API引入到旧的环境中,使用 polyfill是浏览器API的填充。它通常检查浏览器是否 支持API。如果没有,填充材料会自行安装 实现。这允许您在任何一种情况下使用API。的 polyfill一词来自一种家装产品;根据雷米 锋利的< / >:< / p >

polyfillilla是一种英国产品,在美国被称为Spackling Paste。记住这一点:把浏览器想象成一堵有裂缝的墙。这些 填充物有助于抚平裂缝,给我们一个漂亮光滑的墙壁 < / ul > < / p >

垫片

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

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

Polyfill

Polyfilling实际上只是shimming的一个专业版本。Polyfill是关于在API中实现缺失的特性,而shim不一定是关于实现缺失的特性,而是关于纠正特性。我知道这些看起来过于模糊,但是垫片是一个更广泛的术语,polyfill用于描述为旧浏览器提供向后兼容性的垫片。所以当垫片被用来掩盖过去的罪恶时,填充物被用来把未来的增强带回过去。 例如,在IE7中不支持sessionStorage,但sessionstorage npm包中的polyfill将在IE7(及更老版本)中通过使用诸如将数据存储在窗口的name属性或使用cookie等技术添加此功能

Polyfill只是一个检查浏览器中是否存在某个API的脚本? 如果API不存在于浏览器的polyfill(这是一个简单的脚本)将表现如下:

例如,我要在浏览器中使用蓝牙API,我知道有些浏览器没有这样的API,所以我会写一些这样的东西来检查我的API是否存在:

if(!navigator.bluetooth) { // write polyfill here }

Shim也是一个脚本,主要是作为一个插件或库提供的,它是如何工作的?

实际上,它将覆盖一个已经存在的API并实现不同的行为,以便在旧的浏览器中支持新的API。 值得注意的是,Shims主要用于向后兼容