HTML5中polyfills的含义是什么?

IT技术 javascript html fallback polyfills shim
2021-02-19 03:25:39

HTML5 中的 polyfills 是什么意思?我在很多关于 HTML5 的网站上看到过这个词,例如HTML5-Cross-Browser-Polyfills。

所以在这里我们收集了所有的 shim、fallbacks 和 polyfills,以便在原生不支持它们的浏览器中植入 HTML5 功能。

我其实不明白 polyfills 是什么意思。

它是一种新的 HTML5 技术还是一个 JavaScript 库?在 HTML5 之前我从未听说过这个词。

shims、fallbacks 和 polyfills 之间有什么区别?

6个回答

polyfill 是一种浏览器回退,用 JavaScript 制作,它允许您期望在现代浏览器中工作的功能在旧浏览器中工作,例如,在旧浏览器中支持画布(HTML5 功能)。

这是一种 HTML5 技术,因为它与 HTML5 结合使用,但它不是 HTML5 的一部分,并且您可以在没有 HTML5 的情况下使用 polyfill(例如,支持您想要的 CSS3 技术)。

这是一个很好的帖子:

http://remysharp.com/2010/10/08/what-is-a-polyfill/

这是 Polyfills 和 Shims 的完整列表:

https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills

垫片更通用。polyfill 是一种垫片。这是一个很好地解释它的问题:stackoverflow.com/questions/6599815/...
2021-04-20 03:25:39
是:“许多修复,包括 PNG 透明度、CSS 样式/选择器、渲染错误修复等。” 它通过浏览器尚不支持的 javascript 添加此功能。
2021-04-24 03:25:39
所以这意味着 ie7.js 也是一个 polyfill
2021-04-28 03:25:39
remysharp.com/2010/10/08/what-is-a-polyfill这个链接不仅仅是一个“好帖子”,它实际上是创造这个词的人对这个词的完整定义和起源。摘录:“Polyfilla 产品(在美国是spackling)是一种可以涂在墙上以覆盖裂缝和孔洞的糊状物。” 这篇文章还涵盖了 shim 早于 polyfill 并且不同于 polyfill 的概念。这是必读的,IMO。
2021-05-10 03:25:39
我认为 Polyfills 这个词是在 HTML5 之后出现的。Shim 与 Polyfills 不同吗?
2021-05-11 03:25:39

首先让我们澄清一下 polyfil 不是什么:polyfill 不是 HTML5 标准的一部分。polyfill 也不限于 Javascript,即使您经常看到在这些上下文中引用 polyfill。

术语 polyfill 本身指的是一些代码,“允许您拥有某些特定功能,这些功能您期望在当前或“现代”浏览器中也可以在其他不支持内置功能的浏览器中使用。

此处 polyfill 的来源和示例:

http://www.programmerinterview.com/index.php/html5/html5-polyfill/

polyfill 是一段代码(或插件),它提供了您(开发人员)希望浏览器本地提供的技术。

简短,清晰,切中要害。这应该是公认的答案。
2021-04-22 03:25:39
很好解释。
2021-05-09 03:25:39

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 不需要任何更改”的意思。

什么是垫片?
2021-04-22 03:25:39
@Oliver Watkins 如果您熟悉适配器模式,那么您就知道垫片是什么。Shims 拦截 API 调用并在调用者和目标之间创建一个抽象层。通常垫片用于向后兼容
2021-04-23 03:25:39
@AnuragRatna 我不会使用“拦截”来避免混淆..拦截通常是指(透明地)拦截的代码,即在调用者不知道的情况下。Shims提供API 调用以实现向后兼容性
2021-05-09 03:25:39

Web 开发中polyfill是在不支持该功能的 Web 浏览器上实现该功能的代码。它通常是指实现 HTML5 或 CSS 网络标准的 JavaScript 库,既可以是现有浏览器上的既定标准(受某些旧浏览器支持),也可以是提议标准(不受任何浏览器支持)。根据定义,“polyfill 是浏览器 API 的垫片”。

HTML5 标准不包含 polyfill。Polyfill 不仅限于 Javascript,尽管它们在该上下文中经常被提及。