umi vendors 包体积较大处理

参考文章: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.问题补充
  • 根据官方工具 umi-webpack-bundle-analyzer gihub官网 (抛开umi内置该工具独立分析时),在windows系统下通过PowerShell作为命令操作时的问题:
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

第一次未做处理时

第一次未做处理时
  • 可以很明显的看到包整体是比较大的
    1.一是echart和echart渲染组件zrender体积较大
    2.二是moment重复打包和无用语言多余打包
    3.三是antd组件的打包分散重复
  • 这里贴出一份本人的config.js配置,主要通过chainWebpack接口处理
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/];
            });
    },
};
  • 针对官方的这句话
    config配置

    是在config.js的这里处理:
    config.js

    不过在调试中出现的 file commons.js don't exists in chunksMap 等错误,度娘查了好几遍也没 发现原因和解决方案,结合analyze分析图,发现chunk参数的设置与否并不影响结果,后续中我注释了这个配置。有知道原因的大佬麻烦告知一声,多谢。
splitChunks:
  • splitChunks下的chunks、minSize、minChunks会在cacheGroups里的配置继承,不过cacheGroups里的配置,如minChunks:1参数的话会覆盖splitChunks下的minChunks: 2配置,优先级高于splitChunks
chunks:
  • all: 不管文件是动态还是非动态载入,统一将文件分离。当页面首次载入会引入所有的包
  • async: 将异步加载的文件分离,首次一般不引入,到需要异步引入的组件才会引入。
  • initial:将异步和非异步的文件分离,如果一个文件被异步引入也被非异步引入,那它会被打包两次(注意和all区别),用于分离页面首次需要加载的包。
priority:
  • 设置包的打包优先级,这里解释一下,基本是在两个包同时包含一个插件会用到,priority大的会打包到这个里面。
2.第二次打开配置后的效果
  • 省略了中间的多次调整,最后结果:
    抽离出了echart,并把异步加载归类到async-commons

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

    externals: {
        echarts: 'window.echarts',
        // d3: 'window.d3',
    }
  • moment的优化处理
    //过滤掉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, //
    },
},
  • 补充:后来调整发现这里的效果配置并不理想,看下一条。
    效果:
    第三次配置

    第三次配置

    network耗时和size

    nginx开启gzip后效果

    最终效果感觉是很明显的,在网络带宽一般的情况下,之前首屏加载大概6-8s左右,现在是1-3s内基本ok,还是很明显的,同时也可以节约服务器带宽,不过相应的对CPU的消耗会有所增加,这个根据实际情况考虑。
    这里贴个nginx相关参考链接 :https://www.cnblogs.com/kevingrace/p/10018914.html
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都被打包进来了。

  • 效果:


    第四次配置

    第四次配置 Parsed

    第四次配置 Gzip

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

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

  • 提醒下,本地开发调试不建议开启,适合打包线上build配置使用。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269