UmiJS

umi vendors 包体积较大处理

2020-06-30  本文已影响0人  sssgoEasy

参考文章:https://www.jb51.net/article/151976.htm

一.第一步:分析包结构

1.配置analyze工具
  "scripts": {
    "analyze": "cross-env ANALYZE=1 umi build"
  },

cross-env 报错不是内部或外部命令 需要独立安装 npm install -g cross-env
通过命令 npm run analyze 即可运行,默认serve:http://127.0.0.1:8888

启动后效果
2.问题补充
webpack --profile --json > stats.json
webpack --profile --json | Out-file 'stats.json' -Encoding OEM
umi-webpack-bundle-analyzer bundle/output/path/stats.json

第二步 webpack-cli 不存在的拋错问题:必须使用 npm install -g webpack-cli (yarn也会报错)

二.第二步:根据包结构图分析打包依赖

1.第一次打开未做任何配置的效果

parsed大小:vendors.js 2.51m umi.js 2.17m
gzip大小:vendors.js 790k umi.js 580k

第一次未做处理时
第一次未做处理时
export default {
    //base: '/',
    //history: 'hash', //hash路由
    //hash: true, //生成hash文件名
    chainWebpack: function(config, { webpack }) {
        config.merge({
            optimization: {
                minimize: true,
                splitChunks: {
                    chunks: 'async', 
                    minSize: 30000, //文件最小打包体积,单位byte,默认30000,若单个文件不满足会合并其他文件组成一个
                    minChunks: 2, //最小使用到次数,超过2次执行
                    automaticNameDelimiter: '.', //连接符
                    cacheGroups: {
                        vendors: {
                            // 基本框架
                            name: 'vendors',
                            test: /^.*node_modules[\\/](?!react|react-dom|antd).*$/,
                            chunks: 'all',
                            priority: 10,
                        },
                        // echartsVenodr: {
                        //     // 异步加载echarts包
                        //     name: 'echartsVenodr',
                        //     test: /(echarts|zrender)/,
                        //     chunks: 'async',
                        //     priority: 10, // 高于async-commons优先级
                        // },
                        'async-commons': {
                            // 其余异步加载包
                            chunks: 'async',
                            minChunks: 2,
                            name: 'async-commons',
                            priority: 9,
                        },
                        commons: {
                            // 其余同步加载包
                            chunks: 'all',
                            minChunks: 2,
                            name: 'commons',
                            priority: 8,
                        },
                    },
                },
            },
        });
        //过滤掉momnet的那些不使用的国际化文件
        config
            .plugin('replace')
            .use(require('webpack').ContextReplacementPlugin)
            .tap(() => {
                return [/moment[/\\]locale$/, /zh-cn/];
            });
    },
};
splitChunks:
chunks:
priority:
2.第二次打开配置后的效果

核心思想:把首页加载时的必用框架react-dom等组件配置到vendors,其他echart等在固定页面打开时加载时引用的地方放入异步加载包里。

    externals: {
        echarts: 'window.echarts',
        // d3: 'window.d3',
    }
    //过滤掉momnet的那些不使用的国际化文件
    config.plugin("replace").use(require("webpack").ContextReplacementPlugin).tap(() => {
        return [/moment[/\\]locale$/, /zh-cn/];
    });

parsed大小:vendors.js 526k umi.js 1.54m
gzip大小:vendors.js 143k umi.js 425k

第二次打开
第二次打开
3.第三次配置修改

~ 抽点时间再补充下
把修改的部分粘出来
有几点问题说明下:
1.vendors 修改了test的验证范围,发现结果也没有很大变化,不知道是哪里除了问题,而且vendors包变的很小,umi包反而比较大。
2.default:这里的 reuseExistingChunk: true 复用其他chunk内已拥有的模块 当chunks引用了已经存在的被抽离的chunks时不会新创建一个chunk而是复用chunk。参考文章
这里贴一个default minChunks配置的效果:
minChunks:1

minChunks:1

minChunks:2


minChunks:2
cacheGroups: {
    vendors: {
        // 基本框架
        name: 'vendors',
        test: /[\\/]node_modules[\\/](lodash|re-select|moment)[\\/]/,
        chunks: 'all',
        priority: 10,
    },
    antdesigns: {
        name: 'antdesigns',
        chunks: 'all',
        test: /[\\/]node_modules[\\/](@ant-design|antd)[\\/]/,
        priority: 10,
    },
    'async-commons': {
        // 其余异步加载包
        chunks: 'async',
        minChunks: 2,
        name: 'async-commons',
        priority: 9,
    },
    default: {
        name: 'default',
        minChunks: 1,
        priority: -1,
        reuseExistingChunk: true, //
    },
},
4.第四次配置修改
                        vendors: {
                            // 基本框架
                            name: 'vendors',
                            test: /[\\/]node_modules[\\/]/, 
                            // chunks: 'all',
                            priority: 10,
                        },
                        antdesigns: {
                            name: 'antdesigns',
                            chunks: 'all',
                            test: /[\\/]node_modules[\\/](@ant-design|antd)[\\/]/,
                            priority: 11,
                        },
                        jsdk: {
                            name: 'jsdk',
                            chunks: 'initial',
                            test: /[\\/]node_modules[\\/](china-division|dingtalk-jsapi|lodash|moment)[\\/]/,
                            priority: 11,
                        },
                        'async-commons': {
                            // 其余异步加载包
                            chunks: 'async',
                            minChunks: 2,
                            name: 'async-commons',
                            priority: 9, 
                        },
                        default: {
                            name: 'default',
                            minChunks: 1,
                            priority: -1,
                            reuseExistingChunk: true,
                        },

几点说明一下:
① vendors 的 test 修改为mode_modules下的所有引入包。
② 针对vendors的配置,把 antdesigns 和 jsdk 的priority优先级调高,抽离出对应插件包模块。
③ 相应的umi.js会自动打包剩余react相关必备核心框架包。
④ 对于default的minChunks配置,线上我可能还是会改为2,当前所有page都被打包进来了。

这次结果基本很理想了,拆包已经很小了,包结构功能基本也比较清晰。
react/umi/dva核心模块,antd视图框架模块,lodash/moment等第三方插件,async-commons页面/default组件包模块。

不过对于vendors下的rc-table、rc-select等rc开头的插件还不是很理解,后期继续学习。

~ 暂时先这样,后面有时间再研究研究。写个记录备忘。目前还有些不明白的地方。~~

上一篇 下一篇

猜你喜欢

热点阅读