polyfill 是一种 shim,它用对 shim 的调用替换了原始调用。
例如,假设您想使用 navigator.mediaDevices 对象,但并非所有浏览器都支持此功能。您可以想象一个提供 shim 的库,您可以像这样使用它:
<script src="js/MediaShim.js"></script>
<script>
MediaShim.mediaDevices.getUserMedia(...);
</script>
在这种情况下,您是显式调用 shim 而不是使用原始对象或方法。另一方面,polyfill 替换了原始对象上的对象和方法。
例如:
<script src="js/adapter.js"></script>
<script>
navigator.mediaDevices.getUserMedia(...);
</script>
在您的代码中,看起来好像您正在使用标准的 navigator.mediaDevices 对象。但实际上,polyfill(示例中的adapter.js)已经用它自己的对象替换了这个对象。
它取代它的是一个垫片。这将检测该功能是否本机支持并使用它,如果不支持,它将使用其他 API 解决它。
所以 polyfill 是一种“透明”的垫片。这就是 Remy Sharp(这个词的创造者)在说“如果你删除了 polyfill 脚本,你的代码将继续工作,而无需任何更改,尽管 polyfill 被删除”时的意思。