Почему я настраиваю разделение кода в реактивном проекте, но не создается файл асинхронных фрагментов - PullRequest
0 голосов
/ 09 марта 2019

Как я уже сказал, я использую webpack4.0, используя официальный метод отложенной загрузки для кодирования разделов в моем собственном реактивном проекте, чтобы добиться отложенной загрузки, но после упаковки я не смог экспортировать полученный файл чанков.Что случилось?Пожалуйста, помогите мне, вот мой код конфигурации.

const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
const Autoprefixer = require('autoprefixer');
const {
  BundleAnalyzerPlugin
} = require('webpack-bundle-analyzer');

module.exports = env => {

  const rules = [
    {
      test: /\.(js|jsx)$/,
      loader: 'babel-loader',
      exclude: /node_modules/
    },
    {
      test: /\.(jpg|jpeg|png|gif|svg)$/,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 100000
          }
        }
      ]
    },
    {
      test: /\.css$/,
      use: [
        env.NODE_ENV === 'development'
          ? 'style-loader'
          : MiniCssExtractPlugin.loader,
        'css-loader'
      ]
    },
    {
      test: /\.less$/,
      use: [
        env.NODE_ENV === 'development'
          ? 'style-loader'
          : MiniCssExtractPlugin.loader,
        'css-loader',
        {
          loader: 'postcss-loader',
          options: {
            ident: 'postcss',
            plugins: [Autoprefixer()]
          }
        },
        'less-loader'
      ]
    }
  ];

  const plugins = {
    development: [
      new CleanWebpackPlugin(['dist']),
      new HtmlWebpackPlugin({
        filename: 'index.html',
        template: 'index.html',
        injetc: 'body'
      }),
      new webpack.HotModuleReplacementPlugin(),
      new webpack.NamedModulesPlugin()
    ],
    production: [
      new CleanWebpackPlugin(['dist']),
      new MiniCssExtractPlugin({
        filename: '[name].min.css'
      }),
      new OptimizeCssAssetsWebpackPlugin(), 
      new HtmlWebpackPlugin({
        filename: 'index.html',
        template: 'index.html',
        injetc: 'body'
      }),
      new BundleAnalyzerPlugin()
    ],
    test: [new BundleAnalyzerPlugin()]
  };

  const webpackConfig = {
    entry: {
      index: './src/index.js'
    },
    devtool: 'nosources-source-map',
    output: {
      filename: '[name].[hash].js',
      chunkFilename: '[name].chunk.js',
      path: path.resolve(__dirname, 'dist')
    },
    module: {
      rules: [...rules]
    },

    optimization: {
      runtimeChunk: {
        name: 'manifest'
      },
      splitChunks: {
        maxAsyncRequests: 10,
        cacheGroups: {
          default: false,
          async: {
            name: 'async',
            chunks: 'async',
            minChunks: 1,
            minSize: 1,
            priority: 20
          },
          common: {
            name: 'common',
            chunks: 'initial',
            minChunks: 1,
            minSize: 1,
            priority: 0
          },
          vander: {
            name: 'base',
            test: /node_modules/,
            chunks: 'initial',
            minChunks: 1,
            priority: 10
          }
        }
      }
    },


    plugins: [
      new webpack.DefinePlugin({
        NODE_ENV: JSON.stringify(env.NODE_ENV)
      }),
      ...plugins[env.NODE_ENV]
    ]
  };


  if (env.NODE_ENV === 'development') {
    webpackConfig.devServer = {
      hot: true,
      hotOnly: true
    };
  }
  console.log(webpackConfig);
  return webpackConfig;
};

Реагируйте код конфигурации

import loadable from '@loadable/component';

 <Content>
            <Route
              path="/home/discover"
              component={loadable(() =>
                import('../Discover')
              )}
            />
            <Route
              path="/home/visilize"
              component={loadable(() =>
                import('../Visilize')
              )}
            />
            <Route
              path="/home/dashboard"
              component={loadable(() =>
                import('../Dashboard')
              )}
            />
            <Route
              path="/home/data"
              component={loadable(() => import('../Data'))}
            />
            <Route
              path="/home/alarm"
              component={loadable(() => import('../Alarm'))}
            />
          </Content>

Результат его производства следующий: введите описание изображения здесь

1 Ответ

0 голосов
/ 09 марта 2019

Реализация отложенной загрузки супер плавная в React 16.6. Я не пробовал свои силы на загрузке, но использую React.lazy() для того же. Его легко понять и написать. Вот пример синтаксиса:

const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <div>
      <OtherComponent />
    </div>
  );
}

Проверьте это для деталей:

https://scotch.io/bar-talk/whats-new-in-react-166#toc-react-lazy-and-suspense

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