跨平台应用开发进阶(二十八) :资源加载速度优化解决方案

一、前言

uni-app开发APP实现上架后,后续面临一系列优化工作事项,其中,动态图片、视频加载慢就是亟需解决的用户体验差问题。

图片加载过程为:

  1. 调用后台接口,获取动态图片url;
  2. 根据后台接口返回的url,前端应用uni.downloadFile实现下载文件资源到本地,并返回下载地址。

从文件开始下载至下载完成,通过控制台看耗时6s!只是一张普通的图片,居然耗时如此长时间,不可思议 。

二、解决方案

当然,网络资源下载要同时考虑文件大小及设备网速带宽等因素。

优化事项:对于比较固定的动态资源,建议走本地缓存,若发现本地缓存与服务端返回资源ID不同,代表资源已更新,则需要同步更新本地缓存并做前端资源同步更新展示。若服务端返回的资源ID与本地缓存一致,则表明服务端资源更新,前端直接读取本地缓存做前端展示即可,通过减少资源频繁下载动作,提升了图片资源渲染性能,用户体验同时得到提升。

注⚠️:文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用uni.saveFile,才能在应用下次启动时访问得到。

实操代码如下:

javascript 复制代码
api.getInfoDetail({resourceId: resourceId}).then(res => {
    if (res.code === 0) {
        this.detailData = res.data;
        // 处理方式是先下载到本地再获取临时路径并持久化至本地
        // 先判断对应的resourceId 是否已经下载
		try {
			const value = uni.getStorageSync(this.resourceId + '');
			if (value) {
				console.log('内部存储获取成功,存储数据:', value)
				this.tempFilePath = value;
			} else {
				throw new Error("ending");
			}
		} catch (err) {
			console.log('内部存储获取失败,失败原因:', err)
			const downloadUrl = getBaseURL() + res.data.thumbnailUuid.slice(1)
			console.log('资源下载地址:', downloadUrl)
			uni.downloadFile({
				url: downloadUrl,
				success: (val) => {
					if (val.statusCode === 200) {
						this.tempFilePath = val.tempFilePath;
						console.log('资源下载成功,临时存放路径:', this.tempFilePath)
						// 临时下载成功后,持久化文件至本地
						let that = this;
						uni.saveFile({
						  tempFilePath: that.tempFilePath,
						  success: function (res) {
							console.log('持久化数据成功,资源存放路径:', res.savedFilePath)
							that.setImgCheckedObj(res.savedFilePath)
						  }
						});
					}
				},
				fail: (err) => {
					console.log('资源下载失败,失败原因:', err);
				}
			})
		}
    }
})

setImgCheckedObj(savedFilePath) {
	uni.setStorage({
		key: this.resourceId + '',
		data: savedFilePath,
		success() {
			console.log('存储数据成功!')
		}
	})
}

三、拓展阅读

相关推荐
UXbot2 分钟前
AI原型设计工具评测:从创意到交互式Demo,5款产品全面解析
前端·ui·设计模式·ai·ai编程·原型模式
落魄江湖行3 分钟前
硅基同事埋的坑,我用2小时才填平:Nuxt 4 路由踩坑:可选参数 [[id]] 与 [id] 的区别
前端
一勺菠萝丶9 分钟前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
军军君019 分钟前
Three.js基础功能学习十四:智能黑板实现实例一
前端·javascript·css·typescript·前端框架·threejs·智能黑板
小村儿11 分钟前
连载05-Claude Skill 不是抄模板:真正管用的 Skill,都是从实战里提炼出来的
前端·后端·ai编程
xiaotao13117 分钟前
JS new 操作符完整执行过程
开发语言·前端·javascript·原型模式
robch24 分钟前
python3 -m http.server 8001直接启动web服务类似 nginx
前端·nginx·http
吴声子夜歌30 分钟前
ES6——数组的扩展详解
前端·javascript·es6
guhy fighting39 分钟前
new Map,Array.from,Object.entries的作用以及使用方法
开发语言·前端·javascript
大漠_w3cpluscom39 分钟前
CSS 技巧:CSS 单位使用指南
前端