代码之家  ›  专栏  ›  技术社区  ›  Nicolas Albarracin

Web包和React浏览器路由器

  •  0
  • Nicolas Albarracin  · 技术社区  · 7 年前

    我正在处理一个在react with hashrouter中制作的项目,我想更改为browserouter,但该项目已经有了一个webpack配置,而且我对它有点陌生,我知道我应该制作webpack以接受所有对index的调用(因为im getting无法访问所有路由),但我找不到有关这种设置的任何信息:

    这是当前的网页包配置

    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'
        }
    };
    

    应用程序在此索引上启动。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 回复  |  直到 7 年前
        1
  •  0
  •   Nicolas Albarracin    7 年前

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

    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)
    );