- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
@babel/polyfill 的文档有以下注释:
If you are looking for something that won't modify globals to be used in a tool/library, checkout the transform-runtime plugin.
关于 transform-runtime文档,它说如下:
While this [@babel/polyfill usage] might be ok for an app or a command line tool, it becomes a problem if your code is a library which you intend to publish for others to use or if you can't exactly control the environment in which your code will run.
更一般地说,很多解释 polyfill 使用的文章都说,如果您关心污染全局命名空间,您可能想要使用不同的解决方案。
据我了解,大多数 polyfill 都是有条件地加载的。如果一个实现已经存在,polyfill 将不会覆盖它。我的问题是:在什么样的情况下,外部脚本中的 polyfill 会导致现有网站崩溃?到目前为止我能找到的唯一原因是外部脚本可能比网站本身的代码更早加载 polyfill。这可能会导致问题,但是当这些 polyfill 基于 web 标准时,它们的行为应该是相同的。仍然存在严重冲突的可能性有多大?
我在 github issue 上发现了一个有趣的讨论。 .不过,这主要讨论 NPM 生态系统中的模块,而我主要对促进小部件或嵌入等事物的外部脚本感兴趣。
感谢任何个人经验或指向有关该主题的讨论和文章的链接!
更新:这个问题的主要原因之一是转换运行时存在一些问题。随着 core-js 和 babel 的新发布,这些问题似乎已经得到解决。不管怎样,我仍然对上述原始问题的答案感兴趣。
最佳答案
嗯,polyfill 很少是完美的,正如您所说,它们几乎都是有条件地工作的。
假设 library-1 为名为 Interface 的功能注入(inject)了它自己的 polyfill (polyfill-A)。
这个 polyfill-A 可以很好地实现 Interface 的完整 API 的几个方法,例如,官方 API 可能是这样的
interface Interface {
constructor(optional (Interface or DOMString) foo);
undefined doSomething();
undefined doSomethingElse();
};
但在构造函数中传递一个 Interface
实例可能只是稍后在规范中添加,或者 doSomethingElse
可能已被该 polyfill 省略,或者根本没有经过测试正确并且所有这些小遗漏对于 library-1 可能没问题,因为它们不使用任何这些。
现在,当 library-2 自己的 polyfill 将检查是否已经有可用的 Instance
构造函数时,它会发现是的,它已经被定义,因此不会重新 -实现它。
但是,library-2 可能需要在构造函数中传递一个接口(interface),或者可能需要调用它的 doSomethingElse()
方法。当它尝试这样做时,代码会崩溃,因为即使 library-2 的作者确实包含了一个正确实现这两个功能的 polyfill,library-1 的 polyfill 实现是运行和可访问的。
<script>
// library-1.js
(function polyfillInterface() {
if (typeof Interface !== "function") {
class Interface {
constructor(foo) {
this.foo = foo.toUpperCase();
}
doSomething() {
return this.foo + "-bar";
}
}
globalThis.Interface = Interface;
}
})();
{
// for library-1, everything works well
const instance = new Interface("bla");
console.log(instance.doSomething());
}
</script>
<script>
// library-2.js
(function polyfillInterface() {
if (typeof Interface !== "function") {
class Interface {
constructor(foo) {
if (foo instanceof Interface) {
this.foo = foo.foo;
}
else if (typeof foo === "string") {
this.foo = foo.toUpperCase();
}
else {
throw new TypeError("neither an Interface nor a DOMSrting");
}
}
doSomething() {
return this.foo + "-bar";
}
doSomethingElse() {
return this.foo.toLowerCase() + "-bar";
}
}
globalThis.Interface = Interface;
}
})();
{
// for library-2, everything is broken
const instance_1 = new Interface("bla");
try {
console.log(instance_1.doSomethingElse());
}
catch(err) {
// instance_1.doSomethingElse is not a function
console.error(err);
}
// TypeError: foo.toUpperCase is not a function
const instance_2 = new Interface(instance_1);
}
</script>
而且这可能是很难确定的事情,例如 Promise.then()
应该在与它们解决(在微任务队列中)相同的事件循环中触发,而不是在下一个事件循环中触发就像普通任务一样,许多 Promise 库可能一直在使用 setTimeout(fn, 0)
来实现异步性,而不是例如在可用时使用 MutationObserver。 p>
这就是为什么在编写库时,最好链接到 polyfill,但不要自己包含它们。
关于javascript - 外部脚本中的全局 polyfill 破坏网站功能的风险是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241379/
我有一个 Magento 网站,其中似乎没有出现交叉销售产品。 在查看 Stack 和 Google 之后,似乎“重新索引数据”已经为很多人解决了这个问题。 我的问题是,执行此任务是否有任何风险?或者
为了避免在某些简单命令中使用括号,我编写了以下运算符以创建新的图形窗口。我的问题是:除了明显无法在我的变量“ newdev”上执行“ not”功能之外,我是否有“破坏” R中任何内容的风险? # fu
你好 我正在开发一个联系表格。我正在使用邮件功能将其通过电子邮件发送给网站管理员。 是否存在有人可以注入(inject)恶意 javascript 和任何其他注入(inject)攻击的风险? $to
我想知道在 Objective C 中将消息传递给 nil 对象不会执行任何操作,这样依赖是否存在任何风险。 在我的代码中,我有很多对 UIKit 和其他对象的弱引用,这些引用可能随时被清除。由于我来
我被指派修复遗留代码的安全问题,并获得了安全扫描的结果: Poor Error Handling: Server Error Message ( 10932 ) 基本上,当扫描尝试使用一些奇怪的代码进
我有一个匿名类,在创建时需要使用自引用。我的业务代码可以简化为如下代码,我知道这段代码: final Runnable runnable=new Runnable() { @Override
有几个基类是我无法控制的:- class BaseNode // Just a POD class. No VTable { void foo(); } class BaseHost { publ
这个问题已经有答案了: Do I have to guard against SQL injection if I used a dropdown? (11 个回答) 已关闭 7 年前。 我希望我的网
这是根据用户提供的输入创建表的简单过程: PROCEDURE `hackProcedure`( IN tab_name VARCHAR(63)) BEGIN IF (tab_name REGEXP '
我知道在您的网站上显示用户输入时,使用 php 中的 htmlentities() 之类的函数来清理用户输入很有用。但是这样的事情会带来 XSS 风险吗? " /> 像这样清理输入会更好吗? " />
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
谁能阐明图表上曲线的含义、阴影区域的含义以及轴的含义? 最佳答案 这是对风险随时间变化的预测。在 NCrunch wiki 中有一些文档对此进行了描述:http://wiki.ncrunch.net/
我有一个包含 200 万条记录的集合,如果可能的话,我希望在不停机的情况下在其上添加单个字段索引。 我的问题是:是否可以/需要备份集合?使用 azure 门户创建索引在后台运行它而不会造成任何服务停机
我正在使用Symfony2并使用 CSRF token 保护我的表单。 我有一个基于 Ajax 调用的评论系统。如果用户想要编辑他的评论,则会发生以下情况: 用户点击编辑按钮。 通过 ajax 加载“
Checkmark 扫描了我们的代码并显示这些代码存在二阶注入(inject)的风险像这样的代码 @SuppressWarnings("unchecked") public List> findByS
我有一个包含几百行的小型 MySQL 数据库(全部为文本,无图像)。我正在使用 iQuery 请求所有行并在客户端进行所有过滤。 iQuery 代码如下: $(document).ready( fun
如果我的网站只允许用户查看他们自己提交的数据,而永远不允许其他用户提交的数据(即没有一般的“帖子”等)——那么我的网站是否真的存在 XSS 风险? 我仍将致力于 XSS 解决方案(如 httmlspe
我正在构建一个 iframe,而不是 innerHTML , 但带有 createElement .. 我使用了两个不受信任的字符串: iframeEl.title = untrustedStr1;
我正在生成如下动态prepareStatement(字段可能会根据请求输入而变化)。 Veracode 扫描持续报告 SQL 注入(inject)风险 - CWE-89:SQL 命令中使用的特殊元素的
我有一个可以在英语和德语之间切换语言的应用程序。当使用德语时,我希望货币显示将自动转换为德语格式。因此,在我的程序中,我必须检查区域设置,然后根据所选语言转换货币。我选择使用 locale.setDe
我是一名优秀的程序员,十分优秀!