两者似乎都被用于web开发领域,例如HTML5 Cross Browser Polyfills,它说:

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

或者,还有es5-shim项目。

在我目前的项目中,我们使用了许多这些,我想把它们都放在同一个目录中。所以,我应该叫这个目录——垫片,还是填充物?


当前回答

据我所知:

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

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

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

其他回答

几年前有一篇关于这方面的精彩文章,很好地解释了这一点:

什么是Polyfill?

在文中,(2)被简单地对比如下:

Shim:你可以添加的一段代码(即JavaScript)来修复一些功能,但它通常有自己的API。

Polyfill:你可以加入的东西(即JavaScript),它会无声地模仿现有的浏览器api,否则不受支持。

引用Axel Rauschmayer在他的书《Speaking JavaScript》中的一句话:

A shim is a library that brings a new API to an older environment, using only the means of that environment. A polyfill is a shim for a browser API. It typically checks if a browser supports an API. If it doesn’t, the polyfill installs its own implementation. That allows you to use the API in either case. The term polyfill comes from a home improvement product; according to Remy Sharp: Polyfilla is a UK product known as Spackling Paste in the US. With that in mind: think of the browsers as a wall with cracks in it. These [polyfills] help smooth out the cracks and give us a nice smooth wall of browsers to work with.

据我所知:

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

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

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

shim是执行API调用拦截并提供抽象层的任何一段代码。它并不一定局限于web应用程序或HTML5/CSS3。 polyfill是一种填充物,通常使用Javascript或Flash将传统浏览器改造为现代HTML5/CSS3功能。

在回答您的特定问题时,如果您希望保持目录的通用性,请将目录称为shims。

Polyfill只是一个脚本用来检查浏览器中是否存在某个API ? 如果API不存在于浏览器填充(这是一个简单的脚本)将会像这样:

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

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

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

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