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

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

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

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]删除
最新教程 更多>
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-04-15
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能显示图像时未能显示图像时遇到了一个问题。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-15
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-15
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-04-15
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-04-15
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-15
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-04-15
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-04-15
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-04-15
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-15
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-04-15
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。要简化过程,建议将JSON作为数组而不是对象解析。执行此操作,将JSON_DECODE函数与第二个参数设置为true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ j...
    编程 发布于2025-04-15
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-15
  • 如何从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-04-15

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

Copyright© 2022 湘ICP备2022001581号-3