ossCache.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // 统一给 OSS/MinIO/静态域资源追加版本参数(用于绕过长缓存)。
  2. // 约束:不要用 Date.now() 常态化破缓存;默认用“可控版本号”,需要强刷时只改版本号即可。
  3. let _cachedVersion = null
  4. // 作为兜底版本号来源(构建期静态注入)
  5. // eslint-disable-next-line import/no-unresolved
  6. import manifest from '@/manifest.json'
  7. function pickEnv(name) {
  8. try {
  9. if (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env[name]) {
  10. return String(import.meta.env[name]).trim()
  11. }
  12. } catch {
  13. // ignore
  14. }
  15. try {
  16. if (typeof process !== 'undefined' && process.env && process.env[name]) {
  17. return String(process.env[name]).trim()
  18. }
  19. } catch {
  20. // ignore
  21. }
  22. return ''
  23. }
  24. function fallbackVersionFromManifest() {
  25. try {
  26. const vn = String(manifest?.versionName || '').trim()
  27. const vc = String(manifest?.versionCode || '').trim()
  28. return [vn, vc].filter(Boolean).join('.')
  29. } catch {
  30. // ignore
  31. }
  32. return ''
  33. }
  34. /**
  35. * 统一版本号:
  36. * - 优先:`VITE_STATIC_ASSETS_VERSION` / `VUE_APP_STATIC_ASSETS_VERSION` / `UNI_APP_STATIC_ASSETS_VERSION`
  37. * - 兜底:manifest.versionName/versionCode
  38. * - 最终兜底:固定日期(需要强刷时可直接改这个值或用环境变量覆盖)
  39. */
  40. export function getStaticAssetsVersion() {
  41. if (_cachedVersion != null) return _cachedVersion
  42. const v =
  43. pickEnv('VITE_STATIC_ASSETS_VERSION') ||
  44. pickEnv('VUE_APP_STATIC_ASSETS_VERSION') ||
  45. pickEnv('UNI_APP_STATIC_ASSETS_VERSION') ||
  46. fallbackVersionFromManifest() ||
  47. '20260423'
  48. _cachedVersion = String(v || '').trim()
  49. return _cachedVersion
  50. }
  51. function hasSignedQuery(u) {
  52. // 预签名/鉴权 URL:追加参数可能导致签名失效,必须跳过
  53. return /(?:[?&](?:X-Amz-|x-amz-|OSSAccessKeyId|Signature|x-oss-|Expires)=)/.test(u)
  54. }
  55. function hasVersionParam(u) {
  56. return /(?:[?&]v=)/i.test(u)
  57. }
  58. function looksLikeOurObjectStorage(u) {
  59. // 只对我们自己的 OSS/MinIO/静态域处理,避免误伤第三方资源
  60. return (
  61. u.includes('/sqxp-static/') ||
  62. u.includes('/sanqiang/') ||
  63. u.includes('/minio/') ||
  64. /:\/\/(?:www\.)?chengyantek\.cn\//i.test(u) ||
  65. /:\/\/\d{1,3}(?:\.\d{1,3}){3}:20004\//.test(u)
  66. )
  67. }
  68. function appendQueryParam(url, key, value) {
  69. const sep = url.includes('?') ? '&' : '?'
  70. return `${url}${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`
  71. }
  72. /**
  73. * 给 OSS/MinIO/静态域 URL 追加 `v=<version>`,用于“内容更新但 URL 不变”时强制刷新。
  74. *
  75. * - 已带 `v=`:不重复追加
  76. * - 预签名 URL:不追加(避免签名失效)
  77. * - 非 http(s) / // / 非本站存储域:不处理
  78. */
  79. export function withOssVersion(rawUrl, version = getStaticAssetsVersion()) {
  80. const u = String(rawUrl || '').trim()
  81. if (!u) return ''
  82. if (!(u.startsWith('http://') || u.startsWith('https://') || u.startsWith('//'))) return u
  83. if (!version) return u
  84. if (!looksLikeOurObjectStorage(u)) return u
  85. if (hasVersionParam(u)) return u
  86. if (hasSignedQuery(u)) return u
  87. return appendQueryParam(u, 'v', version)
  88. }