polyfill 是一种 shim,它用对shim的调用替换了原始调用。
例如,假设您想使用 navigator.mediaDevices 对象,但并非所有浏览器都支持此功能。您可以想象一个提供垫片的库,您可以像这样使用它:
<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 不需要任何更改”的意思。