React + Webpack: невозможно перенаправить все мои маршруты в index.html - PullRequest
0 голосов
/ 07 июля 2019

Я создаю приложение React без использования create-react-app, но использую webpack для его создания и webpack-dev-server для его обслуживания.

Моя структура каталогов:

myApp
|
|---docs/
|   |
|   |---dist/
|   |   |
|   |   |---bundle.js
|   |---index.html
|---src/
|---package.json
|---package-lock.json
|---README.md
|---webpack.config.js

и мой webpack.config.js :

module.exports = {
  entry: __dirname + '/src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/docs/dist'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      },
      {
        test: [/.css$|.scss$/],
        use: [
          'style-loader',
          'css-loader',
          'sass-loader'
        ]
      },
      {
        test: /\.(jpg|jpeg|png|jpg|gif)$/,
        loader: 'file-loader?limit=10000&name=../assets/images/[name].[ext]'
      },
      {
        test: /\.(woff|woff2|eot|ttf|svg)$/,
        loader: 'url-loader?limit=100000&name=../assets/fonts/[name].[ext]'
      }
    ]
  },
  resolve: {
    extensions: ['*', '.js', '.jsx']
  },
  devServer: {
    contentBase: './docs',
    compress: true,
    port: 9000,
    historyApiFallback: true
  }
};

Документация Webpack для historyApiFallback говорит, что эта конфигурация historyApiFallback: true перенаправит все 404 ответа на index.html.

Бывает, что я использую react-router-dom и у меня есть следующие маршруты:

<BrowserRouter>
    <Switch>
        <Route exact path="/" component={Homepage} />
        <Route path="/about" component={About} />
        <Route path="/article/:id/show" component={Article} />
        <Route path="/donate" component={Donate} />
    </Switch>
</BrowserRouter>

Все хорошо с /, /about и /donate,но когда я пробую маршрут /article/<something>/show, я все равно получаю сообщение об ошибке 404. Как показано на рисунке ниже.

enter image description here

Он говорит, что не можетнайдите файл bundle.js.Но, с другой стороны, он не перенаправляет мой маршрут на index.html.Если бы это было так, он нашел бы файл bundle.js, как и на других маршрутах.

Как я могу выполнить эту работу?

РЕДАКТИРОВАТЬ

Установка publicPath в /, как предлагается, не решит проблему.Прежде всего, / - это не путь моего актива.

Установка его /docs/dist, путь моего реального публичного актива, работает в некоторой степени.Но решение приходит только в том случае, если вы используете абсолютный путь при загрузке ресурсов.

1 Ответ

2 голосов
/ 07 июля 2019

Вам необходимо указать publicPath в объекте output следующим образом:

    output: {
        filename: 'bundle.js',
        path: __dirname + '/docs/dist',
        publicPath: '/'
    },

Вы можете прочитать документ для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...