webpack babel loader无法编译jsx

时间:2016-11-01 09:58:40

标签: javascript reactjs webpack babeljs react-jsx

我试图运行一个简单的样板来进行react + webpack +热模块更换。但我实际上坚持使用babel / jsx步骤并需要帮助。我跟随this article

目前我已经:

webpack.config.js

module.exports = {
  context: __dirname + "/app",
  entry: "./app.js",

  output: {
    filename: "app.js",
    path: __dirname + "/dist",
  },

  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: ["babel-loader"],
      }
    ],
  },
}

app/app.js

import React from "react";
import Greeting from "./greeting";

React.render(
  <Greeting name="World"/>,
  document.body
);

app/greetings.js

import React from "react";

export default React.createClass({
  render: function() {
    return (
      <div className="greeting">
        Hello, {this.props.name}!
      </div>
    );
  },
});

,这在package.json

  "devDependencies": {
    "babel-core": "^6.18.0",
    "babel-loader": "^6.2.7",
    "webpack": "^1.13.3"
  },
  "dependencies": {
    "react": "^15.3.2"
  }

当我在控制台中运行webpack时,正如教程所说,它应该运行webpack(以及下面的babel)并捆绑整个应用程序,但它没有 - 相反,它会引发跟随错误:

$ webpack
Hash: 9a56cc72acac2de6f40c
Version: webpack 1.13.3
Time: 543ms
    + 1 hidden modules

ERROR in ./app.js
Module build failed: SyntaxError: C:/Users/abc/Tests/webpack-react-hmr/app/app.js: Unexpected token (7:2)

   5 |
   6 | React.render(
>  7 |   <Greeting name="World"/>,
     |   ^
   8 |   document.body
   9 | );
  10 |

我是这个主题的新手,所以我不知道问题是什么,但肯定的是,webpack无法理解JSX语法。可能this part of the tutorial错误或过时:

  

幸运的是,Babel加载程序支持转换ES2015和JSX   意味着我们可以使用单个加载器而不是要求   babel-loader和jsx-loader。

     

我们可以使用以下命令安装babel加载程序:

npm install babel-loader --save-dev

如何修复webpack / jsx / babel设置?

2 个答案:

答案 0 :(得分:2)

您需要使用babel预设来编译react和其他ES6,ES7功能。

所需预设列表:

  1. 最新
  2. 反应
  3. 阶段-0
  4. 将此文件.babelrc添加到您的根目录。

    {
     "presets": ["latest", "react", "stage-0"],
    }
    

    并执行此安装

    npm install --save-dev babel-preset-latest babel-preset-react babel-preset-stage-0
    

    现在,运行webpack。它应该工作!

答案 1 :(得分:0)

您需要安装Babel。这是编译jsx文件的关键。

首先安装它:

npm i -D @babel/preset-react @babel/preset-env @babel/core babel-loader @babel/plugin-proposal-class-properties

然后创建以下文件,并设置如下配置

/
  .babelrc
  webpack.config.js

.babelrc文件:

{
  "presets": [
 [ "@babel/preset-env", {
   "modules": false,
   "targets": {
  "browsers": [
    "last 2 Chrome versions",
    "last 2 Firefox versions",
    "last 2 Safari versions",
    "last 2 iOS versions",
    "last 1 Android version",
    "last 1 ChromeAndroid version",
    "ie 11"
  ]
   }
 } ],
 "@babel/preset-react"
  ],
  "plugins": [ "@babel/plugin-proposal-class-properties" ]
}

webpack.config.js文件:

module.exports = {
    ...
    module: {
        rules: [
            {
                test: /\.js?$/,
                exclude: /node_module/,
                use: 'babel-loader'
            },
        ]
    }
};

现在运行webpack。它必须工作正常。