43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
/**
|
|
* 字体加载工具(core 层,不依赖任何 feature 模块)。
|
|
*
|
|
* 使用 wx.loadFontFace 将字体注册到 Canvas native 渲染管线,
|
|
* 按 URL 去重,同一字体只加载一次。
|
|
* 仅使用已配置的 HTTPS 字体地址。
|
|
*/
|
|
|
|
/** 字体加载所需的最小描述 */
|
|
export interface FontFace {
|
|
/** wx.loadFontFace 的 family 参数 */
|
|
name: string;
|
|
/** 字体文件 HTTPS URL */
|
|
url: string;
|
|
}
|
|
|
|
const _loadedIds = new Set<string>();
|
|
|
|
/** 加载字体,同一 url 只加载一次 */
|
|
export async function loadFontFace(font: FontFace): Promise<void> {
|
|
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);
|
|
},
|
|
});
|
|
});
|
|
}
|