前言
大家好,我是simple。我的理想是利用科技手段来解决生活中遇到的各种问题。
在移动应用开发里,热更新技术特别实用------不用重新装应用,就能更新内容,大大提升了迭代效率。本文结合给出的代码,跟大家详细说下H5资源包热更新怎么实现,包括资源下载、解压到渲染的完整流程。
一、热更新核心流程概述
H5资源包热更新的核心思路其实很直接:先通过网络下最新的H5资源压缩包,解压到本地沙箱目录,再用Web组件加载本地的H5资源,就能实现页面更新了。整个流程分三步关键操作:
- 下载H5资源压缩包
- 把资源包解压到本地目录
- 跳转到Web页面,渲染本地的H5资源
二、资源包下载实现
1. 下载前的文件检查与备份
怕下载失败把旧资源搞坏了,所以下载前会先查下沙箱目录里有没有同名的资源包,有的话先备份起来:
typescript
const fileName = "test.zip"
const filePath = getContext().filesDir + '/' + fileName
// 检查是否存在旧文件,存在则备份
if (fileIo.listFileSync(getContext().filesDir).includes(fileName)) {
fileIo.renameSync(filePath, getContext().filesDir + '/test.bak.zip')
}
2. 带进度的下载实现
用request.downloadFile
发个下载请求,再用事件监听实时显示下载进度,失败和完成也会有对应的处理:
typescript
const task = await request.downloadFile(getContext(), {
url: 'http://www.test.com/test.zip',
filePath // 下载后保存的路径
})
// 监听下载进度,更新进度条
task.on("progress", (current, total) => {
this.currentValue = current this.totalValue = total
})
// 要是下载失败了,弹个框提示错误
task.on("fail", (error) => {
AlertDialog.show({ message: error.toString() })
})
// 下载完成后,关掉加载状态,给个成功提示
task.on("complete", () => {
this.showLoading = false promptAction.showToast({ message: '下载成功' })
})
三、资源包解压与页面跳转
下载完之后,得把压缩包解压到本地目录,然后跳转到专门的Web页面,加载H5资源。
1. 解压实现
解压用的是zlib.decompressFile
,解压路径就选应用的沙箱目录,解压成功后直接跳Web页面:
typescript
async decompressFile () {
try { // 解压文件到沙箱目录
await zlib.decompressFile(this.filePath, getContext().filesDir)
// 解压成功后跳转到Web页面
router.pushUrl({ url: 'pages/webCase' })
} catch(error) {
// 解压失败就弹框提示错误
AlertDialog.show({ message: error.message })
}
}
四、H5资源渲染实现
WebCase
组件专门负责加载、渲染解压后的本地H5资源,关键实现看这里:
1. Web组件配置
用Web
组件加载本地H5资源时,有个关键点得注意:要开本地存储权限,不然H5可能用不了localStorage这些功能。代码里这么配:
typescript
Web({
controller: this.webController,
// 加载解压后的index.html文件
src: "file://" + getContext().filesDir + '/test/index.html'
})
.domStorageAccess(true)
// 重点!得让H5能用上本地存储
.width('100%')
.height("100%")
2. 调试模式开启
开发的时候要调H5页面,所以在页面初始化的时候,把Web调试模式打开,方便查问题:
typescript
aboutToAppear() {
// 开启Web调试模式,方便调试H5页面
webview.WebviewController.setWebDebuggingAccess(true);
}
五、关键注意事项
- 本地存储权限别漏了 :H5资源一般都要用到localStorage这类本地存储功能,必须设
domStorageAccess(true)
,不然H5运行的时候会报错。 - 文件路径得处理好 :用
getContext().filesDir
拿应用的沙箱目录,确保资源存在应用自己的私有空间里,不会有权限问题。 - 异常处理要做全:下载和解压的时候,得把异常都捕获到,用弹窗跟用户说清楚错在哪,体验会好很多。
- 版本管理不能少:实际项目里得加个版本校验的逻辑,别让相同版本的资源包重复下载,省流量也省时间。 这么一套流程走下来,应用就能实现H5资源热更新了------不用重新发版,就能更H5页面内容,给应用迭代加了不少灵活性。