垫片和polyfill之间的区别是什么?

两者似乎都被用在网络开发圈子中,例如参见HTML5 Cross Browser Polyfills,它说:

所以我们在这里收集所有的垫片,回退和polyfill ...

或者,有es5-shim项目。

在我目前的项目中,我们正在使用其中的一些,我想将它们全部放在同一个目录中。 那么,我应该称之为这个目录--- shims ,还是polyfills


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

  • polyfill是一种填充类型,它通过使用Javascript或Flash来改进传统浏览器和现代HTML5 / CSS3功能。

  • 回答你的具体问题,如果你想保持目录的通用性,就把它称为你的目录shims


    如果您熟悉适配器模式,那么您知道垫片是什么。 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();
        };
    }
    

    填充工具

    Polyfilling实际上仅仅是一种专业版的匀场。 Polyfill是关于在API中实现缺少的功能的,而垫片并不一定就像实现缺少的功能一样,而是关于纠正功能。 我知道这些看起来过于模糊,但垫片用作更广泛的术语,polyfill用于描述为旧版浏览器提供向后兼容性的垫片。 因此,尽管垫片用于掩盖旧的罪恶,但是填充物可用于将未来的增强功能推迟。 例如,IE7中不支持sessionStorage,但sessionstorage npm包中的polyfill将通过使用诸如在窗口的name属性中存储数据或使用cookie之类的技术在IE7(及更早版本)中添加此功能。


    从我的理解:

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

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

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

    链接地址: http://www.djcxy.com/p/62157.html

    上一篇: What is the difference between a shim and a polyfill?

    下一篇: Variadic Template Template