You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js SSR本地字体加载优化:如何避免首屏默认字体切换闪屏?

Next.js SSR 消除自定义本地字体首屏闪屏优化方案

1. 调整字体显示策略

当前代码中display: 'swap'是导致首屏字体切换的核心原因——该属性允许浏览器先渲染默认字体,待自定义字体加载完成后再切换。将其改为display: 'block',浏览器会在自定义字体加载完成前短暂隐藏文本(最长3秒,超时则使用默认字体),彻底消除闪屏:

const myFont = localFont({
  src: [
      { path: 'Pretendard-Regular.woff2', weight: '400', style: 'normal' },
      { path: 'Pretendard-Medium.woff2', weight: '500', style: 'normal' },
      { path: 'Pretendard-SemiBold.woff2', weight: '600', style: 'normal' },
      { path: 'Pretendard-Black.woff2', weight: '900', style: 'normal' },
  ],
  display: 'block', // 替换原swap属性
  preload: true,
});

2. 确保全局字体样式全覆盖

修改全局CSS,确保所有元素都继承自定义字体,避免局部元素仍使用默认字体:

html, body, * {
  font-family: ${myFont.style.fontFamily}, sans-serif;
}

同时确认myFont.className完整包裹整个应用组件,保证样式优先级。

3. 优化Nginx字体文件配置

在Nginx服务器配置中添加字体缓存策略与正确的Content-Type,加速字体文件加载:

location ~* \.(woff2)$ {
  types {
    font/woff2 woff2;
  }
  expires 1y;
  add_header Cache-Control "public, immutable";
}

该配置让浏览器长期缓存字体文件,后续访问无需重复请求。

4. 压缩字体文件体积

对字体文件进行子集化处理,仅保留网站实际用到的字符(比如中文常用字、数字、符号),大幅降低woff2文件大小。可使用Pretendard官方子集生成工具或fonttools等工具完成处理,进一步缩短字体加载时间。

5. 验证并强化字体预加载

Next.js的localFont开启preload: true后,会自动在页面头部生成预加载标签。可通过浏览器开发者工具Network面板,确认字体文件是否在页面加载初期被优先请求。若自动预加载未生效,手动在_app.tsx中添加预加载:

import Head from 'next/head';

// ...

return (
  <>
    <Head>
      <link rel="preload" href="/fonts/Pretendard-Regular.woff2" as="font" type="font/woff2" crossOrigin="anonymous" />
      <!-- 仅预加载首屏必需的字体权重,避免阻塞其他资源 -->
    </Head>
    <style jsx global>
      {`
        html, body, * {
          font-family: ${myFont.style.fontFamily}, sans-serif;
        }
      `}
    </style>
    <div className={myFont.className}>
      <Component {...pageProps} />
    </div>
  </>
);

内容的提问来源于stack exchange,提问作者spacemonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:57:54