📜  shim 和 polyfill 有什么区别?(1)

📅  最后修改于: 2023-12-03 14:47:26.775000             🧑  作者: Mango

Shim vs Polyfill

程序员们经常会使用“shim”和“polyfill”这两个术语,但很多人不清楚这两个术语之间的区别。简单来说,shim和polyfill都是在浏览器缺乏标准API的情况下帮助程序员实现某些特性的工具。但是它们之间有一些细微但重要的差别。

Shim

Shim是一个小的库,它可以在不存在某些标准API时实现这些API。它在某些浏览器中添加了自己的API实现,使得代码可以在所有浏览器上通用。Shim通常用于临时解决问题,比如处理一些API兼容性问题。Shim库通常不会增加太多的代码量,因为它们只是在必要时提供了缺失的功能。以下是一个示例:

if (!Array.prototype.forEach) {
  Array.prototype.forEach = function(callback) {
    for (var i = 0; i < this.length; i++) {
      callback(this[i], i, this);
    }
  };
}

在这个例子中,我们检查Array对象是否已经实现了forEach方法。如果不存在,我们就实现了一个forEach方法,并将其添加到Array原型中。这个Shim库只包括了很少的代码,它使用浏览器原本就具有的功能,没有添加任何新的API。

Polyfill

Polyfill是一个更大的库,它可以在不存在某些标准API时实现这些API,并向后兼容到更老的浏览器。与Shim不同,Polyfill通常会实现一个完整的标准API,并且可能会引入一些新的API。Polyfill库通常会增加更多的代码量,并且可能会依赖于一些新的技术(如ES2015)。

以下是一个Polyfill库示例:

if (!String.prototype.startsWith) {
  String.prototype.startsWith = function(searchString, position) {
    position = position || 0;
    return this.indexOf(searchString, position) === position;
  };
}

在这个例子中,Polyfill库实现了String原型上的startsWith方法,并提供了完整的API,包括必要的参数和返回值。这个Polyfill库使用了一些es6代码,如箭头函数。

结论

尽管shim和polyfill之间有所重叠,但它们的区别很明显:Shim解决的是浏览器兼容性问题,Polyfill解决的是缺失API的问题。在选择使用哪一个工具时,需要考虑所需功能和代码体积。Shim通常更适用于短期解决方案,而Polyfill则更适用于长期项目。