箭头函数语法不适用于 webpack?

IT技术 javascript webpack babeljs
2021-03-06 18:56:58

我正在 react-redux 上制作一个应用程序。我使用 webpack 进行捆绑,使用 babel 进行转译。当我尝试在我的代码中使用箭头函数时。它给了我以下错误:

Module build failed: SyntaxError: Unexpected token (34:15)

};

> handleSubmit = (event) => {
                  ^
  event.preventDefault();

  this.props.dispatch(actions.addTodo(this.state.inputText));

我的 webpack 配置文件如下所示:

module.exports = {
  devtool: 'inline-source-map',
  entry: [
    'webpack-hot-middleware/client',
    './client/client.js'
  ],
  output: {
    path: require('path').resolve('./dist'),
    filename: 'bundle.js',
    publicPath: '/'
  },
  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['react', 'es2015', 'react-hmre']
        }
      }
    ]
  }
};

我在 package.json 中使用了以下 babel 包:

 "babel-cli": "^6.6.5",
"babel-core": "^6.4.5",
"babel-loader": "^6.2.2",
"babel-preset-es2015": "^6.3.13",
"babel-preset-react": "^6.3.13",
"babel-preset-react-hmre": "^1.1.1",

出了什么问题?

5个回答

暗中暗杀,这个函数是在一个类中吗?作为类成员的箭头函数不包含在 ES2015(或 2016)中。如果你想做类似的事情:

class Foo {
  bar = (baz) => {
    console.log(baz);
  } 
}

您需要包含babel-transform-class-properties

在您的示例中,您需要:

npm install --save-dev babel-plugin-transform-class-properties

并将您的装载机更改为

{
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['react', 'es2015', 'react-hmre'],
          plugins: ['transform-class-properties']
        }
      }
是的,这个函数在一个类中:(
2021-04-21 18:56:58

另外,如果你想习惯新的 babel 秀,你可以使用babel.config.jsfile 而不是.babelrc. 这个想法类似于webpack.config.jsfile ,但用于 babel 配置。它的用法如下:

module.exports = {
  presets: [ "@babel/preset-env", "@babel/preset-react" ],
  plugins: [ "@babel/plugin-transform-arrow-functions", "@babel/plugin-proposal-class-properties" ]
}

确保安装所有这些插件以成功编译。我应该说 babel 本身只是建议将所有这些.babelrc文件都放在文件中。但你知道,我们不是每一个人。

这正是对我有用的:

1) 安装 babel-plugin-transform-class-properties:

sudo npm install --save-dev babel-plugin-transform-class-properties

2)向您的规则添加选项(不是查询):

module.exports = {
    ..........
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel-loader',
                options: {
                    presets: ['env', 'react', 'es2015'],
                    plugins: ['transform-class-properties']
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    ..........
};

首先,您需要将 .babelrc 文件编辑为

{
 "presets": ["react", ["es2016"]],
 "plugins": [
     "babel-plugin-transform-class-properties"
  ]
}

第二npm install babel-plugin-transform-class-properties和 babel-preset-es2016

在我的应用程序中,这个问题是由于 less-loader 错误地添加为依赖包而不是 devDependency 引起的。

在 package.json 文件中将 less-loader 从依赖项移动到 devDependencies 解决了这个问题。