antDPro打包优化

通过npm run analyze查看打包情况,发现chunks中包含大量的重复打包

通过提取公共chunk来实现减少打包体积以及提高打包速度

从原来的20M经过拆包之后  最终变成了4M   官方文档   https://umijs.org/zh-CN/config#chainwebpack

// https://umijs.org/config/
import { defineConfig } from 'umi';
import defaultSettings from './defaultSettings';
import proxy from './proxy';
import routes from './routes';

const { REACT_APP_ENV } = process.env;

// 分包
const chunkCacheGroups = {
  umijs: {
    name: 'chunk-umi-js',
    test: /[\\/]node_modules[\\/]_?(@umijs)[\\/]/,
    priority: 60,
  },
  rcform: {
    name: 'chunk-rcform',
    test: /[\\/]node_modules[\\/]_?((rmc-.*)|(rc-.*))(.*)/,
    priority: 50,
    enforce: true,
  },
  antd: {
    name: 'chunk-antd',
    test: /[\\/]node_modules[\\/]_?(antd)(.*)/,
    priority: 50,
    enforce: true,
  },
  antpro: {
    name: 'chunk-ant-design',
    test: /[\\/]node_modules[\\/](@ant-design)[\\/]pro(.*)/,
    priority: 50,
    enforce: true,
  },
  antproicon: {
    name: 'chunk-ant-design-icon',
    test: /[\\/]node_modules[\\/](@ant-design)[\\/]icons(.*)/,
    priority: 50,
    enforce: true,
  },
  braft: {
    name: 'chunk-braft-js',
    test: /[\\/]node_modules[\\/]_?(braft(.*))[\\/]/,
    priority: 55,
    enforce: true,
  },
  draft: {
    name: 'chunk-draft-js',
    test: /[\\/]node_modules[\\/]_?(draft(.*))[\\/]/,
    priority: 55,
    enforce: true,
  },
  immutable: {
    name: 'chunk-immutable-js',
    test: /[\\/]node_modules[\\/]_?(immutable)[\\/]/,
    priority: 55,
    enforce: true,
  },
  react: {
    name: 'chunk-react',
    test: /[\\/]node_modules[\\/](react|react-dom|(react(.*))|react-color|react-copy-to-clipboard|react-helmet-async)[\\/]/,
    priority: 55,
    enforce: true,
  },
  utils: {
    name: 'chunk-utils',
    test: /[\\/]node_modules[\\/]_?(use-merge-value|shortid|qs|moment|lodash(.*)|lodash|use-media-antd-query|use-media-antd-query|material-color|intersection-observer)[\\/]/,
    priority: 55,
    enforce: true,
  },
  libs: {
    name: 'chunk-libs',
    test: /[\\/]node_modules[\\/](component-classes|t-non-react-statics|shallowequal|raf|classnames|fbjs|array-tree-filter|dom-align|add-dom-event-listener|css-animation|tinycolor2|swr|ua-parser-js|viewerjs)[\\/]/,
    priority: 50,
    enforce: true,
  },
  utilsVendor: {
    name: 'chunk-utils-vendor',
    test: /[\\/]utils[\\/]/,
    priority: 50,
    enforce: true,
  },
};

// chunk-name
const getSplitChunks = () => {
  const chunks = Object.values(chunkCacheGroups);
  const chunkBundles = [];
  chunks.map((chunk, key) => {
    chunkBundles[key] = chunk.name;
  });
  return chunkBundles;
};

export default defineConfig({
  ...
  chunks: REACT_APP_ENV !== 'dev' ? [...getSplitChunks(), 'umi'] : undefined,
  chainWebpack(config, { webpack }) {
    if (REACT_APP_ENV === 'dev') return;
    config.merge({
      optimization: {
        splitChunks: {
          chunks: 'all', // async 不会打包静态引用的文件
          minSize: 30000, // 30000 大于这个值的文件会被提取成单独文件
          minChunks: 3,
          automaticNameDelimiter: '.',
          cacheGroups: chunkCacheGroups,
        },
      },
    });
  },
});

 

上一篇:基于vue-simple-uploader的文件分片上传


下一篇:webpack配置