Skip to content

21-图片管理篇

背景

我们通常开发的时候,都会先使用本地路径进行开发,然后开发完成后,再把图片放到服务器上

最终再把图片本地路径改为图片远程地址

但是,这样就有个问题,就是我们每次更新页面啥的,都需要更改图片都需要替换一次图片路径,比较麻烦

能不能想个办法,可以根据不同环境动态切换图片路径地址?

答案是有的,先看下基本思路~

实现思路

考虑一个实现方式就是,采用动态 src,使用全局函数返回一个拼接路径

typescript
<img class="w-160rpx h-160rpx" :src="$assets('@/static/local/logo.png')" />

dev 环境就不拼接网络路径,build 生产环境就加入 imgBaseUrl

封装

首先,我们的图片路径是根据当前环境决定的

所以,得先对不同环境增加一个配置图片的路径变量

我们简单点,只配置开发环境和生产环境变量

typescript
// .env.development
VITE_SERVER_BASEURL = 'http://localhost:3000'
VITE_IMG_BASEURL = ''
typescript
// .env.production
VITE_SERVER_BASEURL = 'http://localhost:3000'
VITE_IMG_BASEURL = 'https://raw.githubusercontent.com/DaMaiCoding/uni-plus/refs/heads/master/'
typescript
// src/utils/assets.ts
const imgBaseUrl = (import.meta as any).env.VITE_IMG_BASEURL // 图片请求路径

function useImgAssets(filePath: string, { noCache = false } = {}) {
  // 去掉 filePath 前面的 @ 符号
  if (filePath.startsWith('@')) {
    filePath = 'src' + filePath.slice(1)
  }

  const fileUrl = `${imgBaseUrl}${filePath}`

  if (noCache) {
    return fileUrl + '?t=' + Date.now()
  } else {
    return fileUrl
  }
}

export const useAssets = useImgAssets

export default useImgAssets
typescript
// src/utils/index.ts

// 模块统一导出
export * from './assets'
typescript
// src/main.ts
import { createSSRApp } from 'vue'
import { useAssets } from './utils'
import App from './App.vue'

export function createApp() {
  const app = createSSRApp(App)
  app.config.globalProperties.$assets = useAssets
  return {
    app
  }
}

使用起来也简单,不同环境下会生成不同路径,如果你需要改成你自己公司的服务器图片地址

就换一下 .env.development、.env.productionVITE_IMG_BASEURL

typescript
<img class="w-160rpx h-160rpx" :src="$assets('@/static/local/logo.png')" />

pnpm dev:mp-weixin

typescript
<img class="w-160rpx h-160rpx" src="src/static/local/logo.png" />

pnpm build:mp-weixin

typescript
<img class="w-160rpx h-160rpx" src="https://raw.githubusercontent.com/DaMaiCoding/uni-plus/refs/heads/master/src/static/local/logo.png" />

扩展

还有一个小问题,那就是这本地图片要怎么办?

是放到云端后删除呢?还是放在本地保留?

通常是本地保留一份,与代码同步到 git 上,然后云端再有一份,这样即使云端出现问题

也能及时使用本地的进行恢复

但是又会引出另一个问题,包体积太大微信小程序无法上传,怎么办?

这一部分可以看 "优化篇" 的上传优化进行解决

Released under the MIT License.