Webpack babel 6 ES6 装饰器

IT技术 javascript webpack ecmascript-6 babeljs decorator
2021-03-15 12:09:07

我有一个用 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)中工作,它会有所帮助。

5个回答

这个 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本机

随着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"]
}

请参阅此问题和答案以获得完整的解释。

谢谢@loganfsmyth。我已经更新的答案,包括production以及
2021-04-29 12:09:07
我的意思是,为什么要把它放在一个env块中?你可以plugins作为兄弟姐妹presets
2021-05-03 12:09:07
终于能够让这个工作。原来我必须安装transform-class-properties以及babeljs.io/docs/plugins/transform-class-properties并确保遗留插件前的转换类插件按照该文档github.com/loganfsmyth/babel-plugin-变换装饰器inheritance
2021-05-03 12:09:07
@am5255,它似乎仍然对我有用。你介意向作者提交一个问题吗?github.com/loganfsmyth/babel-plugin-transform-decorators-legacy/...
2021-05-10 12:09:07
您可能不希望只为development.
2021-05-14 12:09:07

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

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

我写下所有这些,因为经过数小时的搜索,我发现当前的文档非常糟糕且缺乏。

@Pavlin,虽然您的回答可能是正确的,但下面列出的插件现在应该是公认的答案。
2021-04-26 12:09:07
从那个问题开始,制作了一个“尽力而为”的遗留插件。有关限制,请参阅自述文件:npmjs.com/package/babel-plugin-transform-decorators-legacy
2021-05-03 12:09:07
我可以确认转换装饰器的inheritance作为临时解决方案对我有用。
2021-05-11 12:09:07

仅安装babel-plugin-transform-decorators-legacy对我不起作用(我有一个使用酶和业力的配置)。结果证明安装transform-class-propertiestransform-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"]
    }
  },
在这里和那里花一个小时,这些东西对我有用。非常感谢
2021-05-10 12:09:07

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

@amcdnl 我的印象是转换装饰器插件是官方插件,但由于 TC39 限制而未实现,同时还有这个 - github.com/loganfsmyth/babel-plugin-transform-decorators-legacy
2021-04-17 12:09:07
对我来说仍然失败了。
2021-05-11 12:09:07
@Qiming 是的,这就是我最终使用的东西,babel 官方甚至说,如果你挖得足够深......他们的想法非常糟糕,imo
2021-05-14 12:09:07

如果您将项目从 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