Ленивая загрузка react-router-dom, webpack не работает

Я пытаюсь лениво загружать маршруты, используя react-router-dom, но это не работает. Webpack должен автоматически разбивать куски на import(), но это не так, я всегда получаю один файл main.hash.js вместо нескольких кусков. Есть что-то, что мне не хватает?

Компонент приложения:

import * as React from 'react';
import { Route, BrowserRouter, Link } from 'react-router-dom';
const Todos = React.lazy(() => import('routes/Todos'))

class App extends React.Component<{}, {}> {
  render() {
    return (
      <>
        <BrowserRouter>
          <React.Suspense fallback = {<div>loading...</div>}>
            <Route exact path = "/" render = {() => <Link to = "/todos">Todos</Link>} />
            <Route exact path = "/todos" component = {Todos} />
          </React.Suspense>
        </BrowserRouter>
      </>
    )
  }
}
export default App;

Вот конфигурация веб-пакета на случай, если она может быть связана с некоторыми плагинами или отсутствующей конфигурацией на этой стороне:

общая конфигурация webpack:

const webpack = require('webpack');

const HtmlWebPackPlugin = require('html-webpack-plugin');
// clean folder (dist in this case)
const CleanWebpackPlugin = require('clean-webpack-plugin');
// copy files
const CopyPlugin = require('copy-webpack-plugin');

const path = require('path');

module.exports = {
  entry: path.resolve(__dirname, 'src', 'index.tsx'),
  resolve: {
    extensions: ['.js', '.ts', '.tsx', '.scss'],
    alias: {
      'src': path.resolve(__dirname, 'src/'),
      'components': path.resolve(__dirname, 'src/components/'),
      'routes': path.resolve(__dirname, 'src/routes/'),
    }
  },
  plugins: [
    new CleanWebpackPlugin(['dist'], {}),
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "index.html"
    }),
    new CopyPlugin([
      { from: 'assets', to: 'assets' },
    ]),
  ]
};

Конфигурация продукта веб-пакета:

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const path = require('path');

// split css per js file
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
// optimize js
const TerserPlugin = require('terser-webpack-plugin');
// optimize css
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
// service-worker
const Workbox = require('workbox-webpack-plugin');

module.exports = merge(common, {
  mode: 'production',
  module: {
    rules: [
      {
        test: /\.ts|\.tsx$/,
        loader: "ts-loader",
        include: path.resolve(__dirname, 'src')
      },
      {
        test: /\.scss$/,
        loader: MiniCssExtractPlugin.loader
      },
      {
        test: /\.scss$/,
        loader: 'css-loader',
        options: {
          modules: true,
          localIdentName: '[hash:base64:5]'
        }
      },
      {
        test: /\.scss$/,
        loader: 'postcss-loader',
      },
      {
        test: /\.scss$/,
        loader: 'sass-loader',
      }
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css',
      chunkFilename: '[id].[hash].css',
    }),
    new OptimizeCssAssetsPlugin({}),
    new Workbox.GenerateSW({
      clientsClaim: true,
      skipWaiting: true,
      exclude: [/\.(?:png|jpg|jpeg|svg)$/],
      runtimeCaching: [
        {
          urlPattern: /https?://.+/,
          handler: 'StaleWhileRevalidate',
          options: {
            cacheableResponse: {
              statuses: [0, 200]
            }
          }
        }, {
          urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
          handler: 'CacheFirst',
        }],
    })
  ],
  optimization: {
    minimizer: [new TerserPlugin()],
  },
  output: {
    filename: '[name].[contenthash].js',
    chunkFilename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist')
  }
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
2 510
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От кого: https://github.com/webpack/webpack/issues/5703#issuecomment-357512412

compilerOptions.module должен быть установлен на esnext, чтобы веб-пакет разделял динамический импорт.

Другие вопросы по теме