两者似乎都在Web开发圈子中使用,请参见HTML5跨浏览器Polyfills ,其中说:
所以在这里,我们收集了所有的垫片,后备和填充物...
或者,有es5-shim项目。
在我当前的项目中,我们使用了许多这样的工具,我想将它们全部粘贴在同一目录中。 那么,我应该怎么称呼这个目录- shims
或polyfills
?
#1楼
据我了解:
polyfill是用于检测是否缺少某个“预期” API并手动实现的代码。 例如
if (!Function.prototype.bind) { Function.prototype.bind = ...; }
填充程序是拦截现有API调用并实现不同行为的代码。 这里的想法是在不同的环境中标准化某些API。 因此,如果两个浏览器以不同的方式实现相同的API,则可以在其中一个浏览器中拦截API调用,并使其行为与另一个浏览器保持一致。 或者,如果浏览器的一个API中存在错误,则可以再次拦截对该API的调用,然后规避该错误。
#2楼
引用Axel Rauschmayer的《 Speaking JavaScript》一书:
- 填充程序是一个库,它仅使用那种环境的方法就可以将新的API引入较旧的环境。
- polyfill是浏览器API的填充程序。 它通常检查浏览器是否支持API。 如果不是,则polyfill将安装自己的实现。 无论哪种情况,都可以使用API。 术语“填充料”来自居家装饰产品; 根据雷米·夏普 ( Remy Sharp)的说法:
Polyfilla是英国的一种产品,在美国被称为Spackling Paste。 牢记这一点:将浏览器视为一堵裂缝。 这些[polyfills]有助于消除裂缝,并为我们提供一道流畅的浏览器墙。
#3楼
几年前写的一篇很棒的文章对此进行了很好的解释:
在文章中,仅将(2)作如下对比:
Shim:您可以添加的一段代码(即JavaScript
)可以修复某些功能,但通常会拥有自己的API 。
Polyfill:您可以插入的东西(即JavaScript
),它将以静默方式模仿其他方式不支持的现有浏览器API 。
#4楼
真是的 填充程序是一个库,它仅使用那种环境的方法就可以将新的API引入较旧的环境。
Polyfill。 2010年10月,雷米·夏普(Remy Sharp)在博客上写了“ polyfill”一词[通过Rick Waldron]:
polyfill是一段代码(或插件),它提供开发人员希望浏览器本机提供的技术。 如果可以的话,请展平API景观。
#5楼
垫片
如果您熟悉适配器模式,那么您将知道垫片是什么。 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();
};
}
Polyfill
实际上,Polyfilling只是匀场的专用版本。 Polyfill是关于在API中实现缺少的功能的,而补片在实现缺失的功能方面并不一定要在纠正功能方面那么多。 我知道这些似乎过于模糊,但是在使用垫片作为更广义的术语的地方,polyfill用于描述为较旧的浏览器提供向后兼容性的垫片。 因此,尽管使用垫片来掩盖旧的罪过,但使用填充胶可以使将来的改进恢复原状。 例如,在IE7中不支持sessionStorage,但sessionstorage npm软件包中的polyfill将通过使用诸如在窗口的name属性中存储数据或使用cookie的技术在IE7(及更早版本)中添加此功能。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3165527