Appearance
图片
版本说明
| 时间 | 修改人 | 备注 |
|---|---|---|
| 2025-04-24 | YG | 补充文档 |
| 2025-10-20 | YG | 添加图片资源管理方案getAssetUrl |
一、基本展示规范
- 图片展示时,尺寸不能压缩变形
- 当图片资源不存在,界面不能展示裂开的图或者白屏,默认展示一张报错的图片
- 当禁止图片被选中时,需要给图片加一个css属性
pointer-events: none,防止部分安卓机点击图片时会覆盖在页面上 - 根据实际情况选择使用vant里Image的
fit属性:contain、cover; (vant文档) - 在小程序环境下可以使用
<image>的mode属性:aspectFit、aspectFill、widthFix、heightFix;(微信小程序文档) - 移动端展示类图片一般都要加图片预览功能,除了一些特殊情况,如:banner图、头像等。
- 图片预览使用vant的
ImagePreview实现。 - 在UniApp中也可以使用
uni.previewImage()API实现跨平台的图片预览功能 - 图片懒加载:使用vant图片组件
vant-image的lazy-load属性。 - 在UniApp中使用
<image>组件的lazy-load属性实现懒加载
二、图片格式选择
PNG格式:适用于需要透明度的图像、图标、插图等
- 优点:支持透明度,无损压缩
- 缺点:文件较大
SVG格式:适用于图标、简单图形
- 优点:矢量图形,缩放不失真,文件小
- 缺点:不适合复杂图像,渲染复杂图形时性能较差
三、图片尺寸与优化
图片资源应部署在CDN上,提高加载速度
尺寸控制
- 图片实际尺寸应与展示尺寸相匹配,避免过大造成资源浪费
- 建议图片宽度不超过750px(满足2倍屏需求)
- 图标类图片建议使用icon-font或SVG代替
图片压缩
- 上传前应对图片进行适当压缩(不能有模糊感)
- 可使用TinyPNG等工具进行无损压缩
四、应用方案:cdn图片资源管理方案
为了更好地管理项目中的图片资源,推荐使用 getAssetUrl 工具函数来统一处理不同环境下的图片路径。
4.1 getAssetUrl 工具函数介绍
getAssetUrl 是一个用于处理资源路径的工具函数,可以根据不同环境自动适配资源路径的加载方式,主要解决以下问题:
- 在不同环境(CDN、本地、小程序)下统一资源访问方式
- 支持构建时的资源预加载和处理
- 确保路径格式一致性
- 支持CDN资源加密
4.2 使用方法
无需引入,直接在代码中使用 getAssetUrl 或 uni.getAssetUrl 函数即可。
在template模版中使用
js
// 在组件中使用
<image :src="getAssetUrl('assets/images/home/banner1.png')"></image>
// 或者使用全局方法
<image :src="uni.getAssetUrl('assets/images/home/banner1.png')"></image>在script中使用
js
const bannerItems = ref([
{ img: uni.getAssetUrl('assets/images/home/banner1.png')},
{ img: uni.getAssetUrl('assets/images/home/banner2.png')},
{ img: uni.getAssetUrl('assets/images/home/banner1.png')},
])在style标签中使用
vue
<script setup>
const iconRight = `url(${uni.getAssetUrl('assets/images/shop/icon-right.png')})`;
</script>
<style lang="scss" scoped>
.icon-score {
background: v-bind(iconRight) no-repeat top/20rpx 20rpx;
}
</style>4.3 实现原理
getAssetUrl 函数根据不同环境提供不同的资源路径处理策略:
- CDN 环境:当环境变量
VITE_CDN_RESOURCE_URL以http开头时,直接返回 CDN 路径 - 本地:使用
/assets/开头的绝对路径
4.4 在项目中配置使用
1. 创建资源路径工具函数
在 src/utils 目录下导出 getAssetUrl 方法:
js
/**
* 获取资源URL的工具函数
* 支持不同环境下的资源路径处理
*/
// 预加载资源,使用构建工具的资源预加载功能
const imageModules = import.meta.glob('/src/assets/**/*.{png,jpg,jpeg,gif,svg,webp,js,html,ttf,woff,woff2,eot,otf}', { eager: true });
const cdnResourceUrl = import.meta.env.VITE_APP_CDN_RESOURCE_URL;
const cdnAuthKey = import.meta.env.VITE_APP_CDN_AUTH_KEY;
const cdnAuthOpen = import.meta.env.VITE_APP_CDN_AUTH_OPEN;
const cdnAuthTime = import.meta.env.VITE_APP_CDN_AUTH_TIME;
export const getAssetUrl = (relativePath) => {
// console.warn('getAssetUrl', relativePath);
// 如果cdnResourceUrl以http开头,则直接返回cdn资源,否则访问本地路径
if (cdnResourceUrl && cdnResourceUrl.startsWith('http')) {
const result = generateAuthUrl(cdnResourceUrl + relativePath, {});
return result;
}
// 确保路径格式一致
const normalizedPath = relativePath.startsWith('/')
? relativePath
: `/${relativePath}`;
// 小程序环境使用绝对路径
// #ifdef MP-WEIXIN
return `/${relativePath}`;
// #endif
// 非小程序环境尝试使用Vite的资源处理
// #ifndef MP-WEIXIN
try {
// 构建完整路径
const fullPath = `/src${normalizedPath}`;
// 检查资源是否存在于预加载的模块中
if (imageModules[fullPath]) {
return imageModules[fullPath].default;
}
// 资源不存在时回退到静态路径
console.warn(`[getAssetUrl] 资源未找到: ${fullPath},使用回退路径`);
return `${import.meta.env.VITE_APP_CDN_RESOURCE_URL || './static/'}${relativePath}`;
} catch (error) {
console.error('[getAssetUrl] 加载资源出错:', error);
return `${import.meta.env.VITE_APP_CDN_RESOURCE_URL || './static/'}${relativePath}`;
}
// #endif
}2. 在 main.js 中全局挂载
js
import { createSSRApp } from "vue";
import App from "./App.vue";
// 导入资源路径工具函数
import { getAssetUrl } from '@/utils/assetUtils';
export function createApp() {
const app = createSSRApp(App);
// 将getAssetUrl挂载为全局属性
app.config.globalProperties.getAssetUrl = getAssetUrl;
// 挂载为全局方法,方便在组件外部使用
uni.getAssetUrl = getAssetUrl;
// 将 CDN 地址挂载到全局
uni.cdnEnvUrl = import.meta.env.VITE_CDN_RESOURCE_URL;
return {
app,
};
}3. 配置环境变量
在项目根目录创建 .env 或 .env.production 文件:
env
# 资源 CDN 地址,生产环境使用 CDN,开发环境留空使用本地资源
VITE_CDN_RESOURCE_URL=https://your-cdn-domain.com/4.5 资源目录建议结构
src/
├── assets/
│ ├── images/
│ │ ├── home/
│ │ │ ├── banner1.png
│ │ │ └── banner2.png
│ │ ├── icons/
│ │ │ ├── icon1.png
│ │ │ └── icon2.png
│ │ └── common/
│ │ ├── logo.png
│ │ └── background.jpg
│ ├── fonts/
│ └── js/4.6 注意事项
- 资源路径始终相对于
src目录,如assets/images/home/banner1.png - 环境变量
VITE_CDN_RESOURCE_URL在生产环境下应指向有效的 CDN 地址
