/**
|
* 通用预加载素材描述。
|
*
|
* 仅支持 `image` 与 `font`——微信 `wx.preloadAssets` 目前只支持这两类,
|
* **不支持视频**(视频无法通过该 API 预热,转场视频仅能预热其封面图)。
|
*/
|
export type PreloadAsset = { type: 'image' | 'font'; src: string };
|
|
/** 判断当前是否为微信小程序环境。 */
|
const isWeapp = (): boolean => process.env.TARO_ENV === 'weapp';
|
|
/**
|
* 通用预加载方法:图片、字体统一走 `wx.preloadAssets` 为视图层预热媒体资源。
|
*
|
* ## 特性
|
* - 仅在微信小程序环境执行;非 weapp / 低版本(无 `wx.preloadAssets`)静默跳过。
|
* - image / font 合批调用一次 `wx.preloadAssets`,组件仍用同一 CDN URL,命中缓存即秒开。
|
* - **预加载失败不报错**:整体 try/catch + `fail` 空回调兜底。
|
*
|
* 参考:https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.preloadAssets.html
|
* (基础库 2.22.1+ 支持,功能描述:为视图层预加载媒体资源文件,目前支持 font、image)
|
*
|
* @param assets 待预加载素材列表
|
*/
|
export const preloadAssets = (assets: PreloadAsset[]): void => {
|
try {
|
if (!isWeapp() || !Array.isArray(assets) || assets.length === 0) {
|
return;
|
}
|
// @ts-ignore 微信基础库 2.22.1+ 能力,低版本走 typeof 兜底跳过
|
if (typeof wx === 'undefined' || typeof wx.preloadAssets !== 'function') {
|
return;
|
}
|
|
const data = assets
|
.filter((asset) => asset && asset.src && (asset.type === 'image' || asset.type === 'font'))
|
.map((asset) => ({ type: asset.type, src: asset.src }));
|
|
if (data.length === 0) {
|
return;
|
}
|
|
// @ts-ignore
|
wx.preloadAssets({
|
data,
|
fail: () => { /* 预加载失败不报错,静默忽略 */ },
|
});
|
} catch (e) {
|
console.error('[preloadAssets] 预加载素材异常:', e);
|
// 兜底:绝不抛出
|
}
|
};
|
|
export default preloadAssets;
|