”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Polyfills——填充物还是缝隙? (第 1 部分)

Polyfills——填充物还是缝隙? (第 1 部分)

发布于2024-11-05
浏览:245

Polyfills - a filler or a gaping hole? (Part-1)

几天前,我们在组织的 Teams 聊天中收到一条优先消息,内容如下:发现安全漏洞 - 检测到 Polyfill JavaScript - HIGH
举个例子,我在一家大型银行公司工作,你必须知道,银行和安全漏洞就像主要的敌人。因此,我们开始深入研究这个问题,并在几个小时内解决了这个问题,我将在下面讨论。但好的(或最坏的?)部分是当我最初用谷歌搜索这个问题时,弹出的搜索结果让我在一天剩下的时间里都着迷!

让我们强调一下现代浏览器和传统浏览器之间的差异。以下是最新 Chrome 版本与 Internet Explorer (IE) 9 的比较。现代浏览器支持大量 ES6 功能,同时,许多公司仍在使用的 IE9 和 IE11 几乎不支持任何 ES6 功能。
这里来帮助解释一下 transpiling 的概念,在 JavaScript 中,它指的是将以现代 JavaScript(ES6/ES2015 及更高版本)编写的源代码转换为旧版本(如 ES5) ,较旧的浏览器广泛支持。一个非常流行的转译器是 Babel,它提供了一系列功能,如语法转换、代码捆绑(以及 Webpack)和对 JSX 的支持(为我们亲爱的朋友 React!)。

现在,在有大量现代语法的地方,转译器的使用非常普遍,并且必须确保不同环境之间的兼容性。请注意,将整个代码库转换为不同的版本需要大量时间,并且还需要为 Babel 等设置构建过程和附加配置。不言而喻的是,除了转换语法功能之外,还涵盖了在旧浏览器中扩展相同功能复制的 API 功能。

参考Babel,它构成了很多包,为不同类型的功能提供插件,例如将ES6类、箭头函数等转换为等效的JS代码。其中,它还提供了自己的“polyfill”包。

Polyfills 是一些代码片段,使旧浏览器能够提供相同/几乎相同的 JS 功能,这些功能它们本身不提供,但在较新的浏览器版本中显示。 这是一个快速视频示例和非常简单的实现。

现在有人可能会想,那么转译器和 Polyfill 之间有什么区别呢?嗯,polyfill 专注于模拟缺失的特定 API,而不是将整个代码库更改为由转译器完成的旧浏览器友好版本。这允许采用更细粒度的方法,当然,也使其更加高效和性能。

这应该给我们足够的背景知识来说明为什么我在写这篇文章的那一刻之前就着迷了一天。

现在,Babel 有一个名为 babel/polyfill 的包,它由 2 个库组成:core-js 和 regenerator-runtime。最初,导入这个包将使所有的polyfills发挥作用。

import '@babel/polyfill';

但是引入所有内容(无论您的项目是否会使用它们)、增加包大小以及全局注入填充可能会导致对象冲突。
这导致弃用该包,Babel 建议直接使用 core-js 库
第一步:修改babel配置

{
  "presets": [
    ["@babel/preset-env", {
      "useBuiltIns": "usage",
      "corejs": 3
    }]
  ]
}

第 2 步:手动导入您要在项目中使用的 Polyfills

import "core-js/es/array/includes";
import "core-js/es/promise";

因此,节省内存并减少不必要的代码。

现在,这是一个部分的结束,本身并不那么重要,但对于项目来说绝对重要,了解依赖项的最新变化,为客户提供更好的体验。

但。这还不是全部。

我们即将讨论最近发生的一次重大攻击,该攻击震动了整个互联网并让他们搜索代码库。
而且,它包括我们在这里讨论的内容。敬请期待第二部!

版本声明 本文转载于:https://dev.to/purnez/polyfills-a-filler-or-a-gaping-hole-l3h?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-10
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-10
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-07-10
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-10
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-10
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-07-10
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-07-10
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-07-10
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-10
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-10
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-10
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-07-10
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-07-10
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。要简化过程,建议将JSON作为数组而不是对象解析。执行此操作,将JSON_DECODE函数与第二个参数设置为true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ j...
    编程 发布于2025-07-10
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-10

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3