记一次管理平台webpack优化

最近对公司商务运营管理平台做了部分优化,优化后包体积减小为原来的43%,性能有很大提升。

优化前

原配置文件中已包含部分优化,包括

  • 使用compression-webpack-plugin开启gzip压缩
  • 使用svg-sprite-loader将svg文件打包成雪碧图
  • 使用optimization.splitChunks做代码分割

......
在此基础上仍有很大优化空间,首先借助 webpack-bundle-analyzer 将打包后的内容展示为方便交互的树状图,我们可以很直观的看到有哪些比较大的模块,然后做针对性优化。

image.png

可以看到总体为7.71M,其中node_modules占用较多,所以可进行较明显的构建优化.

CDN+external

> CDN 的工作原理是将源站的资源缓存到位于全球各地的 CDN 节点上,用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都回您的源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验。

可以看到打包模块中将一些引入库也打包进来,这里我们可以采用引入外链cdn取消对较大依赖模块的打包。
在vue.config.js中添加如图配置


image.png

同时在public中的index.html中引入cdn链接


image.png

需要注意点,在 html 中配置的 CDN 引入脚本最好要在 body 内的最底部,因为:

  • 如果放在 body 上面或 header 内,则加载会阻塞整个页面渲染。
  • 如果放在 body 外,则会在业务代码被加载之后加载,模块中使用了该模块将会报错
  • CDN最好采用公司内部CDN,这里使用了vue及element官网链接和服务较好的bootcdn

按需引入

很多element组件只用到了较少一部分,所以可采用按需引入
安装插件babel-plugin-component后修改.babelrc文件

{
    "presets": [],
    "plugins": [
        [
          "component",
          {
            "libraryName": "element-ui",
            "styleLibraryName": "theme-chalk"
          }
        ]
      ]
}

在需要的地方引入,例

import { Loading } from "element-ui";

语言包优化

某些场景下,语言包会占用整个包体积的非常大一部分。实际上库本身的逻辑不会很大,moment 就是一个很好例子。如果是新项目,推荐使用dayjs替代moment,它只有2k,此处用了不影响原逻辑我们仍延用moment,把不使用的语言包过滤掉,推荐使用 ContextReplacementPlugin,他可以过滤掉不使用的语言,也可以用webpack的IgnorePlugin插件

image.png

const ContextReplacementPlugin = require("webpack/lib/ContextReplacementPlugin");
config.plugin("ignore").use(new ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn$/));
image.png

过滤后仅为原来25%

去除console

日常开发为了方便调试,代码中会有一些console,但是在生产环境中为了信息安全这些console是不能出现的,这里我们使用terser-webpack-plugin插件来去掉console。该插件通常用语代码压缩,有类似功能的插件还有uglifyjs-webpack-plugin,但uglifyjs-webpack-plugin缺点是不支持es6
安装

npm install terser-webpack-plugin --save-dev

使用

const TerserPlugin = require("terser-webpack-plugin");

vue.config.js的configureWebpack中添加

 optimization: {
            minimizer: [
                new TerserPlugin({
                    terserOptions: {
                        compress: {
                            pure_funcs: ["console.log"]
                        }
                    }
                })
            ]
        },

打包时发现报错


image.png

排查后发现原因是webpack和terser插件的版本差异,terser目前最新版为5.0.2,但我们项目中使用的事webpack4.x,所以要安装terser插件的4.x版本,安装后重新build正常。
在打包后的dist文件夹app.js中搜索console.log未发现说明生效。


image.png

压缩图片

项目中有较多小于2k的icon和小图片可使用file-loaderurl-loader处理

image.png

原理是url-loader可将小于limit的图片转成base64格式,大于limit的图片由file-loader编译
配置如下

const imagesRule = config.module.rule("images");
        imagesRule.uses.clear();
        imagesRule
            .use("file-loader")
            .loader("url-loader")
            .options({
                limit: 16384, // 小于2k转长base64
                fallback: {
                    loader: "file-loader",
                    options: {
                        outputPath: "static/img"
                    }
                }
            });

打包后包大小减少了0.2M,效果不大,但是对图片处理更明显的优点是减少http请求以及在图片渲染过程中的性能提升。

最终效果

image.png

以上方式可使项目在花费较小时间成本的情况下让性能有较大提升,如对性能还有更高要求,仍有很多方式可进一步优化。

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

推荐阅读更多精彩内容