【uniapp&微信小程序】小程序分包加载机制与配置

文章介绍了微信小程序因体积和资源加载限制采用分包策略,通过配置pages.json创建分包,优化下载和启动速度。分包配置包括主包和多个不超过2M的分包,且总体积不超过20M。分包间资源不可互相引用,但能引用主包资源。此外,通过preloadRule定义预下载规则,提高用户体验。

前言

        因为小程序有体积和资源加载限制,各家小程序平台提供了分包方式,优化小程序的下载和启动速度。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据pages.json的配置进行划分。在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,会把对应分包自动下载下来,下载完成后再进行展示。

分包配置

        目前微信小程序每个分包的大小是2M,总体积一共不能超过20M,要实现分包,小程序分包目录结构需如下:

┌─pages
│  ├─index
│  │  └─index.vue
│  └─login
│     └─login.vue
├─pagesA
│  ├─static
│  └─pages
│      ├─pagesA1
│      │  └─pagesA1.vue
│      └─pagesA2
│         └─pagesA2.vue
├─pagesB
│  ├─static
│  └─pages
│      ├─pagesB1
│      │  └─pagesB1.vue
│      └─pagesB2
│         └─pagesB2.vue
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json

 以上是项目文件位置,接下来需配置pages.json文件,通过subpackages创建分包:

	"subPackages": [ //通过subpackages节点创建分包结构
		{
		  "root": "pagesA", //分包的根目录
          "name": "pA", //可设置分包别名
		  "pages": [ //当前分包下的所有页面的相对存放路径
			{
			  "path": "pages/pagesA1/pagesA1",
			  "style": {
				"navigationBarTitleText": "分包pagesA下pagesA1页面"
			  }
			},
			{
			  "path": "pages/pagesA2/pagesA2",
			  "style": {
				"navigationBarTitleText": "分包pagesA下pagesA2页面",
			  }
			}]
		},
		{
		"root": "pagesB",
		"pages": [
			{
			"path": "pages/pagesB1/pagesB1",
			"style": {
				"navigationBarTitleText": "分包pagesB下pagesB1页面"
			}
			},
			{
			"path": "pages/pagesB2/pagesB2",
			"style": {
				"navigationBarTitleText": "分包pagesB下pagesB2页面"
			}
			}]
		}
	],

subPackages 节点接收一个数组,数组每一项都是应用的子包,其属性值如下:

属性类型是否必填描述
rootString子包的根目录
pagesArray子包由哪些页面组成,参数同 pages

配置完成后打开微信开发者工具,右上角详情按钮打开查看基本信息:

 这里可以看到我们成功创建了pagesA与pagesB分包。

分包的引用原则

需要注意,一旦创建了分包,那么主包无法引用分包内的私有资源(如img等),分包之间也不能互相引用私有资源,但分包可以引用主包资源。

 

分包预下载

分包预下载指的是在进入某个指定页面,下载需要的分包资源,这一功能可pages.json文件,通过preloadRule节点定义分包预下载的规则,preloadRule中,key是页面路径,value是进入该页面的预下载配置,其配置项如下:

字段       类型必填默认值说明
packages     StringArray需要预下载的包名,可填分包root或name,_APP_表示主包。
networkString        wifi在指定网络下预下载,可选值为:all(不限网络)、wifi(仅wifi下预下载)
"preloadRule": {
		"pagesA/list/list": { //触发分包预下载的页面路径
			"network": "all", //表示在指定的网络模式下进行预下载
			"packages": ["__APP__"] //表示进入页面之后,预下载哪些分包
		},
		"pagesB/detail/detail": {
			"network": "all",
			"packages": ["pagesA"]
		}
	}

总结

        到这里关于分包配置就完成啦,解决了以往所有页面和资源都打包在一起,导致项目体积过大所造成的性能问题,并且在团队开发时可以更好的解耦协作 


推荐阅读

[uniapp&微信小程序]vue3+ts+vite+pinia+eslint+prettier+husky项目搭建

快速搞懂Pinia及数据持久化存储(详细教程)

多终端响应式开发(Bootstrap栅格系统原理及实现)

Print.js实现打印pdf,HTML,图片(可设置样式可分页)

### UniApp 微信小程序分包之间页面跳转实现 在 UniApp 开发环境中,为了提升用户体验并加快应用启动速度,通常会采用分包策略来优化微信小程序。通过合理规划分包的内容分布,能够有效降低初次加载所需的时间。 #### 分包配置概述 对于希望实施分包机制的应用而言,在 `pages.json` 文件里除了常规的 `pages` 字段外还需要额外增加一个名为 `subPackages` 的字段用于描述各个子的信息[^4]: ```json { "pages": [ { "path": "pages/index/index", "style": {} }, ... ], "globalStyle": {}, "subPackages": [ { "root": "subpackageA", // 子路径名 "pages": [ {"path":"pageOne/pageOne"}, {"path":"pageTwo/pageTwo"} ] } ] } ``` 上述 JSON 片段展示了如何定义多个属于不同子下的页面;其中 `"root"` 属性指定了该子所在位置而 `"pages"` 则列举出了隶属于此子内的具体页面列表。 #### 页面间导航逻辑编写 当涉及到跨间的页面切换操作时,开发者应当利用 Vue Router 或者原生 API 来完成这一过程。考虑到兼容性和简便性,推荐使用官方提供的 wx.navigateTo() 方法来进行路由管理: ```javascript // 假设当前位于中的某个组件内执行如下代码片段即可实现在向任意指定子内部页面转发的功能。 wx.navigateTo({ url: '/subpackageA/pageOne/pageOne' }); ``` 值得注意的是,这里的 URL 地址是以 `/` 开头表示绝对地址而非相对地址形式给出目标页面的确切位置。另外还需注意一点就是如果要从一个子转向另一个不同的子,则必须先返回至再做进一步处理[^1]。 #### 处理特殊情况 有时可能会遇到一些特殊场景比如点击链接无响应或者是白屏现象等问题。这可能是由于未正确设置依赖关系或是存在资源加载失败的情况所引起的。针对这类问题建议仔细检查项目结构以及确保所有必要的静态文件都已妥善放置于对应的目录下[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

琢鸣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值