破坏网站功能的外部脚本中全局polyfill的风险是什么?

问题描述 投票:2回答:1

@babel/polyfill的文档有以下注释:

如果您正在寻找不会修改要在工具/库中使用的全局变量的东西,请查看transform-runtime插件。

transform-runtime文档中,它说如下:

虽然这个[@ babel / polyfill用法]可能适用于应用程序或命令行工具,但如果您的代码是您打算发布供其他人使用的库,或者如果您无法准确控制环境,则会出现问题您的代码将在其中运行。

更一般地说,许多解释使用polyfill的文章说如果你关心污染全局命名空间,使用可能想要使用不同的解决方案。

根据我的理解,大多数polyfills是有条件加载的。如果实现已存在,则polyfill将不会覆盖它。我的问题是:在什么样的情况下,外部脚本中的polyfill会导致现有网站中断?到目前为止,我能够找到的唯一原因是外部脚本可能比网站本身的代码更早地加载polyfill。这可能会导致问题,但当这些polyfill基于Web标准时,它们的行为应该是相同的。仍然存在严重冲突的可能性有多大?

我在github issue上发现了一个有趣的讨论。这主要讨论NPM生态系统中的模块,而我最感兴趣的是外部脚本,它们可以促进诸如小部件或嵌入之类的东西。

任何个人经验或关于该主题的讨论和文章的链接表示赞赏!

更新:这个问题的主要原因之一是transform-runtime存在一些问题。随着核心js和babel的新发布,​​这些问题似乎已得到解决。无论我对上述原始问题的答案仍然感兴趣。

javascript babel polyfills web-standards babel-polyfill
1个回答
1
投票

嗯,polyfills很少是完美的,正如你所说,他们几乎都有条件地工作。

如果我需要来自polyfillX的东西,那个polyfillY并不关心实现,说Promise.then()应该在同一个事件循环中触发而不是它们解决,而不是在下一个像正常事件那样,并且lib1首先加载polyfillY,这只是使用setTimeout(0)而不是在可用时使用MutationObserver进行lazy-patched,这对于不需要该功能的lib1可能没问题,但是我的polyfillX不会启动,我需要的功能将不会在那里。

因此,我希望我的Promise按照他们不应该被欺骗的方式工作,所有这一切都是因为lib1决定我要包含哪些polyfill。

这就是为什么在编写库时,最好链接到polyfill,但不要自己包含它们。

© www.soinside.com 2019 - 2024. All rights reserved.