解析 uni-app 小程序分包策略:合理优化包体积分布

image.png

引言

微信小程序的流行使得越来越多的开发者投入到小程序的开发中。但是,随着项目规模的增大,小程序的性能也会面临一些挑战。其中,小程序分包策略是提升性能的重要一环。

同时,uni-app 的流行也使众多的移动端开发者选择使用 uni-app 框架来开发移动端应用,因为开发者编写一套代码,可发布到 iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台,极大的提高了应用生产效率。

纵然 uni-app 支持众多的小程序平台,由于在开发中,我们主要的还是开发的微信小程序,所以本文将会以微信小程序分包为例,介绍微信小程序分包策略的原理和实现,以及如何根据项目特点和需求,制定合理的分包策略,从而优化性能,提升用户体验。而其他多家的小程序将不进行过多的说明。

一. 为什么要分包

微信小程序之所以需要分包,主要是为了解决小程序官方限制了主包体积和总体积的大小,如果应用体积超限,我们将不能发布到应用官方,最终会上不了线。

其次,不仅是由于官方有这个限制,本着用户体验的角度来思考问题,我们也必须要有做分包优化的操作,因为合理的分包可以有以下几个好处:

  1. 提高首页加载速度:随着小程序项目规模的增大,首页所需的代码和资源也会越来越多,导致首页加载时间变长,影响用户体验。通过分包,可以将部分代码和资源拆分到其他子包中,在首页加载时只需加载必需的核心代码,从而减少首页的加载时间。

  2. 优化性能:小程序的性能对用户体验至关重要。通过分包,可以将一些与首页无关的功能模块或页面、大型资源文件等拆分到子包中,子包的使用也可以帮助有效减少小程序包的体积,提升小程序的加载速度。

  3. 分包预下载:分包可以提前加载用户即将使用的功能模块,从而加快跳转到对应页面的速度。通过合理的分包策略和预下载机制,可以在用户交互前就将页面所需的代码和资源提前加载好,确保用户流畅的使用体验。

其实说到底,微信小程序的分包功能主要是为了能够更好地管理代码和资源,减少主包的体积,能够正常上线,同时优化小程序的性能和用户体验。合理使用分包可以减少首页的加载时间,升整体性能,控制包体大小,并通过预下载机制加快页面的跳转速度,提供快速的体验效果。

二. 制定合理的分包策略

小程序包拆分为主包和子包,其中主包包含了小程序的首页和一些常用基础功能模块,而子包则包含了其他功能模块和页面。主包在用户第一次打开小程序时会被下载和加载,而子包则根据需要来动态下载和加载。

制定合理的小程序分包策略可以提升小程序的性能和用户体验。以下是一些制定分包策略的建议:

  1. 根据功能模块拆分

将小程序的功能模块拆分成不同的子包。比如:tabbar 模块、用户模块、推送模块等等。

  1. 根据资源引用拆分

自定义组件、JS 文件、静态资源仅被一个分包使用时则把它划为同一个分包中,如果是公共的资源被各个分包使用,则将其划为主包子云啊

  1. 分包预下载配置

通过分包预下载机制,在用户需要时能够快速加载,配置 preloadRule 后,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度,减少用户等待时间,提升用户体验。

三. 具体操作

1. 确定分包结构

确定分包结构是重中之重,这就和建筑房屋一样,只要框架搭好了,其他的就都好办了。这里的分包结构就相当于框架,理清楚这里的结构,后面的就会特别简单。

以下是在实际项目中分包目录,主要进行了以下的拆解:

image.png

image.png

分包原则说明

每个子包下的目录包含按照下面的原则来划分:

  • 静态文件:分包下支持 static 等静态资源拷贝,即分包目录内放置的静态资源不会被打包到主包中,也不可在主包中使用

  • js 文件:当某个 js 仅被一个分包引用时,该 js 会被打包到该分包内,否则仍打到主包(即被主包引用,或被超过 1 个分包引用)

  • 自定义组件:若某个自定义组件仅被一个分包引用时,且未放入到分包内,编译时会输出提示信息

我们抽出几个重点的目录来进行说明

  • 主包:首页、tabbar 页面
    • 首页、tabbar 标签栏页面必须存在于主包下

  • 子包:(用户模块)
    • 所有的都是与用户相关的功能

    • 下属目录结构分为:pages、static、components

┌─components        // 主包组件
├─pages             // 主包页面
│  ├─tabbar         // tabBar 模块
│  ├─ ├─index
│  ├─ ├─message
│  ├─ └─center
├─pagesUser         // 分包:用户模块
│  ├─components     // 分包:组件
│  ├─static         // 分包:静态资源
│  └─pages          // 分包:页面
├─pagesApLink
│  ├─static
│  └─pages
├─pagesCenter
│  ├─static
│  └─pages
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json

2. 配置 pages.json

我们在完成好了分包目录的创建以后,接下来就可以着手进行 pages 页面路由配置了,正确配置才会使最终的分包生效。

在根目录下的 pages.json 文件中,使用subPackages字段来配置分包的信息。在subPackages中可以定义每个子包的路径、名称和需要包含的页面。

{"pages": [{"path": "pages/tabbar/index"}],"subPackages": [{"root": "pagesUser","pages": [{"path": "pages/profile"}]},{"root": "pagesApLink","pages": [{"path": "pages/link"}]},{"root": "pagesCenter","pages": [{"path": "pages/center"}]}],"tabBar": {"list": [{"pagePath": "pages/tabbar/index"},{"pagePath": "pages/tabbar/message"},{"pagePath": "pages/tabbar/center"}]}
}

3. 分包预载配置

假如子包的体积也过大,那么初次从主包页面进入子包页面的时候就会特别慢(这里只是做一种假设),需要用户进行等待,那么我们想要减少用户的这种等待时间,那么分包预下载的功能就能解决这个问题。

因此,分包预下载是提前将子包的代码和资源下载到用户设备上,从而在用户需要时能够快速加载。通过预下载机制,提前加载即将跳转到的子包,减少用户等待时间,提升用户体验。

配置如下:

{"preloadRule": {"pagesMessage/pages/message": {"network": "all","packages": ["__APP__"]},"pagesCenter/page/center": {"network": "all","packages": ["pagesMessage"]}}
}

注意,有一个限制:同一个分包中的页面享有共同的预下载大小限额 2M,限额会在工具中打包时校验。

例如:页面 A 和 B 都在同一个分包中,A 中预下载总大小 0.5M 的分包,B 中最多只能预下载总大小 1.5M 的分包。

4. manifest 使配置生效

在对应平台的配置下添加"optimization":{"subPackages":true}开启分包优化,则分包策略生效

image.png

image.png

四. 实践经验分享

1. 打包限制

  • tabBar  页面必须在主包内。

  • 首页必须在主包内,就是 pages.json 里配置的第一个页面路由。

  • 预下载限制:同一个分包中的页面享有共同的预下载大小限额 2M,限额会在工具中打包时校验。

2. 引用限制

  • 分包之间的资源不能互相引用私有资源,例如:packageA  无法 引入  packageB的相关文件。

  • 主包与分包之间的限制:即主包不能引用分包的私有资源,分包可以引用主包的公共资源。

3. 其他说明

  • subPackages  里的 pages 的路径是  root  下的相对路径,不是全路径。

  • 微信小程序每个分包的大小是 2M,总体积一共不能超过 20M。

  • 支付宝小程,百度小程序每个分包的大小是 2M,总体积一共不能超过 8M。

  • 针对vendor.js过大的情况可以使用运行时压缩代码

    • HBuilderX创建的项目勾选运行-->运行到小程序模拟器-->运行时是否压缩代码

    • cli创建的项目可以在package.json中添加参数--minimize,示例:"dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize"

结语

通过合理的微信小程序分包策略,我们可以将小程序的代码和资源拆分成多个子包,从而分散首页的加载压力,提升小程序的性能。

在制定分包策略时,我们可以根据功能模块划分来确定分包的范围和关系。同时,分包后我们也需要关注一些性能优化的细节,如首次加载优化和分包预下载技巧。

最后,我们也可以借鉴一些实践经验和注意事项,来优化自己的小程序分包策略,并提升用户的使用体验。

参考资料

  1. uni-app 分包加载机制

  2. 微信小程序使用分包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础入门转录组数据分析——单基因ROC分析

零基础入门转录组数据分析——单基因ROC分析 目录 零基础入门转录组数据分析——单基因ROC分析1. ROC分析的基础知识2. 单基因ROC分析(Rstudio)——代码实操2. 1 数据处理2. 2 单基因ROC分析2. 3 ROC曲线简单可视化 1. ROC分析的基础知识 1.1 ROC分析是…

如何在忘记密码或 ID 的情况下解锁 iPhone 15

您是否曾经因为忘记了 iPhone 密码而陷入困境,或者您是否多次错误地输入了屏幕时间密码并发现自己被锁定在 iPhone 之外? 被锁定和拒绝访问您的 iPhone 可能很常见,尤其是在您尚未配置 Face ID 的情况下。或者,如果 Face ID 无法正…

在head的style标签中直接添加css样式

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>内嵌样式示例</title> &l…

无人机校企合作:组装、维修、研发全面提升学生技能方好就业

无人机校企合作在组装、维修、研发等方面全面提升学生技能&#xff0c;进而促进学生就业&#xff0c;是一个具有前瞻性和实践性的教育模式。以下是对该合作模式的详细分析&#xff1a; 一、合作背景与意义 随着无人机技术的快速发展和广泛应用&#xff0c;市场对无人机专业人…

用Python在PDF文档中创建动作

PDF格式因其跨平台兼容性和丰富的功能集而成为许多行业中的首选文件格式。其中&#xff0c;PDF中的动作&#xff08;Action&#xff09; 功能尤为突出&#xff0c;它允许开发者嵌入交互式元素&#xff0c;如链接、按钮或是更复杂的脚本&#xff0c;从而显著提升文档的互动性和功…

Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码入选 2024 世界人工智能大会最高荣誉「镇…

SprinBoot+Vue超市管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

Golang学习笔记-Golang中的锁

同步原语和锁 Golang作为一个原生支持用户态的语言&#xff0c;当提到并发进程&#xff0c;多线程的时候&#xff0c;是离不开锁的&#xff0c;锁是一种并发编程中的同步原语&#xff08;Synchronization Primitives&#xff09;&#xff0c;它能保证多个 Goroutine 在访问同一…

4. kafka消息监控客户端工具

KafkaKing官网地址 : https://github.com/Bronya0/Kafka-King github下载地址 : Releases Bronya0/Kafka-King (github.com) (windows、macos、linux版本) 云盘下载地址 : https://pan.baidu.com/s/1dzxTPYBcNjCTSsLuHc1TZw?pwd276i (仅windows版本) 连接kafka 输入本地地址…

数据分析及应用:如何对试卷得分做min-max归一化处理?

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间): 试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时…

H5手机端调起支付宝app支付

1.调起APP页面如下 步骤 1.让后端对接一下以下文档&#xff08;手机网站支付通过alipays协议唤起支付宝APP&#xff09; https://opendocs.alipay.com/open/203/107091?pathHash45006f4f&refapi 2.后端接口会返回一个form提交表单 html&#xff1a;在页面中定义一个d…

【FRP 内网穿透】

文章目录 一、什么叫内网穿透1、内网穿透技术的描述2、内网穿透技术的工作方式通常包括以下几个步骤 二、用内网穿透解决了什么问题三、常见的内网穿透解决方式1、FRP &#xff08;开源&#xff09;2、花生壳&#xff08;商业&#xff09;3、ZeroTier&#xff08;开源 商业&…

用Python绘制历史K线数据

历史K线数据是指股票或指数在特定时间段内的价格变化记录&#xff0c;通常包括开盘价、最高价、最低价、收盘价以及成交量等信息。K线图是一种常用的图形表示方法&#xff0c;用于描述股票市场的价格波动&#xff0c;它由一系列的柱状图组成&#xff0c;每个柱状图&#xff08;…

[ACP云计算]易错题(原题)

ECS 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、 21、 22、 23、 24、 25、 26、 27、 28、 29、 30、 31、 32、 33、 34、 35、 36、 37、 对象存储OSS 1、 2、 3、 4、 5、 6、 重点&#xff01;&#xff01;&#xff…

本地部署一个WordPress博客结合内网穿透实现异地远程访问本地站点

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

.NET Razor类库-热加载 就是运行时编译

1.新建3个项目 1.1 一个.NET Standard2.1项目 IX.Sdk.SvnCICD4NuGet 1.2 一个.NET Razor类库项目 IX.Sdk.SvnCICD4NuGet.RazorWeb 1.3 一个.NET6 Web项目 IX.Sdk.SvnCICD4NuGet.Web 这3个项目的引用关系 Web引用 Razor类库 和 .NET Standard2.1 Razor类库引用.NET Standard2.1…

[LLM][Prompt Engineering]:大语言模型上下文学习-What、How、Why?

上下文学习 上下文学习什么是上下文学习2. 示例的选择2.1 相关度排序2.2 集合多样性2.3 大语言模型 3. 示例格式3.1 人工标注3.2 利用大语言模型自动生成 4. 示例顺序5. 上下文学习为什么可以work5.1 能力来源5.2 ICL的能力 Reference 在GPT-3的论文中&#xff0c;OpenAI 研究团…

【Tomcat+MySQL+Redis源码安装三件套】

TomcatMySQLRedis源码安装三件套 Tomcat部分概念Tomcat的作用Tomcat的原理Linux运维中的应用场景具体操作示例 基本使用流程实验Tomcat安装tomcat的反向代理及负载均衡源地址hash(不能负载)tomcat负载均衡实现&#xff08;使用cookie&#xff09; memcached 操作命令 理论补充结…

注册免费的vps:infinityfree

首先是注册网址 https://dash.infinityfree.com/login 各位自行注册就好了 注册好后创建账户&#xff0c;选择最左边这个免费的就可以了 然后可以创建一个子域名&#xff0c;各位自行选择后缀和填写前面就好了 然后拉下来选择 I approve 然后创建账户 然后就可以打开控制面…

LRN正则化是什么?

LRN正则化&#xff0c;全称为Local Response Normalization&#xff08;局部响应归一化&#xff09;&#xff0c;是一种在深度学习&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中常用的正则化技术。该技术旨在通过模拟生物视觉系统中的侧抑制现象&#xff0c;…