小程序包大小优化(uni-app)

uniapp vuecli 启动 dev模式下 已勾选压缩但无法压缩问题 解决 使用折中的办法 虽然可以解决一些问题 ,但是如果dev开发模式下文件没有压缩 会导致 vendor.js 文件过大 最终会导致hubuiberX 运行某一个页面组件报错 ,导致代码无法热更新 程序无法写下去。HBuiderX 运行小程序时已勾选 运行时是否压缩代码选项 但是代码并未被压缩。hubuiberX 无法压缩 上传代码不了微信平台 也可以使用hubuiberX的发布模式进行压缩解决。代码可以设置开发预览是体积调整为4m来解决编辑问题,但是文件过大,无法预览及真机预览。 阅读详情

 

背景

在开发微信小程序的过程中,随着业务逻辑日渐庞大之后,突显了一些问题。

首先我们发现在 dev mode 时,本地包大小已经达到了 4m+,这种情况下,已经无法在 dev mode 使用真机调试了。

其次此时,小程序 build 后也有 1.8M 左右。而且后续还有相当多的业务需求需要开发,包大小肯定会更大。

这时候就想要优化小程序包大小。下面分享一下我的定位过程和解决思路。尽管我们使用 uni-app 开发,但思路是通用的,希望能给大家一些帮助吧。

如何减小包大小

代码分析

首先分析包大在哪儿了。

打开本地代码目录查看文件大小。可以发现 common/vendor.js 和 page,components 中 js 占了大部分。

在 build 编译模式下,代码压缩已经启用了,需要思考别的优化方式。这时候可以使用webpack-bundle-analyzer插件。它可以帮助分析 vendor.js 中都有哪些 js 模块,哪些模块比较大,以便我们进一步优化代码

通过这个插件,发现了下面两个问题。

问题一: uni-app 自定义组件模式编译 tree shaking 无效

如果不是使用 uni-app 开发可以跳过这一段

通过代码分析发现有些模块应该被 tree shaking 但却被打包进来了。基本确定是 tree shaking 没有生效。

同样是 webpack4 + babel7。在不使用 uni-app,直接使用 vue-cli create 项目的前提下,tree shaking 是没有问题的。而使用 uni-app 去新建项目,tree shaking 却无效。

排查 babel 配置时发现是由于 uni-app 在创建项目的时候,设置了 modules: 'commonjs'导致。修改后,demo 的 tree shaking ok。但是回到项目里一编译,又出错了。继续定位发现是 uni-app 自定义组件模式编译问题。目前uni-app已经修复了我提的bug,虽然还未正式发布。

当然你不使用 uni-app 自定义组件模式编译也可以解决,uni-app 还支持template模板模式,但是会有一些开发差异和性能差距,有兴趣可以看下这篇文章

问题二:部分库不支持 tree shaking

有些库(比如 lodash)本身并没有使用 import/export,所以 webpack 并不能对它们 tree shaking。这些库我们可以分情况优化。

首先可以找下网上是否有库对应的 esm 版本可以替代,如 lodash-es。

其次可以从代码分析中看出,如果库的每个模块都在不同文件中,入口文件只是一个统一入口,那么我们就可以通过修改写法按需加载,如

import add from "lodash/add";
import Button from 'ant-design-vue/lib/button';
复制代码

我们也可以使用babel-plugin-import插件针对那些库统一实现按需加载,它的本质是在编译时统一按配置修改加载路径,不需要自己手动去修改代码。

最后如果都不行,那要么接受,要么自己重写为社区做贡献~

规范模块开发

为了免除无法 tree shaking 的烦恼,我们在开发 npm 模块的时候也需要遵循一定的规范,从而减少模块打包后的大小。

同时支持 commonjs 和 es module

我们的模块需要同时支持 commonjs 和 es module。这样才能既满足 commonjs 开发的用户,又支持 tree shaking。

如何实现呢?如果你的代码是 typescript,以@sentry/browser 为例,可以在编译时编译 cjs 和 esm 两种规范代码,如下

// package.json
"build": "run-s build:dist build:esm build:bundle",
"build:bundle": "rollup --config",
"build:dist": "tsc -p tsconfig.build.json",
"build:esm": "tsc -p tsconfig.esm.json",
复制代码

然后在 package.json 中指定两个入口以及无副作用标识

  "main": "dist/index.js",
  "module": "esm/index.js",
  "sideEffects": false,
复制代码

这样当 webpack 解析模块(解析规则),就会按需优先解析 esm 目录。并且当识别到无副作用时进行 tree shaking。

如果你的代码本身就是 es6,你也可以这样

"module": "src/index.js",
复制代码

第三方自定义组件

如果使用了第三方微信自定义组件,由于引用是在 json 文件,所以 webpack 在编译时并不能通过 entry 分析到相关文件,因此不会对其进行编译、压缩等。这时候就需要我们自己处理。而且由于 webpack 不处理,tree shaking 自然也无法支持,因此建议尽量避免这种方式引用组件。

分包

小程序分包也是一种常规的优化方案。

通过分析后,可以将一些较大的页面划分为子包。如果有单页依赖第三方自定义组件,而且第三方组件还挺大,也可以考虑将该页面划分为子包。也因此尽量避免将第三方自定义组件放在 globalStyle,不然没法将它放到子包去。

大图不要打包

小程序中的大图,尽量避免打包进来,应该放到 CDN 通过 url 加载。我们的做法是在开发时加载本地图片,在 CI/CD 环节自动化发布图片,并改写地址。

如何解决真机调试问题

首先还是查看编译后的文件,发现common/vendor.js巨大,足有 1.5M。其次pages和components也有 1.4M,而这其中占了 js 的大小又占了绝大部分。

为什么 js 文件这么大呢?主要是因为在 dev mode 默认并没有压缩,当然也没有 tree shaking。

我的选择是修改编译配置,在 dev mode 压缩 js 代码。本地代码减少到了 2M。预览大小则是减少到了 1.4M。参考配置如下:

// vue.config.js
    configureWebpack: () => {
        if (isDev && isMp) {
            return {
                optimization: {
                    minimize: true,
                },
            }
        }
    }
复制代码

这看上去并不是个好方案,但确实简单有效。也考虑过分包,但分包并不能解决 common/vendor.js 巨大的问题,预览时包还是很大。如果有其它好的办法也欢迎留言~

 

《uni-app 小程序包体积优化:删除无用代码、图片压缩、分包加载,轻松过 2M 限制》(附微信小程序分包配置步骤) 本文针对uni-app跨端开发中小程序体积超标问题,提出三大优化策略:1)代码精简,通过按需引入组件、替换重型依赖和清理无效代码;2)图片压缩,采用工具压缩、base64内嵌和CDN存储;3)智能分包,合理划分主包与分包功能模块。结合某旅游小程序从3.2M压缩至890KB的案例,详细介绍了分包配置、资源存储规则及预加载机制,为开发者提供了一套可落地的体积优化方案,有效解决2M主包限制难题。 阅读详情

相关推荐

uni-app集成ECharts实战:从引入到体积优化的完整指南

本文详细介绍了在uni-app项目中集成ECharts的完整流程,从引入适配版本到解决文件过大问题。通过自定义构建精简版ECharts、分包加载等优化策略,有效控制小程序包体积,同时提供性能优化与多平台适配的实战经验,帮助开发者高效实现数据可视化需求。

weixin_28723171的博客 222

uniapp 配置treeShaking摇树优化保持项目代码最精简化

配置treeShaking摇树优化,根据项目需求,动态打包框架所需的组件及API,保持项目代码最精简化 https://uniapp.dcloud.io/collocation/manifest?id=optimization

weixin_46337813的博客 2703

UniApp H5加载慢?5招UniApp优化方法让你的应用流畅到飞起!

减少没用的东西只更新该更新的部分UniApp 虽然是“跨端”,但性能也能搞得像原生一样猛。别再一味埋头加功能,抽空搞搞这些“被埋藏”的优化项,加载速度不止能追上对手,说不定还能拉开差距!📌如果你也踩过这些坑,欢迎评论区交流~有需求我后续再更新一波小程序/APP端优化!👀。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 881

摆脱无用代码的负担:TreeShaking 的魔力

是一种优化技术用于删除 JavaScript 代码中未被实际使用的代码。它通过分析代码中的依赖关系,并删除那些未被引用的代码,从而减少代码的体积,提高代码的性能。的背景是随着 JavaScript 应用程序的规模和复杂性不断增加,代码的体积也随之增大。这会导致应用程序的加载速度变慢,影响用户体验。为了解决这个问题,应运而生,它通过删除未被使用的代码,减少代码体积,提高应用程序的性能和加载速度。的实现需要编译器或工具的支持,例如WebpackBabel等。

你若盛开,清风自来 1434

32位ALU设计(verilog实现)

32位ALU设计 ​ 算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。算术逻辑单元是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算,如加减乘(不包括整数除法)。基本上,在所有现代CPU体系结构中,二进制都以补码的形式来表示。 设计思路 设计实现 仿真测试 文章目录32位ALU设计一、设计

Destiny的博客 4万+

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152

前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc...

沈醉不知的博客 2万+

uni-app Tree Shaking:跨端无用代码消除

在当今多端融合的开发时代,开发者面临着一个核心矛盾:既要享受跨端开发的便利性,又要避免因多平台支持而导致的包体积膨胀。传统跨端框架往往将所有平台的代码都打包到最终产物中,即使用户只使用其中一个平台,也不得不承担所有平台的代码体积代价。 uni-app 通过先进的 Tree Shaking(树摇)技术,完美解决了这一痛点。本文将深入解析 uni-app 的 Tree Shaking 实现原理、使用...

gitblog_00563的博客 1194

DolphinScheduler任务状态异常排查:从僵尸任务到数据库修复全流程

本文详细介绍了DolphinScheduler中僵尸任务的识别、诊断与修复全流程,包括数据库层面的SQL操作指南、系统恢复验证方法以及预防措施。针对任务状态异常问题,提供了从基础排查到高级源码分析的完整解决方案,帮助运维人员有效管理系统资源和工作流调度。

weixin_27966471的博客 133

uni-app填坑指南——解决处理处理静态资源的问题

如何为uni-app打补丁,补足其对于静态资源处理的短板。

【蜀山风行】的专栏 4722

3D 韩系风格漫剧人设 | GPT-Image2 人设生成【附完整提示词】

宁姚同款清冷剑系美人,极致小巧鹅蛋脸,下颌线紧致纤细流畅,下巴小巧精致收窄,小脸衬得五官格外舒展,韩式水光肌,面部精细水光高光,鼻梁高光、鼻尖高光、面中苹果肌高光、唇珠高光,红棕色长卷发偏分大波浪,垂在一侧肩前,发量蓬松。发量丰厚蓬松有体积感,不贴头皮,几缕碎发自然垂落脸侧修饰脸型,长度过胸及背,发丝柔顺丝滑卷度自然,发尾自然垂落,身穿香槟色缎面挂脖长裙,挂脖设计无袖露肩露背,上半身围裹式荡领胸口垂褶,腰部堆褶收腰,修身直筒包臀裙长度到脚踝,缎面光泽感强垂坠感好,极简剪裁。纯白色背景,3D漫剧写实厚涂风。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 135

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

解决uni-app微信小程序打包超限(亲测有效)

今天遇到一个问题,使用uni-app开发微信小程序,运行到微信开发者工具,点击预览按钮进行打包,提示包大小超限>2M 解决办法: 1.找到项目中的manifast.json文件 2.在manifast.json中增加optimization配置(uni-app文档说明) "optimization":{ "subPackages":true } 完整代码: "mp-weixin" : { "appid" : "xxxxxxxxxxxxxxxxxxxx", "setting" : { "ur

阿小绿的博客 7302

采样率转化代码C++(有理倍数,升采样、降采样均可)

【代码】采样率转化(有理倍数,升采样、降采样均可)

goudahai的专栏 547

uni-app小程序超2M分包加载

uni-app如何分包: 微信官方要求小程序单包不能超过2M/主包,整包不能超8M,如果我们不做分包处理是无法正常上传到微信平台的,所以这里我针对做了以下分包。 1.页面分包: 分包加载配置,此配置为小程序的分包加载机制。在App里始终为整包。 我用的开发工具是vsCode,所以按照最后面的方案配置,找到根目录下的package.json文件,在build:mp-weixin 添加"–minim...

如果人生就像一场梦,那就希望你做个好梦! 5050

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 770

深入理解鸿蒙输入子系统驱动:HDI接口、HAL层与内核驱动的协同机制

/ 扫描输入设备// 打开指定输入设备// 关闭指定输入设备// 获取指定设备信息// 获取所有设备列表鸿蒙输入子系统驱动采用分层架构设计,通过HDI接口层实现硬件抽象,HAL层提供统一的事件处理机制,用户空间驱动层负责设备管理和事件分发。整个系统支持多种输入设备类型,包括触摸屏、按键、鼠标、键盘等,并提供了完整的HID设备支持。分层架构:清晰的层次划分,便于维护和扩展事件驱动:基于epoll的高效事件处理机制设备管理:完善的设备生命周期管理HID支持。

m0_67505153的博客 213

uni-app 微信小程序发布时,主包超过2M限制

暂时这些已经满足我了,后面若有更好的会更新。看到了一个博主推荐的小程序包大小优化工具:

星星点灯的博客 8635

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

常规优化已用尽?小程序体积深层次优化实战!!!

如果已经完成了常规的代码压缩、图片优化和无用代码删除,但包体积依然超出限制(微信小程序主包限制通常为 2MB),说明项目已经进入了深水区优化。此时需要从架构层面和构建策略入手。

m0_46165586的博客 627

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

uniapp 微信小程序分包规范

<think>我们根据用户要求,生成≤150字的文章摘要。内容是关于小程序pages.json配置,包括主包放首页和隐私协议,分包按业务拆分,文件夹路径一致等。需精炼。</think>小程序pages.json配置要点:主包仅放启动相关页(首页、隐私协议),减少体积;业务页面放入分包按需加载。分包通过subPackages按业务拆分,每个业务一个分包。文件夹路径与页面路径保持一致,规范清晰。

apple_70049717的博客 57

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

uniapp开发的微信小程序使用crypto-js和jsencrypt包大小超问题

1、crypto正常压缩版大小60kb左右,但如果只是单独使用某些功能,可以安装按需导入,特别注意一定要下载crypto-js@3.1.9-1版本,按需导入使用后占用是16kb左右。2、jsencrypt正常压缩版大小54kb左右,但是如果只是想用里面rsa公钥加密的功能,可以用我下面封装的rsa方法,体积大小19kb左右。3.1、附上crypto-js和jsencrypt共用的js。3、下面跟本次内容无关,如有需要。2.1、rsa方法如下。

weixin_44953151的博客 211

uni-app开发小程序主包大小优化终极解决方案

小程序主包体积优化终极解决方案,可将 uni-app 导出的小程序一级目录下的文件打入分包,从而减小主包体积。

qq_28729555的博客 1649

uni-app 转微信小程序 · 避坑与实战全记录

独立分包”就像独立 App,启动快但自给自足;普通分包像插件,启动慢但可共享主包代码。

2501_92872533的博客 2259

可能媒用小程序 开发日志(uni-app分包,微信小程序分包)小程序包大小超过2MB限制

分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。这部分就不介绍了一般不会用到,我的小程序用到了独立分包功能可以体验下。......

qq_32806415的博客 1312

uni-app中v-if失效与内存泄漏问题解析

在Vue.js开发中,v-if指令是常用的条件渲染工具,其原理是通过动态添加/移除DOM节点来控制元素显示。但在uni-app跨平台框架中,由于需要兼容不同平台的渲染机制,v-if在某些场景下可能出现DOM节点未销毁的问题,导致内存泄漏。这种情况常见于包含插槽的组件结构,特别是在微信小程序和APP端表现明显。通过分析uniapp的编译原理发现,其虚拟DOM协调机制会保留插槽内容缓存以优化性能,但这也可能造成节点残留。解决方案包括改用动态组件、手动清理插槽引用或调整编译配置,这些方法能有效减少内存占用并提升应

weixin_33738578的博客 313

基于uni-app的微信小程序之分包

关于分包 规定小程序不能超过2M,一旦超过就需要分包 注意事项 subPackages 里的pages的路径是 root 下的相对路径,不是全路径。 微信小程序每个分包的大小是2M,总体积一共不能超过16M。 百度小程序每个分包的大小是2M,总体积一共不能超过8M。 支付宝小程序每个分包的大小是2M,总体积一共不能超过4M。 QQ小程序每个分包的大小是2M,总体积一共不能超过24M。 分包下支持独立的 static 目录,用来对静态资源进行分包。 uni-app内支持对微信小程序、QQ小程序、百度小程序分包

sumimg的博客 829

uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题

在main.js页面定义js全局变量// 背景图片路径。

7681
上一篇: 使用Matplotlib在Python中绘制三维散点图
下一篇: vue 语法
std7879
博客等级 码龄5年 273粉丝 283原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

std7879

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值