javascript - 为什么 Babel 需要 polyfill 而不是默认转译某些方法?

标签 javascript webpack babeljs ecmascript-5

我一直在通过一门类(class)学习如何在 Javascript 中使用 babel,我理解了带有预设“env”的 babel 将 ES 的更高版本转换为 ES5 的想法。但是我遇到了一个场景,其中数组“includes”方法根本没有被 babel 改变并且在 IE11 上不起作用,为了解决这个问题,我读到有一个可以使用的 babel polyfill。

我遇到了一个试图解释这一点的答案,但我根本没有遵循它。有人可以简单地解释一下为什么默认情况下 babel 不处理所有 ES 转换并需要 polyfill。

如果我理解正确,那么 polyfill 是一种旨在填补空白以使不受支持的东西工作的东西,但我认为这是 babel 默认情况下应该做的工作。

最佳答案

polyfill 使用语言本身的旧版本来实现新功能。例如,Babel 通过在 ES5 本身中实现方法来支持 ES6 array.includes。有点像

Array.prototype.includes = function(val) { 
    return this.indexOf(val) >= 0;
}

另一方面,babel 的核心库是一个转译器。这负责将较新版本的 javascript 的功能转换为旧版本,而这些功能无法通过在旧版本中编写 polyfill 来实现。例如,将 ES5 的 letconst 转换为 var,或将箭头函数转换为传统函数,就不可能编写一个 polyfill。像这样的操作需要一个转译器来遍历代码并将其转换。

关于javascript - 为什么 Babel 需要 polyfill 而不是默认转译某些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73354844/

相关文章:

javascript - 为什么我的 $(selector).index(filter selector) 返回不正确的结果?

javascript - 条件函数的结构?

javascript - Jquery 无法在 php 包含页面中工作

typescript - Babel 7 + Inversify 4 + WebPack 4-@inject上的意外字符 '@'

typescript - karma , typescript 定义文件未加载

javascript - Webpack 全局 JS 错误处理程序和 "Script error"

node.js - 如何告诉 webpack 忽略 Node 模块,包括核心模块和从 npm 安装的模块?

javascript - Node.JS readFileSync() 函数

javascript - Babel/Rollup 错误转译和捆绑 ES2017

javascript - 为什么我的脚本仅在缩小后才抛出 'Cannot redefine property: i' 错误?