【问题标题】:Webpack babel 6 ES6 decoratorsWebpack babel 6 ES6 装饰器
【发布时间】:2016-02-21 10:38:14
【问题描述】:

我有一个用 ES6 编写的项目,其中 webpack 作为我的打包器。大多数转译工作正常,但是当我尝试在任何地方包含装饰器时,我收到此错误:

Decorators are not supported yet in 6.x pending proposal update.

我查看了 babel 问题跟踪器,但在那里找不到任何东西,所以我假设我用错了。我的 webpack 配置(相关位):

loaders: [
  {
    loader: 'babel',
    exclude: /node_modules/,
    include: path.join(__dirname, 'src'),
    test: /\.jsx?$/,
    query: {
      plugins: ['transform-runtime'],
      presets: ['es2015', 'stage-0', 'react']
    }
  }
]

我对其他任何东西都没有问题,箭头函数,解构都可以正常工作,这是唯一不起作用的。

我知道我总是可以降级到 babel 5.8,我在不久前就可以使用它,但是如果有任何方法可以在当前版本 (v6.2.0) 中使用它,它会有所帮助。

【问题讨论】:

  • 我认为既然我包含了 stage-0 预设,它们就会得到转换的属性。装饰器是第 1 阶段预设的一部分,应该包括变换装饰器。正如 babel 网站上所写。
  • @Pavlin 我在想这是否可能是presets 的排序问题。
  • 我以为可能是这样,但我再次测试了它。无论如何,我都会得到一个错误。显然顺序确实很重要,但我认为这不是问题所在。

标签: javascript webpack ecmascript-6 babeljs decorator


【解决方案1】:

这个 Babel 插件对我有用:

https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy

npm i --save-dev babel-plugin-transform-decorators-legacy

.babelrc

{
  "presets": ["es2015", "stage-0", "react"],
  "plugins": [
    ["transform-decorators-legacy"],
    // ...
  ]
}

网页包

{
  test: /\.jsx?$/,
  loader: 'babel',
  query: {
    cacheDirectory: true,
    plugins: ['transform-decorators-legacy' ],
    presets: ['es2015', 'stage-0', 'react']
  }
}

反应原生

对于react-native,您必须改用babel-preset-react-native-stage-0 插件。

npm i --save babel-preset-react-native-stage-0

.babelrc

{
  "presets": ["react-native-stage-0/decorator-support"]
}

完整的解释请看question and answer

【讨论】:

【解决方案2】:

在 babeljs slack 网络聊天上花了 5 分钟后,我发现装饰器在当前版本的 babel (v6.2) 中被破坏了。目前唯一的解决方案似乎是降级到 5.8。

他们似乎也将问题跟踪器从 github 移至 https://phabricator.babeljs.io

我把所有这些都写下来了,因为经过数小时的搜索,我发现当前的文档很差而且缺乏。

【讨论】:

  • 从那个问题开始,制作了一个“有限制的尽力而为”的遗留插件。有关限制,请参阅自述文件:npmjs.com/package/babel-plugin-transform-decorators-legacy
  • 我可以确认转换装饰器的遗留对我来说是一种临时解决方案。
  • @Pavlin,虽然你的答案可能是正确的,但下面列出的插件应该是目前公认的答案。
【解决方案3】:

只安装babel-plugin-transform-decorators-legacy 对我不起作用(我有一个使用酶和业力的配置)。原来安装transform-class-properties:transform-class-properties 并且根据transform-decorators-legacy 中的文档确保遗留插件在转换类插件之前最终使它对我有用。

我也没有使用.babelrc 文件,但将其添加到我的karma.conf.js 文件对我有用:

babelPreprocessor: {
  options: {
    presets: ['airbnb', 'es2015', 'stage-0', 'react'],
    plugins: ["transform-decorators-legacy", "transform-class-properties"]
  }
}

我还将它添加到我的装载机中:

loaders: [
  {
    test: /\.js$/,
    loader: 'babel',
    exclude: path.resolve(__dirname, 'node_modules'),
    query: {
      presets: ['airbnb', 'es2015', 'stage-0', 'react'],
      plugins: ["transform-decorators-legacy", "transform-class-properties"]
    }
  },

【讨论】:

  • 在这里和那里花一个小时,这对我有用。非常感谢
【解决方案4】:

您只需要一个转换装饰器插件:http://babeljs.io/docs/plugins/transform-decorators/

【讨论】:

  • 对我来说仍然失败。
  • @amcdnl 我的印象是转换装饰器插件是官方的,但由于 TC39 的限制而未实现,同时还有这个 - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
  • @Qiming 是的,这就是我最终使用的东西,babel 官方甚至说,如果你挖得够远.. imo 他们的想法很糟糕
【解决方案5】:

如果你将项目从 Babel 6 升级到 Babel 7,那么你想安装 @babel/plugin-proposal-decorators

如果你想支持 Babel 5 中使用的遗留装饰器,你需要配置你的 .babelrc 如下:

plugins: [
      ['@babel/plugin-proposal-decorators', { legacy: true }],
      ['@babel/plugin-proposal-class-properties', { loose: true }],
]

确保@babel/plugin-proposal-decorators 出现在@babel/plugin-proposal-class-properties 之前,以防您使用后者。

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 2016-05-18
    • 1970-01-01
    • 2017-02-04
    • 2018-09-19
    • 2016-06-27
    • 2016-02-05
    • 2017-04-23
    相关资源
    最近更新 更多