垫片和填充物有什么区别?

Dom*_*nic 382 naming terminology vocabulary shim polyfills

两者似乎都在Web开发圈中使用,例如参见HTML5 Cross Browser Polyfills,它说:

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

或者,有es5-shim项目.

在我目前的项目中,我们使用了其中的一些,我想将它们全部放在同一目录中.那么,我该怎么称呼这个目录--- shims,或者polyfills

Ars*_*med 355

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

  • 一个填充工具是一种类型垫片是翻修,传统的浏览器与通常使用JavaScript或Flash现代化HTML5/CSS3功能.

shims如果您想保持目录的通用性,请回答您的具体问题,将其称为您的目录.


Kje*_*sen 215

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

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}
Run Code Online (Sandbox Code Playgroud)

填充工具

Polyfilling实际上只是垫片的专用版本.Polyfill是关于在API中实现缺失的功能,而垫片不一定与实现缺失功能一样多,因为它与纠正功能有关.我知道这些看起来过于含糊,但是当垫片被用作更广泛的术语时,polyfill用于描述为旧版浏览器提供向后兼容性的垫片.因此,虽然垫片用于掩盖旧的罪恶,但是使用填充物可以及时恢复未来的增强. 例如,IE7中不支持sessionStorage,但是sessionstorage npm包中的polyfill将通过使用诸如在窗口的name属性中存储数据或使用cookie等技术在IE7(及更早版本)中添加此功能.

  • ***因此,虽然垫片用于掩盖旧的罪恶,但是使用填充物可以及时恢复未来的增强效果.***这总结了我的一切.谢谢你的明确解释. (95认同)
  • 日期示例对我来说就像一个Polyfill。为什么我认为它是Polyfill?因为Date.now是本机调用。Polyfill将使用与浏览器无缝的相同API添加该功能。垫片提供了新的API,例如:`MyShim.Date.now();`如果我输入错了,请纠正我。 (3认同)

Šim*_*das 95

据我所知:

polyfill是检测某个"预期"API是否缺失并手动实现它的代码.例如

if (!Function.prototype.bind) { Function.prototype.bind = ...; }
Run Code Online (Sandbox Code Playgroud)

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


Ber*_*rgi 65

引用Axel Rauschmayer的书" Speaking JavaScript":

  • 垫片是一种库,它只使用该环境的方式将旧API带入旧环境.
  • polyfill是浏览器API的垫片.它通常会检查浏览器是否支持API.如果没有,则polyfill会安装自己的实现.这允许您在任何一种情况下使用API​​.polyfill一词来自家居装饰产品; 根据雷米夏普的说法:

    Polyfilla是一种英国产品,在美国被称为Spackling Paste.考虑到这一点:将浏览器视为一个有裂缝的墙.这些[polyfill]有助于消除裂缝,并为我们提供一个漂亮的光滑墙壁浏览器.


小智 9

沉.垫片是一种库,它只使用该环境的方式将旧API带入旧环境.

填充工具.2010年10月,Remy Sharp发表了关于"polyfill"一词的博文[来自Rick Waldron]:

polyfill是一段代码(或插件),它提供了开发人员期望浏览器本机提供的技术.如果愿意,可以展平API环境.


atc*_*way 8

几年前写的关于此的精彩文章很好地解释了这一点:

什么是Polyfill?

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

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

Polyfill:你可以放入的东西(即JavaScript),它可以默默地模仿现有的浏览器API,否则这些API是不受支持的.