uni-app 图片优化
核心知识点
1. 图片格式选择
- JPEG/JPG:适合照片等色彩丰富的图片,支持有损压缩
- PNG:支持透明背景,适合图标、logo 等
- WebP:现代图片格式,压缩率更高,质量更好
- SVG:矢量图格式,适合图标、插图等需要缩放的场景
2. 图片压缩策略
- 在线压缩工具:TinyPNG、Compressor.io 等
- 批量压缩:使用脚本或工具批量处理图片
- 压缩参数设置:根据图片用途设置合适的压缩质量
- 响应式图片:为不同设备提供不同分辨率的图片
3. 图片懒加载
- uni-app 内置懒加载:使用
lazy-load属性 - 自定义懒加载:基于 Intersection Observer API 实现
- 预加载策略:提前加载即将显示的图片
- 加载占位符:使用占位图提升用户体验
4. CDN 加速
- CDN 服务选择:阿里云 CDN、腾讯云 CDN 等
- 图片存储与分发:将图片存储在 CDN 上
- 缓存策略:设置合理的缓存头
- 图片处理:使用 CDN 提供的图片处理服务
5. 图片加载优化
- 图片尺寸优化:使用合适尺寸的图片
- 图片请求优化:减少图片请求次数
- 精灵图:将多个小图标合并为一张图片
- Base64 编码:适合小图标,减少 HTTP 请求
6. 跨平台图片处理
- 平台差异:不同平台对图片格式和处理方式的支持
- 条件编译:为不同平台提供不同的图片处理方案
- 原生能力:使用平台原生的图片处理 API
实用案例
案例 1:电商应用商品图片优化
需求分析
- 商品列表页需要展示大量商品图片
- 商品详情页需要展示高清图片
- 首页需要快速加载图片,提升用户体验
实现方案
图片格式选择
- 商品列表页:使用 WebP 格式,压缩率高
- 商品详情页:使用 JPEG 格式,保证清晰度
- 图标:使用 SVG 格式,支持缩放
图片压缩
# 使用 tinyjpg-cli 批量压缩图片 npm install -g tinyjpg-cli tinyjpg --api-key=YOUR_API_KEY ./static/images/懒加载实现
<!-- 商品列表页 --> <template> <view class="goods-list"> <view v-for="item in goodsList" :key="item.id" class="goods-item"> <image :src="item.imageUrl" mode="aspectFill" lazy-load class="goods-image" /> <text class="goods-name">{{ item.name }}</text> <text class="goods-price">{{ item.price }}</text> </view> </view> </template> <script> export default { data() { return { goodsList: [] } }, onLoad() { this.loadGoodsList() }, methods: { loadGoodsList() { // 模拟加载商品列表 this.goodsList = Array.from({length: 20}, (_, index) => ({ id: index, name: `商品${index + 1}`, price: `¥${(Math.random() * 1000).toFixed(2)}`, imageUrl: `https://example.com/goods/${index + 1}.webp` })) } } } </script> <style scoped> .goods-list { display: flex; flex-wrap: wrap; padding: 10rpx; } .goods-item { width: 48%; margin: 1%; background-color: #fff; border-radius: 8rpx; overflow: hidden; box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1); } .goods-image { width: 100%; height: 300rpx; } .goods-name { padding: 10rpx; font-size: 28rpx; line-height: 1.4; } .goods-price { padding: 0 10rpx 10rpx; font-size: 32rpx; color: #ff4d4f; font-weight: bold; } </style>CDN 配置
- 将图片存储在阿里云 OSS 上
- 配置 CDN 加速
- 使用图片处理服务生成不同尺寸的图片
// 生成不同尺寸的图片 URL function getImageUrl(url, width, height) { return `${url}?x-oss-process=image/resize,m_lfit,w_${width},h_${height}` }响应式图片
<template> <view class="product-detail"> <image :src="getResponsiveImage(product.imageUrl)" mode="aspectFit" class="product-image" /> </view> </template> <script> export default { data() { return { product: { imageUrl: 'https://example.com/product/1.jpg' } } }, methods: { getResponsiveImage(url) { const { windowWidth } = uni.getSystemInfoSync() const width = windowWidth > 750 ? 750 : windowWidth return `${url}?x-oss-process=image/resize,m_lfit,w_${width}` } } } </script>
案例 2:社交媒体应用图片处理
需求分析
- 用户上传头像和图片
- 需要支持图片裁剪和编辑
- 图片需要快速加载和展示
实现方案
图片上传优化
<template> <view class="upload-section"> <button @click="chooseImage" type="primary">选择图片</button> <view class="image-list"> <image v-for="(image, index) in images" :key="index" :src="image" mode="aspectFill" class="uploaded-image" /> </view> </view> </template> <script> export default { data() { return { images: [] } }, methods: { chooseImage() { uni.chooseImage({ count: 9, sizeType: ['compressed'], // 选择压缩后的图片 sourceType: ['album', 'camera'], success: (res) => { this.images = res.tempFilePaths this.uploadImages(res.tempFilePaths) } }) }, uploadImages(imagePaths) { // 上传图片到服务器 imagePaths.forEach((path, index) => { uni.uploadFile({ url: 'https://example.com/upload', filePath: path, name: 'file', formData: { 'user': 'test' }, success: (uploadFileRes) => { console.log('上传成功', uploadFileRes.data) } }) }) } } } </script>图片裁剪
<template> <view class="crop-section"> <button @click="chooseAndCropImage" type="primary">裁剪头像</button> <image :src="avatar" mode="aspectFill" class="avatar" v-if="avatar" /> </view> </template> <script> export default { data() { return { avatar: '' } }, methods: { chooseAndCropImage() { uni.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['album', 'camera'], success: (res) => { // 使用 uni-app 内置的图片裁剪功能 uni.getImageInfo({ src: res.tempFilePaths[0], success: (info) => { // 这里可以使用第三方裁剪插件或自定义裁剪组件 this.avatar = res.tempFilePaths[0] } }) } }) } } </script>图片加载优化
- 使用渐进式加载:先加载低质量占位图,再加载高质量图片
- 实现图片加载失败处理
- 使用骨架屏提升用户体验
学习目标
- 掌握 uni-app 中图片优化的各种技术和方法
- 学会根据不同场景选择合适的图片格式
- 掌握图片压缩和懒加载的实现方法
- 了解 CDN 加速和图片处理服务的使用
- 能够处理跨平台图片加载的差异
- 提升应用性能和用户体验
总结
图片优化是 uni-app 应用性能优化的重要组成部分,通过合理选择图片格式、压缩图片大小、实现懒加载、使用 CDN 加速等方法,可以显著提升应用的加载速度和用户体验。在实际开发中,开发者应该根据具体场景选择合适的优化策略,平衡图片质量和加载速度,为用户提供最佳的视觉体验。
同时,开发者还需要注意跨平台图片处理的差异,使用条件编译或平台特定的 API 来处理不同平台的图片加载问题,确保应用在所有平台上都能正常运行和展示图片。