Files
shanxia2.0/miniprogram/utils/ossCache.js
2026-07-11 17:15:17 +08:00

82 lines
2.7 KiB
JavaScript

// 统一给 OSS/MinIO/静态域资源追加版本参数(用于绕过长缓存)。
// 约束:不要用 Date.now() 常态化破缓存;默认用“可控版本号”,需要强刷时只改版本号即可。
let _cachedVersion = null
// TODO(config-hardcoded): 资源版本号当前写死,后续改为构建产物自动注入(如 commit hash / CI build number)。
const STATIC_ASSETS_VERSION = '20260423'
// 作为兜底版本号来源(构建期静态注入)
// eslint-disable-next-line import/no-unresolved
import manifest from '@/manifest.json'
function fallbackVersionFromManifest() {
try {
const vn = String(manifest?.versionName || '').trim()
const vc = String(manifest?.versionCode || '').trim()
return [vn, vc].filter(Boolean).join('.')
} catch {
// ignore
}
return ''
}
/**
* 统一版本号:
* - 写死常量:`STATIC_ASSETS_VERSION`
* - 兜底:manifest.versionName/versionCode
* - 最终兜底:固定日期
*/
export function getStaticAssetsVersion() {
if (_cachedVersion != null) return _cachedVersion
const v =
STATIC_ASSETS_VERSION ||
fallbackVersionFromManifest() ||
'20260423'
_cachedVersion = String(v || '').trim()
return _cachedVersion
}
function hasSignedQuery(u) {
// 预签名/鉴权 URL:追加参数可能导致签名失效,必须跳过
return /(?:[?&](?:X-Amz-|x-amz-|OSSAccessKeyId|Signature|x-oss-|Expires)=)/.test(u)
}
function hasVersionParam(u) {
return /(?:[?&]v=)/i.test(u)
}
function looksLikeOurObjectStorage(u) {
// 只对我们自己的 OSS/MinIO/静态域处理,避免误伤第三方资源
return (
u.includes('/sqxp-static/') ||
u.includes('/sanqiang/') ||
u.includes('/minio/') ||
/:\/\/(?:www\.)?chengyantek\.cn\//i.test(u) ||
/:\/\/\d{1,3}(?:\.\d{1,3}){3}:20004\//.test(u)
)
}
function appendQueryParam(url, key, value) {
const sep = url.includes('?') ? '&' : '?'
return `${url}${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`
}
/**
* 给 OSS/MinIO/静态域 URL 追加 `v=<version>`,用于“内容更新但 URL 不变”时强制刷新。
*
* - 已带 `v=`:不重复追加
* - 预签名 URL:不追加(避免签名失效)
* - 非 http(s) / // / 非本站存储域:不处理
*/
export function withOssVersion(rawUrl, version = getStaticAssetsVersion()) {
const u = String(rawUrl || '').trim()
if (!u) return ''
if (!(u.startsWith('http://') || u.startsWith('https://') || u.startsWith('//'))) return u
if (!version) return u
if (!looksLikeOurObjectStorage(u)) return u
if (hasVersionParam(u)) return u
if (hasSignedQuery(u)) return u
return appendQueryParam(u, 'v', version)
}