基本的Babel转换因堆栈跟踪而失败

时间:2019-06-29 01:25:31

标签: javascript babeljs

一个非常简单的Babel配置失败,我不确定为什么。使用语法插件代替转换器可以起作用,因此Babel能够正确解析此示例。

我知道在不使用{ legacy: true }的情况下使用装饰器提案会导致错误,因为尚未最终确定私有成员与装饰器的交互方式。但是,遗留提案(或我认为)没有这种问题。

Babel配置:

module.exports = {
  plugins: [
    ['@babel/proposal-decorators', { legacy: true }],
    ['@babel/proposal-class-properties', { loose: true }],
  ],
};

要构建的文件:

class Foo {
  @Decorator
  #bar = '';
}

尝试构建会导致以下错误(仅修改为删除不相关的路径信息):

TypeError: Property value expected type of string but got null
    at Object.validate (./node_modules/@babel/types/lib/definitions/utils.js:161:13)
    at validate (./node_modules/@babel/types/lib/validators/validate.js:17:9)
    at builder (./node_modules/@babel/types/lib/builders/builder.js:46:27)
    at Object.StringLiteral (./node_modules/@babel/types/lib/builders/generated/index.js:335:31)
    at ./node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:93:83
    at Array.reduce (<anonymous>)
    at applyTargetDecorators (./node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:84:32)
    at applyMethodDecorators (./node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:70:10)
    at PluginPass.ClassExpression (./node_modules/@babel/plugin-proposal-decorators/lib/transformer-legacy.js:156:94)
    at newFn (./node_modules/@babel/traverse/lib/visitors.js:193:21)

这是在全新安装中执行的。依赖关系是:

@babel/cli@^7.4.4
@babel/core@^7.4.5
@babel/plugin-proposal-decorators@^7.4.4
@babel/plugin-proposal-class-properties@^7.4.4

NB:实际上,我不需要转换装饰器-这是由另一个插件处理的。我曾尝试将装饰器转换器替换为语法插件,但是随后收到一条错误消息,指出未启用装饰器。

这是Babel中的错误吗?如果有的话,它应该失败并显示“ nice”错误消息,而不是随机堆栈跟踪。

1 个答案:

答案 0 :(得分:0)

a discussion on Babel's GitHub,这是正确的行为。

引用@ nicolo-ribaudo的回复,

  

旧的装饰器提案未指定与类私有属性的任何交互。

     

在松散模式下,它们的处理方式可能类似于装饰公共松散字段的方式,但这将需要对我们的旧版装饰插件进行大量重构。

     

同时,我希望看到一条友好的错误消息。