uniapp h5 字体缓存问题如何解决
在uniapp开发的H5页面中,字体文件被浏览器缓存后无法自动更新,即使服务器上的字体文件已经更换,客户端仍然加载旧版本。尝试过修改字体文件URL添加版本号或时间戳,但效果不稳定。请问有什么可靠的解决方案能强制浏览器获取最新的字体文件?
2 回复
在uniapp H5中,可通过以下方式解决字体缓存问题:
- 给字体文件URL添加版本号或时间戳参数
- 使用CSS的
font-display: swap属性 - 配置webpack的file-loader处理字体文件
- 在manifest.json中配置缓存策略
在UniApp H5中,字体缓存问题通常表现为字体加载缓慢、重复请求或样式闪烁。以下是几种常见解决方案:
1. 使用CSS font-display属性
在字体声明中添加font-display: swap,确保文本始终可见,字体加载完成后再替换:
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
font-display: swap;
}
2. 预加载字体资源
在HTML的<head>中添加预加载链接,加速字体加载:
<link rel="preload" href="/fonts/custom.woff2" as="font" type="font/woff2" crossorigin>
3. 利用本地存储缓存字体
通过JavaScript将字体文件存储到LocalStorage,减少重复请求:
// 检查缓存并加载字体
async function loadFont() {
const fontUrl = '/fonts/custom.woff2';
const cachedFont = localStorage.getItem('cachedFont');
if (cachedFont) {
// 直接使用缓存的字体
const fontFace = new FontFace('CustomFont', `url(${fontUrl})`);
document.fonts.add(fontFace);
} else {
// 下载并缓存字体
const response = await fetch(fontUrl);
const fontBlob = await response.blob();
localStorage.setItem('cachedFont', URL.createObjectURL(fontBlob));
}
}
loadFont();
4. 服务端配置缓存头
确保服务器返回正确的缓存控制头,例如:
Cache-Control: public, max-age=31536000
5. 使用Base64内联字体
将字体转换为Base64嵌入CSS,避免额外请求(适用于小字体文件):
@font-face {
font-family: 'CustomFont';
src: url('data:font/woff2;base64,...') format('woff2');
}
注意事项:
- 优先使用WOFF2格式,压缩率更高
- 大字体文件慎用Base64,可能影响CSS加载性能
- 预加载仅适用于关键字体,避免过度使用
选择适合方案组合使用,通常能显著改善H5字体加载体验。

