/** * 字体加载工具(core 层,不依赖任何 feature 模块)。 * * 使用 wx.loadFontFace 将字体注册到 Canvas native 渲染管线, * 按 URL 去重,同一字体只加载一次。 * 仅使用已配置的 HTTPS 字体地址。 */ /** 字体加载所需的最小描述 */ export interface FontFace { /** wx.loadFontFace 的 family 参数 */ name: string; /** 字体文件 HTTPS URL */ url: string; } const _loadedIds = new Set(); /** 加载字体,同一 url 只加载一次 */ export async function loadFontFace(font: FontFace): Promise { if (_loadedIds.has(font.url)) return; if (!font.url.startsWith('https://') || /["\r\n]/.test(font.url)) throw new Error('字体地址须为 HTTPS'); const resolved = font.url; return new Promise((resolve, reject) => { wx.loadFontFace({ family: font.name, source: `url("${resolved}")`, scopes: ['native'], success: () => { _loadedIds.add(font.url); resolve(); }, fail: (err) => { console.error(`loadFontFace [${font.name}] failed`, err); reject(err); }, }); }); }