无法导入React JS组件

时间:2018-10-17 07:01:45

标签: javascript reactjs babel

我试图将react组件导入jsx文件,但是它抛出此异常: import error react

这是我的主要代码:

import React, { Component } from "react";
import Sidebar from "./Sidebar";

class App extends Component{
    render(){
        return (
            <Sidebar/>
        );
    }
}

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

这是我的补充工具栏组件:

import React, { Component } from "react";

export default class Sidebar extends Component{
    render(){
        return (
            <h1>Hello Sidebar</h1>
        );
    }
}

我的文件夹结构:

Folder Structure react

2 个答案:

答案 0 :(得分:3)

我发布了一个我知道可以工作的简单版本:

./ index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import Application from './components/Application'

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

./ components / Application:

import React from 'react';

class Application extends React.Component {
  render() {
    return (
      <div className="App">
        My Application!
      </div>
    );
  }
}

export default Application;

这应该是使其工作所需的一切。

如果您想通过缩短底部的export行来进一步缩短上述内容,那么一种不太传统的方法就是定义这样的类...

export default class Application extends React.Component {...}

答案 1 :(得分:1)

好像您没有在webpack.config.js中为.jsx文件添加规则。

由于同时具有.js和.jsx文件,因此需要告诉webpack加载扩展名为.js和.jsx的文件。在规则部分的config下面添加到webpack.config.js

    {
        //tell webpack to use jsx-loader for all *.jsx files
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        loader: "babel-loader"
    }

并添加扩展名,例如

   resolve: {
    modules: [
        path.resolve("./src"),
        path.resolve("./node_modules")
    ],
    extensions: [".js", ".jsx"]
  }

下面是供您参考的有效webpack.config.js文件

module.exports = {
    target: "web",
    entry: [
        "whatwg-fetch",
        'webpack-dev-server/client',
        'webpack/hot/only-dev-server',
        'babel-polyfill',
        "./src/index.js"
        ],
    output: {
        path: __dirname + 'build',
        publicPath: '/',
        filename: "bundle.js"
    },
    plugins: [new HtmlWebpackPlugin({
        template: "index.html"
    }),
    new CompressionPlugin({
        asset: "[path].gz[query]",
        algorithm: "gzip",
        test: /\.js$|\.jsx$|\.css$|\.html$/,
        threshold: 10240,
        minRatio: 0.8
    }),
    new webpack.HotModuleReplacementPlugin(),
    // enable HMR globally

    new webpack.NoEmitOnErrorsPlugin()
    ],
    module: {
        rules: [
            {
                //tell webpack to use jsx-loader for all *.jsx files
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                loader: "babel-loader"
            },
            {
                test: /\.css$/,
                loader: "style-loader!css-loader"
            },
            {
                test: /\.(png|jpg|jpeg|gif|svg|woff|woff2)$/,
                use: [
                  {
                    loader: 'file-loader',
                    options: {}
                  }
                ]
            },
            {
                test: /\.(eot|ttf)$/,
                loader: "file-loader",
            },
            {
                test: /\.scss$/,
                loaders: ["style-loader", "css-loader", "sass-loader"]
            }
        ]
    },
    resolve: {
        modules: [
            path.resolve("./src"),
            path.resolve("./node_modules")
        ],
        extensions: [".js", ".jsx"]
    },
    devServer: {
        watchOptions: {
        // Needed for Windows Subsystem for Linux dev environment:
            poll: true
        },
        contentBase: './build'
    },
    devtool: "cheap-module-eval-source-map",
    node: {
        child_process : "empty",
        fs: "empty"
    }
};