Babel插件proposal-decorators未按预期工作

7

我在我的package.json文件中添加了这两个开发依赖项:

"@babel/plugin-proposal-class-properties": "^7.1.0",
"@babel/plugin-proposal-decorators": "^7.1.6",

.babelrc文件中,我已将它们添加为插件:

{
    "presets": ["module:metro-react-native-babel-preset"],
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true}],
        ["@babel/plugin-proposal-class-properties", { "loose": true}]
    ]
}

我使用mobx,所以observable是干净的语法,我的文件看起来像这样:

class AppStore {
  @observable username = ''
}

export default (new AppStore())

但是一直显示出现这个错误:

我认为我已经正确地完成了,但是无法检测到babel插件是否已加载。

在 Babel 沙箱 https://babeljs.io/repl 中,两个插件都无法加载。 - Zydnar
1个回答

4

首先,请确保您使用的是最新版本的metro-react-native-babel-preset,他们在9天前发布了一个新的小版本0.50.0

如果这没有帮助,那么问题很可能来自于metro-react-native-babel-preset已经包含类属性插件,正如您所知,插件的顺序很重要您需要在类属性插件之前运行修饰符。

关于babel的排序问题,已经有很多讨论了。虽然插件应该在预设之前运行,但这仍然会成为一个问题。不幸的是,添加插件排序功能的PR #5735 仍在进行中。

与此同时,您可以自己fork metro-react-native-babel-preset 并将装饰器插件添加到我指定的位置之前的类属性插件中。您还可以尝试制作自己的babel预设,按正确顺序包含这两个插件,并在metro预设之后添加它,因为预设是以相反的顺序加载的,即从最后到最前,如此处所示。

另外,值得一试的是使用yarn start --reset-cache启动打包程序,这可能会解决由于错误/过时缓存引起的问题。


"..并且正如你所知道的,插件的顺序很重要,你需要在类属性插件之前运行装饰器" - 谢谢!我已经在过去的几个小时里一直在为让我的工作区装饰器正常工作而苦苦挣扎,这就是问题所在。 - goodforenergy
@Aperçu 你好,谢谢你的信息。我解决的方法是运行 yarn start 而不是默认的 Metro Bundler,当我输入 react-native run-ios 时会出现。我认为这样更好,你可以将其添加为答案,这样我就可以将你的答案标记为解决方案了。 - Shirshak55
因为 run-ios 生成相同的 start 命令,所以你遇到的问题很可能是由于缓存错误而不是简单地使用 yarn 导致的。 - Preview

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接