staticAsset.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import {
  2. STATIC_ASSETS_BASE_URL_DEFAULT,
  3. STATIC_ASSETS_BASE_URL_PRODUCTION,
  4. STATIC_ASSETS_BASE_URL_TEST
  5. } from '@/config/static-assets-defaults'
  6. import { getStaticAssetsVersion, withOssVersion } from '@/utils/ossCache'
  7. function normalizeBase(u) {
  8. const s = (u || '').trim() || STATIC_ASSETS_BASE_URL_DEFAULT
  9. return s.endsWith('/') ? s : `${s}/`
  10. }
  11. function envBaseExplicit() {
  12. try {
  13. if (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_STATIC_ASSETS_BASE_URL) {
  14. return String(import.meta.env.VITE_STATIC_ASSETS_BASE_URL).trim()
  15. }
  16. } catch {
  17. // ignore
  18. }
  19. // 兼容 uni-app webpack/HBuilderX:使用 process.env(通常要求 VUE_APP_ 前缀)
  20. try {
  21. if (typeof process !== 'undefined' && process.env) {
  22. const v =
  23. process.env.VITE_STATIC_ASSETS_BASE_URL ||
  24. process.env.VUE_APP_STATIC_ASSETS_BASE_URL ||
  25. process.env.UNI_APP_STATIC_ASSETS_BASE_URL
  26. if (v) return String(v).trim()
  27. }
  28. } catch {
  29. // ignore
  30. }
  31. return ''
  32. }
  33. function resolveBase() {
  34. const explicit = envBaseExplicit()
  35. if (explicit) return normalizeBase(explicit)
  36. try {
  37. if (import.meta.env && import.meta.env.MODE === 'production') {
  38. return normalizeBase(STATIC_ASSETS_BASE_URL_PRODUCTION)
  39. }
  40. } catch {
  41. // ignore
  42. }
  43. return normalizeBase(STATIC_ASSETS_BASE_URL_TEST)
  44. }
  45. export function getStaticAssetsBaseUrl() {
  46. return resolveBase()
  47. }
  48. /**
  49. * 拼接远程静态资源完整 URL(相对路径不要前导 /,如 icons/1.png)。
  50. */
  51. export function staticAssetUrl(relativePath) {
  52. const p = String(relativePath || '').replace(/^\/+/, '')
  53. const seg = p.split('/').filter(Boolean).map((s) => encodeURIComponent(s)).join('/')
  54. const url = `${getStaticAssetsBaseUrl()}${seg}`
  55. // sqxp-static 默认在 nginx 侧设置了长缓存;这里统一追加 v=版本号,避免同名覆盖后不生效
  56. return withOssVersion(url, getStaticAssetsVersion())
  57. }
  58. export const DEFAULT_PLACEHOLDER_IMAGE_URL = staticAssetUrl('images/logo.png')
  59. export const IMG_DEFAULT_PRODUCT = staticAssetUrl('images/default-product.png')
  60. /** 全端统一:空列表 / 暂无 等占位图(与 miniprogram `nothing.svg` 一致) */
  61. export const IMG_NOTHING = staticAssetUrl('nothing.svg')
  62. export const IMG_EMPTY = IMG_NOTHING
  63. export const IMG_LOGO_WATERMARK = staticAssetUrl('images/logo11.png')
  64. export const IMG_CLIPBOARD = staticAssetUrl('logo-img/clipboard.svg')
  65. export const IMG_PASSWORD_CARD = staticAssetUrl('logo-img/password.png')
  66. export const IMG_LINK = staticAssetUrl('logo-img/link.png')
  67. export const IMG_SETTINGS_AVATAR = staticAssetUrl('images/设置头像.svg')
  68. export const IMG_SETTINGS_PASSWORD = staticAssetUrl('images/修改密码.svg')
  69. export const IMG_CUSTOMER_SERVICE = staticAssetUrl('images/客服.svg')
  70. /** 登录页输入框前图标(与静态资源目录 `images/用户名.svg`、`images/密码.svg` 对应) */
  71. export const IMG_LOGIN_USERNAME = staticAssetUrl('images/用户名.svg')
  72. export const IMG_LOGIN_PASSWORD = staticAssetUrl('images/密码.svg')
  73. export const ICON_ARROW_BOTTOM = staticAssetUrl('arrow-bottom.svg')