编译假设

2021-05-12 11:08:04

默认情况下,BABEL尝试编译代码,以便与您尽可能贴近本机行为。然而,这有时意味着产生更多的输出代码或较慢的输出代码,只是为了支持一些边缘案例,你不在乎。

由于Babel 7.13.0,您可以在配置中指定假设选项,以告诉Babel哪些假设它可以弄乱的代码,以更好地优化编译结果。注意:这取代了插件中的各种松动选项,支持可应用于多个插件(RFC链路)的顶级选项。

⚠这是高级功能。启用假设时请小心,因为它们不是符合规范,并且可能以意想不到的方式打破代码。

扩展或迭代阵列样对象时,假设它实现了具有本机阵列[符号.Iterator]的相同行为的[symbol.iderator]方法,从而通过索引直接迭代其元素。

当从模块重新出口绑定时,假设它不会改变,从而使其安全直接出口'安全性,仿佛你正在做

可以使用Object.SetPrototypeof随时更改类的超级类,使Babel无法静态地了解它。启用此选项后,Babel会假定它从未更改过,因此始终是类声明中扩展子句中的值。

编译ESM到CJS时,Babel在Module.prosts对象上定义了__esmodule属性。假设您从未迭代Module.Exports或需要("您的模块")使用for...in或object.key,因此它安全地将__esmodule定义为枚举。

函数具有.Length属性,其反映了上次非默认参数的参数数。 启用此选项后,假设已编译的代码不依赖于此.Length属性。 功能fn(a,b = 2,c,d = 3){返回a + b + c + d;} 使用可能调用[符号的语言功能]对象的方法,假设它们不会根据提示参数更改其行为。 使用可迭代对象时(在数组破坏,for-of或Spreads)时,假设它是一个数组。 const [首先,...休息] = obj;呼叫(首先,... obj);让arr = [first,... obj]; for(const of obj){console.log(el);} don' t使用object.freeze for for tabled模板文字创建的模板对象。 这种有效地使用TaggedTempleTeliterAlloose Helper而不是TaggedTempleTeliteral。 在转换类时,假设它们始终与新功能实例化,并且它们永远不会被称为函数。

使用检查NULL或未确定的运算符时,假设它们永远不会与特殊值文档一起使用。

假设代码永远不会尝试使用新的新功能实例化箭头函数,该箭头函数根据规范不允许。

注意:此假设默认为true。从Babel 8开始,它将默认为false。

在对象破坏中使用REST模式时,假设破坏性对象DON' T有符号键或者它'如果没有复制,那就不是问题。

假设"软隐私"足够的私有字段,因此它们可以使用唯一名称存储为公共非逗录属性(而不是使用外部弱窗口)。这使得调试编译的私有字段更容易。

在声明类时,假设方法Don' T阴影吸气器上的超类,程序不依赖于不可识别的方法。因此,它的安全分配方法而不是使用Object.DefineProperty。

使用计算对象属性时,假设对象并包含覆盖同一对象中定义的Setter的属性,因此' s安全分配它们而不是使用object.defineproperty定义它们。

使用公共类字段时,假设它们不会在当前类中的任何吸气剂,在其子类中或其超类中。 因此,它的安全分配它们而不是使用Object.DefineProperty。 使用对象传播时,假设传播属性Don' t触发目标对象上的getters,因此它安全地分配它们而不是使用object.defineproperty定义它们。 使用与迭代器一起使用时,应始终使用.return()和.throw()如果出现错误。 当此选项称为babel时,假定这些方法未定义或空,并且避免调用它们。 扩展类时,假设超类是可调用的。 这意味着它赢得了' t,可以扩展本机类或内在的内置,但只有编译的类或ES5功能构造函数。