首页 > web前端 > js教程 > Polyfills——填充物还是缝隙? (第 1 部分)

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

WBOY
发布: 2024-08-28 06:10:02
原创
1105 人浏览过

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

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

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

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

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

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

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

这应该给我们足够的背景知识来说明为什么我对 Polyfills 着迷了一天,直到我写这篇文章的那一刻。

现在,Babel 有一个名为 babel/polyfill 的包,它由 2 个库组成:core-js 和 regenerator-runtime。最初,导入此包将使所有的 polyfill 生效。

import '@babel/polyfill';
登录后复制

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

{
  "presets": [
    ["@babel/preset-env", {
      "useBuiltIns": "usage",
      "corejs": 3
    }]
  ]
}
登录后复制

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

import "core-js/es/array/includes";
import "core-js/es/promise";
登录后复制

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

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

但是。这还不是全部。

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

以上是Polyfills——填充物还是缝隙? (第 1 部分)的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板