Arrow Синтаксис функции не работает с webpack?
Я делаю приложение для реакции-редукта. Я использую 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']
}
}
]
}
};
и я использую следующие пакеты babel в моем пакете. json:
"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",
Что пошло бы неправильно?
Ответы
Ответ 1
Удар в темноте, это функция внутри класса? Функции Arrow, являющиеся членами класса, не включены в ES2015 (или 2016). Если вы хотите сделать что-то вроде:
class Foo {
bar = (baz) => {
console.log(baz);
}
}
Вам нужно будет включить свойства babel-transform-class.
В вашем примере вам нужно:
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']
}
}
Ответ 2
Это именно то, что сработало для меня:
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']
}
]
},
..........
};
Ответ 3
Сначала вам нужно отредактировать файл .babelrc в
{
"presets": ["react", ["es2016"]],
"plugins": [
"babel-plugin-transform-class-properties"
]
}
Второй npm install babel-plugin-transform-class-properties
и babel-preset-es2016
Ответ 4
Также, если вы хотите привыкнуть к новому шоу, вы можете использовать файл babel.config.js
вместо .babelrc
. Идея похожа на файл webpack.config.js
, но для конфигураций babel. Он был использован как ниже:
module.exports = {
presets: [ "@babel/preset-env", "@babel/preset-react" ],
plugins: [ "@babel/plugin-transform-arrow-functions", "@babel/plugin-proposal-class-properties" ]
}
Убедитесь, что установили все эти плагины для успешной компиляции. Я должен сказать, что сама Babel просто рекомендовала сделать все эти вещи в файле .babelrc
для каждого. Но вы знаете, мы не каждый.