一个非常简单的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”错误消息,而不是随机堆栈跟踪。
答案 0 :(得分:0)
每a discussion on Babel's GitHub,这是正确的行为。
引用@ nicolo-ribaudo的回复,
旧的装饰器提案未指定与类私有属性的任何交互。
在松散模式下,它们的处理方式可能类似于装饰公共松散字段的方式,但这将需要对我们的旧版装饰插件进行大量重构。
同时,我希望看到一条友好的错误消息。