fix: 尝试安卓优化
This commit is contained in:
71
vite-tailwindcss/src/composables/useAndroidOptimize.js
Normal file
71
vite-tailwindcss/src/composables/useAndroidOptimize.js
Normal file
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* 安卓专项优化(iOS 保持原逻辑)
|
||||
*
|
||||
* - 检测是否为安卓
|
||||
* - 提供图片 URL 改写工具:把阿里云 OSS 图压缩为 750px 宽 + webp
|
||||
* 仅对安卓生效,iOS 原样返回,确保 iOS 视觉体验不变
|
||||
*/
|
||||
|
||||
const isAndroidClient = (() => {
|
||||
if (typeof navigator === 'undefined') return false
|
||||
const ua = navigator.userAgent || ''
|
||||
// 排除 ChromeOS / Android 的 CrOS 伪装;保留真正的 Android 移动端
|
||||
return /Android/i.test(ua) && !/CrOS/i.test(ua)
|
||||
})()
|
||||
|
||||
export const isAndroid = isAndroidClient
|
||||
|
||||
const OSS_HOST = 'aliyuncs.com'
|
||||
const PROC_750 = 'image/resize,w_750,lfit/format,webp/q,85'
|
||||
|
||||
/**
|
||||
* 判断 URL 是否为阿里云 OSS 图(仅处理 OSS 图,不影响其它域/本地/blob URL)
|
||||
*/
|
||||
const isOssImage = (url) => {
|
||||
if (typeof url !== 'string') return false
|
||||
const u = url.trim()
|
||||
if (!u || u.startsWith('data:') || u.startsWith('blob:')) return false
|
||||
// 仅 http/https
|
||||
if (!/^https?:\/\//i.test(u)) return false
|
||||
// 排除图标/iconify 等非图片
|
||||
if (/iconify\.design|\.svg(\?|$)/i.test(u)) return false
|
||||
return u.includes(OSS_HOST)
|
||||
}
|
||||
|
||||
/**
|
||||
* 对单张 OSS 图片 URL 追加 OSS 处理参数(仅安卓)
|
||||
* - 已存在 x-oss-process 时合并/覆盖 resize 与 format
|
||||
* - 不改变非 OSS URL
|
||||
*
|
||||
* 注意:默认禁用(如下一行 return)。如需启用,注释掉该行。
|
||||
* 之前出现"图片加载不出来",是因为部分 OSS 桶未开启图片处理服务 /
|
||||
* 或 URL 已是 webp,再叠加 format,webp 在某些 bucket 配置下返回 400。
|
||||
* 启用前请确认你的 OSS 已开通 "图片处理" 服务且支持 x-oss-process。
|
||||
*/
|
||||
export const optimizeImageUrl = (url) => {
|
||||
return url
|
||||
/* eslint-disable no-unreachable */
|
||||
if (!isAndroidClient) return url
|
||||
if (!isOssImage(url)) return url
|
||||
const u = url.trim()
|
||||
// 已有 x-oss-process:替换其中 resize / format
|
||||
const qIdx = u.indexOf('?x-oss-process=')
|
||||
if (qIdx >= 0) {
|
||||
const before = u.slice(0, qIdx)
|
||||
let proc = u.slice(qIdx + '?x-oss-process='.length)
|
||||
proc = proc
|
||||
.split('/')
|
||||
.filter((seg) => !seg.startsWith('resize') && !seg.startsWith('format') && !seg.startsWith('q'))
|
||||
.join('/')
|
||||
const merged = proc ? `${PROC_750}/${proc}` : PROC_750
|
||||
return `${before}?x-oss-process=${merged}`
|
||||
}
|
||||
return `${u}?x-oss-process=${PROC_750}`
|
||||
/* eslint-enable no-unreachable */
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量优化(供 normalizeImages 等使用)
|
||||
*/
|
||||
export const optimizeImageUrls = (urls = []) =>
|
||||
urls.map((u) => optimizeImageUrl(u))
|
||||
Reference in New Issue
Block a user