「分包异步化」+「分包预下载」
这是一个非常经典的小程序架构问题!针对你的顾虑,我提供明确的建议:绝对不要复制页面重新写。复制页面会导致严重的“代码冗余”,以后每次修改卡片逻辑你都要改两遍,这是后期维护的灾难。
你目前的想法(复用页面,不放主包,修改 app.json)方向非常正确。微信官方专门为这种场景提供了一个完美的解决方案:「分包异步化」+「分包预下载」。
我已经帮你修改了代码,完美解决了跨分包调用组件和 JS 的问题,且不占用任何主包体积。以下是具体的方案和修改点:
最优方案:分包异步化 + 分包预下载
这个方案的核心是:当 editCard 页面加载时,允许它“异步”地去拉取 subPackageChainCard 分包里的组件和 JS 文件,同时通过配置预下载让这个过程无感。
1. 解决跨分包组件引用(已修改 editCard.json)
小程序规定,跨分包使用自定义组件时必须配置 componentPlaceholder(组件占位符),这样在目标分包还没下载完时,它会先渲染一个 view,下载完后自动替换为实际组件。
// subPackageSetting/card/editCard/editCard.json
{
"usingComponents": {
// ...其他组件
"store-select-flow": "/subPackageChainCard/components/storeSelectFlow/storeSelectFlow"
},
"componentPlaceholder": {
"store-select-flow": "view" // 核心配置:开启分包异步化
}
}
2. 解决跨分包 JS 引用(已修改 editCard.js)
你在 editCard.js 第 385 行通过 require 引入了另一个分包的 mock 数据。跨分包的 JS 强行同步 require 会报错,必须改为异步拉取 require.async:
// subPackageSetting/card/editCard/editCard.js
async openStorePopup() {
wx.showLoading({ title: '加载中' })
try {
// 核心修改:改为异步引入,确保跨分包 JS 不会报错
const mockData = await require.async('../../../subPackageChainCard/mock/chainCardMock.js')
const res = await mockData.getSelectCardTypeData()
// ...
}
}
3. 提升用户体验:配置分包预下载(已修改 app.json)
为了防止用户点击时再去下载分包导致等待时间过长,我们在 app.json 中配置了预下载规则。当用户进入卡片列表(subPackageSetting/card/card)时,微信就会在后台静默下载 subPackageChainCard 分包。
// app.json
"preloadRule": {
// ... 其他规则
"subPackageSetting/card/card": {
"network": "all",
"packages": [
"subPackageChainCard"
]
}
}
方案优势总结
- 0 主包负担:
storeSelectFlow组件依然留在子包里,主包体积不增加一字节。 - 0 代码冗余:你依然可以在
chaincardList.js的 102 行直接复用并跳转到原来的editCard页面,后续卡片逻辑维护只需改一处。 - 体验无缝:配合预下载,用户点开通卡组件的弹窗时,由于包已经提前下好了,体验跟本地组件一模一样。
代码我已经帮你改好了,你现在可以直接去开发者工具编译预览,测试跨分包组件和 JS 是否能正常渲染及页面复用起来应该已经没有阻碍了!如果有无问题!
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/19895312

浙公网安备 33010602011771号