taro项目减少小程序主包体积

发现问题

目前小程序分包大小有以下限制:

  • 整个小程序所有分包大小不超过 20M
  • 单个分包/主包大小不能超过 2M

分析问题

小程序官方:在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。

在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。

概括一下就是说,主包用来放首页及所有分包都会用到的公共资源。那么先来看下目前主包的依赖分析。


优化前.png

可以看到,我们的主包已经距离2MB很近了,common.js是最大的,因为其中有很多公共模块的js资源,如可回溯,埋点等;其次是app.wxss,放置公共的css,但是app.wxss居然有380KB。有点大的不太正常。
分析了一下:

  • 全局引入的scss里面,有些并不真正意思上属于全局样式也放到公共样式里面了
  • 打包后看到common.wxss里面的图片引入都是base64?并没有按照阈值去打包成base64还是cdn url引入形式,有些图片还50多k,怪不得wxss这么大

知道问题后下面就可以有的放矢了。

解决问题:减少小程序主包体积

非公共css放回各自组件

将一些非公共css放回组件本身,再看打包后依赖分析,可以看到,app.wxss从380KB->132KB,代码总体积明显降了,由原来的3.21MB->2.98M,主包也从1.93M->1.69M,主包足足减少了240KB,这对原本剩余可用体积本就不大的小程序来说犹如雪中送炭。


抽离非公共css后.png

公共css及组件css中的图片引用路径进行url-loader处理

上面操作主包能减少200多KB主要因为有些图片其实并没有转化成cdn引用形式,都是base64格式,所以导致css非常大,那么需要优化css中图片的引入方式。

sass-loader会解析~,相当于@import语法一样,~相对于后面的路径,会告诉webpack去检索资源,loader 首先会尝试以相对路径解析 @import,如果它不能被解析,loader 将会尝试在 node_modules 中解析 @import。只在前面加上 ,那么/ 将会解析到用户的主目录(home directory)

基于原有配置:url-loader处理图片,设置图片转化阈值是1KB

// config/index.js
postcss: {
  // ...
  url: {
    enable: true,
    config: {
      limit: 1024 // 设定转换尺寸上限
    }
  }
  // ...
},
mini: {
    publicPath: 'https://test.cdn.net/ias-web',
    imageUrlLoaderOption: {
        name: 'cdn/imgs/[contenthash:8]_[name].[ext]',
        publicPath: process.env.NODE_ENV === 'development' ? '/' : 'https://test.cdn.net/ias-web'
    }
},

解决思路:

由于原来css中使用相对路径引入图片,导致图片打包之后都是base64格式(小程序中是如此,h5会根据图片大小做处理),没有起到按指定图片大小生成base64格式或者cdn形式引入,所以这里首先需要让图片路径经过url-loader的处理。

  1. 将css里面图片引用的的资源有原来的相对路径替换成~开头(打包配置中已经定义了别名alias的@相对于项目主目录)
// 优化前
background: url(../../assets/images/header.png)

// 优化后
background: url(~@/assets/images/header.png)

本地通过build打包成生产包,可看到路径的变化,配置的图片路径转化阈值是1024(1KB)

// 优化前:实际超过1KB的图片的图片base64比以下大得多,这里为了方便展示删减了大小
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAOVBMVEUAAAC1tbW1tbX///+1tbW1tbXAwMC0tLS0tLS0tLS1tbW2tra1tbW3t7e1tbW1tbW1tbW2tra0tLQ5iBa1AAAAEnRSTlMAiUIC5tkK8sy/tXZTPCZrqGxEqinjAAAAuElEQVQoz4WT3Q6CMAxG267bQAT0vP/DKkYbIZB+F8uyk/W/EiqzjrX3Oupc5Kg2OSGf2p7eHara0tpiWsHvf7AoDCYhG0BL0AesO39lhcfvRekmB1lHv34h6O0WHD7+m7PGJ4jrim/xTwzlDJeB6X06Jnsc5r3ITJVzLJVZFL3AHzRiV9gYpbJc4YUqnbbly0Fb/o2e4MR4ElqSWFKWpKhJS64b+sRbMg7JMCWjmAxysgbZEiUr+ALtDw9fVVYh+wAAAABJRU5ErkJggg==)

// 小程序优化后打包:超过1KB的图片
background: url(https://test.cdn.net/ias-web/cdn/imgs/aa13wewe_header.png)

// 小程序优化后打包:没超过1KB的图片
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAOVBMVEUAAAC1tbW1tbX///+1tbW1tbXAwMC0tLS0tLS0tLS1tbW2tra1tbW3t7e1tbW1tbW1tbW2tra0tLQ5iBa1AAAAEnRSTlMAiUIC5tkK8sy/tXZTPCZrqGxEqinjAAAAuElEQVQoz4WT3Q6CMAxG267bQAT0vP/DKkYbIZB+F8uyk/W/EiqzjrX3Oupc5Kg2OSGf2p7eHara0tpiWsHvf7AoDCYhG0BL0AesO39lhcfvRekmB1lHv34h6O0WHD7+m7PGJ4jrim/xTwzlDJeB6X06Jnsc5r3ITJVzLJVZFL3AHzRiV9gYpbJc4YUqnbbly0Fb/o2e4MR4ElqSWFKWpKhJS64b+sRbMg7JMCWjmAxysgbZEiUr+ALtDw9fVVYh+wAAAABJRU5ErkJggg==)

小程序打包后可以看到没超过1KB图片生成base64,超过1KB的图片url会按照url-loader配置中的生成指定url(h5试了默认阈值是10KB,但也可以设置),图片会生成到dist/cdn/images/aa13wewe_header.png,只要将图片推到远程cdn,再部署下小程序代码,看起来就大功告成了。

燃鹅......

进行本地调试:

// 优化前:实际超过1kb的图片的图片base64比以下大得多,这里为了方便展示删减了大小
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAOVBMVEUAAAC1tbW1tbX///+1tbW1tbXAwMC0tLS0tLS0tLS1tbW2tra1tbW3t7e1tbW1tbW1tbW2tra0tLQ5iBa1AAAAEnRSTlMAiUIC5tkK8sy/tXZTPCZrqGxEqinjAAAAuElEQVQoz4WT3Q6CMAxG267bQAT0vP/DKkYbIZB+F8uyk/W/EiqzjrX3Oupc5Kg2OSGf2p7eHara0tpiWsHvf7AoDCYhG0BL0AesO39lhcfvRekmB1lHv34h6O0WHD7+m7PGJ4jrim/xTwzlDJeB6X06Jnsc5r3ITJVzLJVZFL3AHzRiV9gYpbJc4YUqnbbly0Fb/o2e4MR4ElqSWFKWpKhJS64b+sRbMg7JMCWjmAxysgbZEiUr+ALtDw9fVVYh+wAAAABJRU5ErkJggg==)

// 小程序优化后本地调试:css中会提示do-not-use-local-path
background: url(/cdn/imgs/aa13wewe_header.png)

h5中在可以访问本地路径图片,但是小程序中并没有显示出图片,因为小程序的css不支持本地路径的图片引入。会报错提示:[渲染层网络层错误] app.wxss 中的本地资源图片无法通过 WXSS 获取,可以使用网络图片,或者 base64,或者使用<image/>标签。

由于h5和小程序有差异性,那么需要对小程序单独处理。这里的兼容处理就是在本地开发调试的时候默认都转成base64,方便本地进行开发。测试和线上部署则使用原有的配置。

// 修改配置
if (process.env.NODE_ENV === 'development') {
    mergeConfig.mini.imageUrlLoaderOption.limit = 102400
}

这里修改url-loader转换base64的阈值,有两个用处:

  • 兼容小程序本地调试
  • 之前项目中没注意拿到的切图尺寸不对或者没经过压缩,导致图片太大,大于100KB,如果没有发现的话会造成资源过大请求缓慢,这里设置了阈值则在本地调试过程中如果有超多100KB的图片,在小程序中直接不会展示出来,也算是有效提醒,提前发现问题(如果图片实在超过100KB建议进行分段裁剪,分段引入),

温馨提示:本地小程序用二维码预览,如果本地代码新增了新的图片并且build打包后是cdn引用形式,需将代码部署到远端,部署cdn后,本地打包预览后请求的cdn图片才能显示出来。

结果

完成后,可以看到app.wxss从132KB->72KB,代码总体积从2.98MB-2.92MB,主包从1.69MB->1.63MB,减少60KB。


优化公共css后.png

整个解决过程并没有想象中顺利,但还是有所收获。

总结

  • 代码总体积由3.21MB->2.92M,主包也从1.93M->1.63M,主包足足减少了300KB
  • 代码css中引用图片有相对路径改成~@/assets/...形式
  • 本地调试小程序新增图片限制100KB,超过100KB本地调试不显示,引入图片尽量不要超过100KB
  • 本地小程序用二维码预览,如果本地代码新增了新的图片并且build打包后是cdn引用形式,需将代码部署到远端,部署cdn后,本地打包预览后请求的cdn图片才能显示出来。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容