reactjs - 哪个加载器适合处理 React JSX?

标签 reactjs webpack-4

我试图让 webpack4 使用 main.js 生成输出文件夹,但不断返回“可能需要适当的加载器来处理此文件类型”错误并指向 jsx 行。如何让 webpack 转换 jsx,或者我需要什么样的 loader?

我认为问题可能是 @babel/preset-env 和 @babel/preset-react 已经过时,或者我需要使用更新的版本,但看起来情况并非如此。

webpack.config.js

module.exports = {
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: { loader: 'babel-loader' }
            }
        ]
    }
};

.babelrc

{
    "presets": [ "@babel/preset-env", "@babel/preset-react" ]
}

package.json

{
  "name": "github_battle",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "webpack --mode development",
    "build": "webpack --mode production"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.2.2",
    "@babel/preset-env": "^7.2.3",
    "@babel/preset-react": "^7.0.0",
    "babel-loader": "^8.0.5",
    "react": "^16.7.0",
    "react-dom": "^16.7.0",
    "webpack": "^4.28.3",
    "webpack-cli": "^3.2.0"
  }
} 

App.js

import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component {
    render (
        <p>React in here</p>
    );
};

export default App;

ReactDOM.render(
    <App />,
    document.getElementById('root')
);

index.js

import App from './App';

我希望 React 代码能够正确转换并捆绑到 dist/main.js 中。

实际结果:

> <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="583f312c302d3a073a392c2c343d186976687668" rel="noreferrer noopener nofollow">[email protected]</a> dev D:\WORK\github_battle
> webpack --mode development

Hash: a88a6be7f290c6ab30a1
Version: webpack 4.28.3
Time: 186ms
Built at: 01/04/2019 9:06:55 AM
    Asset      Size  Chunks             Chunk Names
main.js  4.58 KiB    main  [emitted]  main
Entrypoint main = main.js
[./src/App.js] 238 bytes {main} [built] [failed] [1 error]
[./src/index.js] 28 bytes {main} [built]

ERROR in ./src/App.js 7:8
Module parse failed: Unexpected token (7:8)
You may need an appropriate loader to handle this file type.
| class App extends React.Component {
|     render (
>         <p>React in here</p>
|     );
| };
 @ ./src/index.js 2:0-24
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0b6c627f637e6954696a7f7f676e4b3a253b253b" rel="noreferrer noopener nofollow">[email protected]</a> dev: `webpack --mode development`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="412628352934231e232035352d2401706f716f71" rel="noreferrer noopener nofollow">[email protected]</a> dev script.
npm ERR! This is probably not a problem with npm. There is likely 
additional logging output above.

最佳答案

主要错误是您错误地命名了 webpack 配置文件。

您将其命名为 webpack.conf.js,但 webpack 命令需要一个名为 webpack.config.js 的文件。

所以先重命名它。

现在,在 webpack 中,您没有提到 entryoutput ,这在您完成重命名后会导致错误。

因此将您的 webpack 配置文件重写为。

module.exports = {
    entry: "./src/App.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: { loader: 'babel-loader' }
            }
        ]
    }
};

现在,对于App.js,您错误地编写了ReactJS代码。应该是

import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component {
    render() {
        return (
            <p> React in here</p >
        );
    }
};

export default App;

ReactDOM.render(
    <App />,
    document.getElementById('root')
);

所以改变它。

按照这些步骤操作后应该可以工作。

关于reactjs - 哪个加载器适合处理 React JSX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54036208/

相关文章:

reactjs - 运行从 git 克隆的 npm 项目

javascript - 什么 webpack 加载器可以解析 html 文件中的 <svg> 元素

javascript - 如果启用了热模块替换,为什么在更改 HTML 时 LiveReload 在 Webpack 中不起作用?

javascript - babel 无法使用 webpack 4 转换 .marko 文件

javascript - Webpack 插件用 ast 改变内容

reactjs - 如何使用react redux单独连接数组的每个元素

reactjs - 无法通过可访问的名称找到警报

javascript - 如何在ReactJS中将应用程序状态传递给后端?

reactjs - 配置 Cypress、cypress-react-unit-test 和 React

javascript - 对于无渲染组件, enzyme 浅层返回未定义