前端性能优化:400ms超时控制解决字体加载阻塞

在网页开发中使用第三方字体时,经常会遇到CDN响应缓慢的问题。传统的字体加载方式可能导致页面阻塞数十秒,严重影响用户体验。我曾经遇到一个案例:字体CSS加载耗时超过30秒,导致页面长时间白屏。

解决方案

经多次尝试,最终找到了一个简单有效的解决方案——通过JavaScript动态加载字体并设置400ms超时控制

//第一种 代码可以用 result.css一次请求 30.10 秒(最优解)
(function () {
  let fontLoaded = false;
  const fontLink = document.createElement('link');
  fontLink.rel = 'stylesheet';
  fontLink.href = 'https://chinese-fonts-cdn.deno.dev/packages/lxgwwenkaibright/dist/LXGWBright-Medium/result.css';
  fontLink.disabled = true; // 初始禁用

  // 设置严格的超时控制
  const timeout = 300;
  const timer = setTimeout(() => {
    console.log('字体加载超时,彻底移除');
    fontLink.remove(); // 彻底移除元素
    fontLink.href = ''; // 清空href,阻止任何后续请求
    document.documentElement.classList.add('font-load-failed');
  }, timeout);

  fontLink.onload = function () {
    if (!fontLoaded) {
      clearTimeout(timer);
      fontLoaded = true;
      fontLink.disabled = false; // 启用样式表
      console.log('字体加载成功');
    }
  };

  fontLink.onerror = function () {
    clearTimeout(timer);
    console.log('字体加载出错,彻底移除');
    fontLink.remove();
    fontLink.href = '';
    document.documentElement.classList.add('font-load-failed');
  };

  // 添加到head
  document.head.appendChild(fontLink);
})();

页头代码添加到<head>

<link 
    rel="preload"  
    as="style"   
    href="https://chinese-fonts-cdn.deno.dev/packages/lxgwwenkaibright/dist/LXGWBright-Medium/result.css" 
    onload="this.rel='stylesheet'" 
    id="fontLink"
>
<meta http-equiv="Cache-Control" content="no-store, no-cache">

技术要点

  1. 动态创建:使用JavaScript创建link元素,避免直接写在HTML中
  2. 初始禁用:创建后先禁用,防止立即应用样式
  3. 超时控制:400ms后移除链接并清空href
  4. 状态管理:防止重复处理加载事件
  5. 降级处理:超时后添加类名启用备用字体

配套CSS

body {
  font-family: "LXGW WenKai Bright", system-ui, sans-serif;
}

方案优势

  •  极简实现:不足30行代码
  •  效果显著:从30秒降到400ms决策
  • 无损降级:确保页面始终可访问
  • 广泛适用:可用于各种阻塞性资源

实践效果

在实际项目中,这个方案将字体加载导致的页面阻塞问题减少了98%以上,显著提升了用户体验。

技术决策的价值不在于复杂性,而在于解决实际问题的效果。这个简单的超时控制方案用最小成本解决了最大的用户体验痛点。

原创文章,作者:霍欣标,如若转载,请注明出处:https://www.bigengwu.cn/shu/306.html

霍欣标的头像霍欣标站长
上一篇 2024-09-06 06:51
下一篇 2024-07-02 03:43

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系方式

博主人懒,应管局要求暂不开启站内私信和评论功能,如需帮助请发邮件。

邮箱账号:1969600480@qq.com

分享本页
返回顶部