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

时间:2011-07-06 16:26:39

标签: terminology naming vocabulary polyfills shim

两者似乎都用于网络开发圈子,例如HTML5 Cross Browser Polyfills,其中说:

  

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

或者,有es5-shim项目。

在我目前的项目中,我们正在使用其中的一些,我想将它们全部放在同一目录中。那么,我该怎么称呼这个目录--- shimspolyfills

8 个答案:

答案 0 :(得分:327)

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

  • polyfill 是一种类型的shim ,可以使用现代HTML5 / CSS3功能改进旧版浏览器,通常使用Javascript或Flash。

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

答案 1 :(得分:196)

Shim

如果您熟悉适配器模式,那么您就知道垫片是什么。 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()< / em>相反。这种拦截称为匀场。来自es5-shim的相关源代码如下所示:

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

<强>填充工具

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

答案 2 :(得分:95)

据我所知:

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

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

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

答案 3 :(得分:63)

从他的书Axel Rauschmayer中引用Speaking JavaScript

  

      
  • 垫片是一个库,它使用新的API将旧API带到旧环境中   只有那种环境的手段。
  •   
  • polyfill是浏览器API的垫片。它通常检查是否是浏览器   支持API。如果没有,则polyfill会自行安装   实现。这允许您在任何一种情况下使用API​​。该   术语polyfill来自家居装饰产品;根据{{​​3}}:

         
        

    Polyfilla是一种英国产品,在美国被称为Spackling Paste。考虑到这一点:将浏览器视为一个有裂缝的墙。这些     [polyfill]帮助平滑裂缝,给我们一个漂亮的光滑墙     使用的浏览器。

  •     

  

答案 4 :(得分:9)

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

填充工具, 2010年10月,雷米·夏普(Remy Sharp)发表了关于“polyfill”一词的博文[来自Rick Waldron]:

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

答案 5 :(得分:6)

几年前写的一篇很棒的文章很好地解释了这一点:

What is a Polyfill?

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

Shim:您可以添加的一段代码(即JavaScript)可修复某些功能,但通常会有 它自己的API < / EM>

Polyfill:您可以放入的内容(例如JavaScript),它会默默地模仿 现有的浏览器API 否则不受支持。

答案 6 :(得分:0)

Polyfill只是一个脚本,它将检查浏览器中特定API的存在,好吗? 如果浏览器中不存在该API,则polyfill(这是一个简单的脚本)将执行以下操作:

例如,我将在浏览器中使用Bluetooth API,并且我知道某些浏览器没有此类API,因此我将编写类似这样的内容以检查我的API是否存在:

<select id="tei_pager" class="form-select">
<option value="10917" selected="selected">1</option>
<option value="10918">2</option>
<option value="10919">3</option>
<option value="10920">4</option>
<option value="10921">5</option>
<option value="11192">6</option>
<option value="11193">7</option>
</select>
<a href="javascript:void(0);" onclick="selectOption(0);">First Page</a>
<a href="javascript:void(0);" onclick="selectOption(6);">Sixth Page</a>

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

实际上,它将覆盖现有的API并实现不同的行为,以便在较旧的浏览器中支持新的API。 值得注意的是,垫片通常用于向后兼容。

答案 7 :(得分:0)

垫片是拦截 API 调用并提供抽象层的任何代码段。它并不总是限于 Web 应用程序或 HTML5/CSS3。而 polyfill 是一种 shim,它使用 Javascript 或 Flash 来改造具有现代 HTML5/CSS3 功能的旧浏览器。