nodejs reactjs 和 webpack,配置错误但是什么?

nodejs reactjs and webpack, config is wrong but what?

我知道有很多资源描述了设置,我已经尝试了几种方法,但事情变化得太快以至于我 google 的例子已经过时了 - 这里是

package.json
{
  "name": "scoreboard",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.3.15",
    "babel-loader": "^6.2.0",
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-react": "^6.3.13",
    "babelify": "^7.2.0",
    "react": "^0.14.3",
    "react-dom": "^0.14.3",
    "webpack": "^1.12.9"
  }
}

这是我的webpack.config.js

module.exports = {
    context: __dirname + "/app",
    entry: "./main.js",
    output: {
        filename: "main.js",
        path: __dirname + "/dist"
    },
    module: {
        loaders: [
        {
            test: /\.js$/,
            exclude: /node_modules/,
            loaders: ["babel-loader"],
            query: {
                presets: ["react", "es2015"]
            }
        }
        ]
    }
}

目录结构

app
- greeting.js
- main.js
dist
node_module
package.json
webpack.config.js

greeting.js

的内容
import React from "react";

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

main.js

的内容
import React from "react";
import Greeting from "./greeting";

React.render(
        <Greeting/>,
        document.body
);

但是当我 运行

$ webpack Hash: 553345561044745134b3 Version: webpack 1.12.9 Time: 2573ms
    + 1 hidden modules

ERROR in ./main.js Module build failed: SyntaxError: /Users/kristiannissen/Documents/js/scoreboard/app/main.js: Unexpected token (5:8)   3     4 React.render(
> 5        <Greeting/>,
           ^   6         document.body   7 );   8

据我所知,<Greeting/> 没有按预期呈现。要全部安装我 运行 npm install --save react react-dom babelify babel-preset-react --save-dev

更新 将查询添加到 webpack.config.js 但是当 运行ning webpack 我现在得到这个

$ webpack
.../scoreboard/node_modules/webpack-core/lib/LoadersList.js:54
        if(!element.loader || element.loader.indexOf("!") >= 0) throw new Error("Cannot define 'query' and multiple loaders in loaders list");

仍然没有放弃我希望的方式

更新 将 webpack.config.js 更改为

module.exports = {
    context: __dirname + "/app",
    entry: "./main.js",
    output: {
        filename: "main.js",
        path: __dirname + "/dist"
    },
    module: {
        loaders: [
        {
            test: /\.js$/,
            exclude: /node_modules/,
            loader: "babel-loader",
            query: {
                presets: ["react", "es2015"]
            }
        }
        ]
    }
}

并安装提到的模块,太棒了!我的问候语文件中有错字,return 函数不应使用 {} 而应使用 ()

完整 package.json

{
  "name": "scoreboard",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.3.15",
    "babel-loader": "^6.2.0",
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-react": "^6.3.13",
    "babelify": "^7.2.0",
    "react": "^0.14.3",
    "react-dom": "^0.14.3",
    "webpack": "^1.12.9"
  }
}

您需要将您安装的 babel-preset-react 添加到 webpack 配置中。您可能还需要将 'loaders' 属性 更改为仅 'loader' 并将 'es2015' 预设添加到查询数组,因为您也安装了它。

loaders: [
    {
       test: /\.js$/,
       exclude: /node_modules/,
       loader: "babel-loader",
       query: {
           presets: ['react', 'es2015']
       }
    }
]

您遇到的第一个问题是 Babel 无法解析和转换 JSX 语法。

安装 babel-preset-react 解决了这个问题,您通过 查询对象有效。

但是,当使用 query : { } 时,您必须定义一个加载器(单数)而不是一个加载器数组(复数)。这就是最后一条错误消息告诉您的内容。

loaders: ["babel-loader"] 替换为 loader: "babel-loader" 应该可以解决您的问题。