【问题标题】:Rails Webpacker and stage-2 class transform properties not workingRails Webpacker 和 stage-2 类转换属性不起作用
【发布时间】:2017-08-22 06:22:35
【问题描述】:

我正在一个新的 Rails 应用程序上试用 Webpacker 以熟悉它,但我无法让它编译我的 javascript 代码。

代码如下:

import React, { Component, PropTypes } from 'react'
import DayPicker, { DateUtils } from 'react-day-picker'
import 'react-day-picker/lib/style.css'

export default class Example extends Component {
  constructor(props) {
    super(props)
    this.state = {
      selectedDays: []
    }
  }

  handleDayClick = (day, selected) => {
    console.log(day)
  }

  render() {
    return (
      <p>Test</p>
    )
  }
}

20:05:21 hot.1  | ERROR in ./app/javascript/packs/components/example/example.jsx
20:05:21 hot.1  | Module build failed: SyntaxError: Missing class properties transform.
20:05:21 hot.1  |
20:05:21 hot.1  |   11 |   }
20:05:21 hot.1  |   12 |
20:05:21 hot.1  | > 13 |   handleDayClick = (day, selected) => {
20:05:21 hot.1  |      |   ^

这是一个全新的 Rails 应用程序,使用来自 github 的最新 Webpacker gem。

我的.babelrc

{
  "presets": ["env", "es2015", "react", "stage-2"]
}

我的 devDependencies 是:

"devDependencies": {
  "babel-preset-es2015": "^6.24.0",
  "babel-preset-stage-2": "^6.22.0",
  "webpack-dev-server": "^2.4.2"
}

根据这个 Babel REPL 链接,这应该可以工作。 https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&targets=&browsers=&builtIns=false&experimental=true&loose=false&spec=false&code=class%20PostInfo%20extends%20React.Component%20%7B%0A%09handleOptionsButtonClick%20%3D%20(e)%20%3D%3E%20%7B%0A%20%20%20%20this.setState(%7BshowOptionsModal%3A%20true%7D)%3B%0A%20%20%7D%0A%7D

有什么想法吗?

【问题讨论】:

  • 那么你的渲染方法在哪里?每个组件都必须有一个渲染方法,这可能是我们的问题(至少如果是这样的话会更容易:))
  • @iceman 已编辑,为简洁起见,我将其省略了
  • @iceman 如果我删除 stage-2 预设,我会得到这个不同的错误:模块构建失败:SyntaxError: Unexpected token (13:17) - 指向等号:handleDayClick =

标签: javascript ruby-on-rails webpack ecmascript-6 babeljs


【解决方案1】:

为了解决这个问题,我必须将预设添加到各个加载器文件中,特别是。

// config/webpack/loaders/babel.js
module.exports = {
  test: /\.js(\.erb)?$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    presets: [
      'es2015',
      'stage-2'
    ]
  }
}

// config/webpack/loaders/react.js
module.exports = {
  test: /\.(js|jsx)?(\.erb)?$/,
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    presets: [
      'es2015',
      'react',
      'stage-2'
    ]
  }
}

现在我可以使用漂亮的速记箭头类函数了。

【讨论】:

    【解决方案2】:

    您的评论最有启发性:这是一个类中的方法声明;不应该有等号或粗箭头。它应该是这样的:

    handleDayClick (day, selected) {
        console.log(day)
    }
    

    看看constructorrender 方法的外观;这就是反应组件中所有方法的外观。

    天哪!

    【讨论】:

    • 是的,你可以创建一个这样的函数,但是我需要在构造函数中绑定它。我想使用箭头函数来自动绑定它。你看到 Babel REPL 中的例子了吗? babeljs.io/repl/…
    • 嗯,我的错。我以前从未见过使用它;当我学会反应时,我被教导这是不可行的。
    • 我在 SO 上找到了this 答案;这是相同的错误消息。答案是 .babelrc 和 webpack 配置文件不匹配。看看这个?
    • 查看this 网站。将插件添加到.babelrc,然后重试
    • 该插件是 stage-2 的一部分,因此它已经包含在内。 babeljs.io/docs/plugins/preset-stage-2
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2018-10-08
    • 1970-01-01
    • 2014-10-11
    • 2017-03-07
    相关资源
    最近更新 更多