开发者问题收集

为什么 Material UI 构建这么大

2021-09-10
2756

我正在尝试让 Material-ui 正确地进行 tree-shaking。与我实际使用的相比,这个包非常大。我没有使用下面分析器插件列出的大多数组件,而是按照material-ui文档中的说法导入了所有内容。例如,这是我的一个文件中的内容。

import Button from '@material-ui/core/Button';
import CssBaseline from '@material-ui/core/CssBaseline';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Grid from '@material-ui/core/Grid';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/core/styles';
import Container from '@material-ui/core/Container';
  • 解析:1.7mb
  • 状态:1.1mb
  • Gzipped:253kb

相比之下,我以非常类似的方式使用 react-bootstrap,其大小要小得多。

  • 解析:55kb
  • 状态:28kb
  • Gzipped:7kb

在此处输入图片描述

这是我的 webpack文件

const path = require('path');
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const fs = require('fs');
const WebpackOnBuildPlugin = require('on-build-webpack');
const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');

const buildDir = './build/';

module.exports = {
  optimization: {
    usedExports: true,
  },
  entry: {
    build: './src/index.js',
  },
  plugins: [
    new BundleAnalyzerPlugin(),
    new LodashModuleReplacementPlugin(),
    new webpack.optimize.LimitChunkCountPlugin({
      maxChunks: 25,
    }),
    new MiniCssExtractPlugin(),
  ],
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.css$/i,
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          // Creates `style` nodes from JS strings
          'style-loader',
          // Translates CSS into CommonJS
          'css-loader',
          // Compiles Sass to CSS
          'sass-loader',
        ],
      },
    ],
  },
  output: {
    chunkFilename: '[id].[contenthash].chunk.js',
    filename: 'bundle.js',
    path: path.resolve(__dirname, './build'),
  },
};

考虑到我使用的是基本功能,我认为 Material-UI 应该非常小(在 kb 范围内)。

此外,我还使用按路由进行代码拆分,但 Webpack 在主包中包含 MUI,因为它由几个块共享。这意味着即使该页面不使用 Material UI,我在每个路由中都会有额外的 mb。有没有办法进行代码拆分,以便只有单个 MUI 模块在其适当的路由中加载?

1个回答

当您在开发环境中构建时,material-ui 似乎会发生这种情况。生产构建正确地进行了 tree-shaking。但奇怪的是,material-ui 自己的文档声称,如果您直接导入文件,开发构建也应该正确地进行 tree-shaking。

Jeremy Gottfried
2021-09-11