Webpack和React BrowserRouter

时间:2018-03-29 20:30:19

标签: reactjs webpack react-router-v4

我正在开发一个与hashrouter做出反应的项目,我想改为浏览路由器,但项目已经有了一个webpack配置,并且我有点新的,我知道我应该让webpack接受所有调用索引(因为即时通讯无法进入所有路线)但我无法找到有关此类设置的任何信息:

这是当前的webpack配置

const path = require('path');
const webpack = require('webpack');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');

module.exports = {
    devtool: 'cheap-module-source-map',
    entry: {
        app: [
            'webpack-hot-middleware/client',
            'react-hot-loader/patch',
            './src/app'
        ]
    },
    resolve: {
        modules: ['node_modules'],
        extensions: ['.js', '.jsx', '.scss'],
        alias: {
            'react-native': 'react-native-web'
        }
    },
    output: {
        path: path.join(__dirname, 'public/assets'),
        publicPath: '/assets/',
        filename: '[name].bundle.js'
    },
    module: {
        rules: [{
            test: /\.jsx?$/,
            exclude: /node_modules/,
            use: [{
                loader: 'react-hot-loader/webpack'
            }, {
                loader: 'babel-loader', options: {cacheDirectory: '.babel-cache'}
            }]
        }, {
            // Most react-native libraries include uncompiled ES6 JS.
            test: /\.js$/,
            include: [
                /node_modules\/react-native-/,
                /node_modules\/react-router-native/,
                /node_modules\/@indec/
            ],
            loader: 'babel-loader',
            query: {
                presets: ['react-app'],
                cacheDirectory: '.babel-cache'
            }
        }, {
            test: /\.scss$/,
            loader: [
                'css-hot-loader'
            ].concat(
                ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: ['css-loader', 'sass-loader']
                })
            )
        }, {
            test: /\.css$/,
            use: ['style-loader', 'css-loader']
        }, {
            exclude: [
                /\.html$/,
                /\.(js|jsx)$/,
                /\.json$/,
                /\.s?css$/,
                /\.(jpg|png)/
            ],
            loader: 'url-loader',
            options: {name: '[name].[ext]', limit: 10000}
        }, {
            test: /\.(jpg|png)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
            loader: 'file-loader',
            options: {name: '[name].[ext]'}
        }]
    },
    plugins: [
        new webpack.DefinePlugin({
            VERSION: JSON.stringify(require('./package.json').version),
            NODE_ENV: JSON.stringify(process.env.NODE_ENV),
            ENDPOINT: JSON.stringify(require('./config.json').endpoint)
        }),
        new webpack.optimize.CommonsChunkPlugin('vendor'),
        new webpack.HotModuleReplacementPlugin(),
        new CaseSensitivePathsPlugin(),
        new FriendlyErrorsWebpackPlugin(),
        new ExtractTextPlugin('[name].bundle.css')
    ],
    node: {
        fs: 'empty',
        net: 'empty',
        tls: 'empty'
    }
};

应用程序在此index.js文件上启动

    const path = require('path');
    const app = require('connect')();
    const config = require('./config.json');
    const winston = require('winston');

    const PORT = process.env.PORT || config.server.port;

    process.env.NODE_ENV = config.mode;
    app.use(require('morgan')(config.server.morgan));
    app.use(require('compression')());
    app.use(require('serve-static')(path.join(__dirname, config.server.static)));

    if (config.mode === 'development') {
        const config = require('./webpack.config');
        const compiler = require('webpack')(config);

        app.use(require('webpack-dev-middleware')(compiler, {
            publicPath: config.output.publicPath,
        }));
        app.use(require('webpack-hot-middleware')(compiler));
    }

    require('http').createServer(app).listen(
        PORT,
        () => winston.info('Server started at port %s', config.server.port)
    );

和我的应用js

import React from 'react';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import Aux from 'react-aux';

import Home from '../Home';
import Admin from '../Admin';
import SignIn from '../SignIn';

import Header from './Header';
import Footer from './Footer';

const App = () => (
    <BrowserRouter>
        <Aux>
            <Header/>
            <main>
                <Switch>
                    <Route path="/" component={Home}/>
                    <Route path="/admin" component={Admin}/>
                    <Route path="/signIn" component={SignIn}/>
                </Switch>
            </main>
        </Aux>
    </BrowserRouter>
);

export default App;

1 个答案:

答案 0 :(得分:0)

我最终找到了一个简单的解决方案,只是创建了一个快速应用程序并处理了所有404索引,没有找到如何使用连接。

const path = require('path');
const express = require('express');
const app = express();
const config = require('./config.json');
const winston = require('winston');

const PORT = process.env.PORT || config.server.port;

process.env.NODE_ENV = config.mode;
app.use(require('morgan')(config.server.morgan));
app.use(require('compression')());
app.use(require('serve-static')(path.join(__dirname, config.server.static)));



if (config.mode === 'development') {
    const config = require('./webpack.config');
    const compiler = require('webpack')(config);

    app.use(require('webpack-dev-middleware')(compiler, {
        publicPath: config.output.publicPath,
    }));
    app.use(require('webpack-hot-middleware')(compiler));
}

app.get('/*', function(req, res) {
    res.sendFile(path.join(__dirname, './public/index.html'), function(err) {
        if (err) {
            res.status(500).send(err);
        }
    });
});

app.use((req, res, next) => {
    const err = new Error('Not Found');
    err.status = 404;
    next(err);
});

require('http').createServer(app).listen(
    PORT,
    () => winston.info('Server started at port %s', config.server.port)
);