简体   繁体   English

刷新具有ID的页面时出现react-router-dom错误

[英]react-router-dom error when refreshing page with id

I'm developing a project using React/Redux and Node.js . 我正在使用React/ReduxNode.js开发一个项目。

I added react-router-dom as a dependency into my project and configured the router like this: 我在项目中添加了react-router-dom作为依赖项,并对路由器进行了如下配置:

import ...

const Router = () => (
  <main>
    <Switch>
      <Route exact path='/' component={components.main}/>
      <Route path='/caseDetail/:id' component={components.caseDetail}/>
      <Route component={components.notFound}/>
    </Switch>
  </main>
)

export default Router

And setup my webpack like this 然后像这样设置我的webpack

const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const merge = require('webpack-merge')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const env = require('./src/env.js')
const TARGET = process.env.npm_lifecycle_event
process.env.BABEL_ENV = TARGET

const PATHS = {
  app: path.join(__dirname, 'src'),
  build: path.join(__dirname, 'build'),
  assets: path.join(__dirname, 'assets')
}

const common = {
  entry: [PATHS.app],
  module: {
    rules: [
      {
        test: /\.json$/,
        loader: 'json-loader'
      },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        include: PATHS.app,
        loaders: ['babel-loader']
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { modules: true } }],
        include: /flexboxgrid/
      },
      {
        test: /\.scss$/,
        exclude: /flexboxgrid/,
        use: [
          MiniCssExtractPlugin.loader,
          { loader: 'css-loader', options: { modules: true } },
          'sass-loader'
        ]
      },
      {
        test: /\.jpe?g$|\.gif$|\.png$/i,
        loader: 'url-loader?name=[name].[ext]'
      },
      {
        test: /\.otf$|\.eot$|\.svg$|\.ttf|\.woff|\.woff2$/,
        loader: 'url-loader?name=[name].[ext]'
      }
    ]
  },
  resolve: {
    extensions: ['.js', '.jsx'],
    modules: ['node_modules', path.resolve(__dirname, './node_modules')],
    mainFields: ['browser', 'web', 'browserify', 'main', 'style']
  }
}

if (TARGET === 'start' || !TARGET) {
  module.exports = merge(common, {
    module: {
      rules: [
        {
          test: /\.jsx?$/,
          use: ['source-map-loader'],
          enforce: 'pre'
        }
      ]
    },
    devtool: 'inline-source-map',
    devServer: {
      contentBase: PATHS.build,
      historyApiFallback: true,
      hot: true,
      inline: true,
      progress: true,
      stats: 'errors-only',
      https: true,
      host: env.host,
      port: env.port,
      overlay: {
        errors: true
      },
      watchOptions: {
        watch: true
      }
    },
    plugins: [
      new MiniCssExtractPlugin({ filename: 'assets/style.css' }),
      new webpack.HotModuleReplacementPlugin(),
      new HtmlWebpackPlugin({
        template: PATHS.app + '/index.html',
        inject: 'body'
      })
    ],
    output: {
      path: PATHS.build,
      filename: 'bundle.js'
    }
  })
}

if (TARGET === 'production') {
  module.exports = merge(common, {
    plugins: [
      new MiniCssExtractPlugin({ filename: 'style.css' }),
      new webpack.optimize.OccurenceOrderPlugin(),
      new webpack.DefinePlugin({
        'process.env': {
          NODE_ENV: "'production'"
        }
      })
    ],
    output: {
      path: '/build',
      filename: 'bundle.js'
    }
  })
}

My problem is 我的问题是

When I call this route /caseDetail/1 it works by using Link: 当我将此路由称为/caseDetail/1它可以通过使用Link来工作:

<Link to={{ pathname: `/caseDetail/` + caseStudy.id }}>

BUT , if I call directly by the browser , like https://localhost:3000/caseDetail/1 但是 ,如果我直接通过浏览器调用,例如https:// localhost:3000 / caseDetail / 1

It fails, I get this message on console 失败,我在控制台上收到此消息

Refused to apply style from 'https://localhost:3000/caseDetail/assets/style.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
0:12 GET https://localhost:3000/caseDetail/bundle.js net::ERR_ABORTED 404
0:1 Refused to execute script from 'https://localhost:3000/caseDetail/bundle.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

SOLVED 解决了

How to fix. 怎么修。 Thanks to @soroush-chehresa 感谢@ soroush-chehresa

I added into my router file, the BrowserRouter like this: 我将router添加到router文件中,如下所示:

import React from 'react'
import { Switch, Route, BrowserRouter } from 'react-router-dom'
import { components } from './loader'

const Router = () => (
  <main>
    <BrowserRouter>
      <Switch>
        <Route exact path='/' component={components.main}/>
        <Route exact path='/caseDetail' component={components.caseDetail}/>
        <Route path='/caseDetail/:id' component={components.caseDetail}/>
        <Route component={components.notFound}/>
      </Switch>
    </BrowserRouter>
  </main>
)

export default Router

And also added into my webpack.config.js on output 并在output添加到我的webpack.config.js

  publicPath: '/'

If you are using react-router-redux wrap Router with ConnectedRouter : 如果您使用React-router-reduxRouterConnectedRouter

  import { ConnectedRouter } from 'react-router-redux';
  import { createBrowserHistory } from 'history';

  const Router = () => (
    <main>
      <ConnectedRouter history={createBrowserHistory()}>
        <Switch>
          <Route exact path='/' component={components.main}/>
          <Route path='/caseDetail/:id' component= {components.caseDetail}/>
         <Route component={components.notFound}/>
       </Switch>
      </ConnectedRouter>
    </main>
  );

Otherwise if you are using react-router-dom wrap Router with BrowserRouter : 否则,如果您将带有BrowserRouter -router-dom的 RouterBrowserRouter一起BrowserRouter

  import { BrowserRouter } from 'react-router-dom';

  const Router = () => (
    <main>
      <BrowserRouter>
        <Switch>
          <Route exact path='/' component={components.main}/>
          <Route path='/caseDetail/:id' component={components.caseDetail}/>
          <Route component={components.notFound}/>
        </Switch>
      </BrowserRouter>
    </main>
  );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM