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

NextJS执行npm run export静态导出时如何正确引入字体文件

故障原因

本地开发字体加载正常、静态导出部署后失效,核心是@font-face配置的资源路径不符合Next.js静态导出的资源映射逻辑:

  • 开发模式下Next.js内置服务会兼容../public/开头的相对路径引用,所以不会报错
  • 执行npm run export导出静态包时,public目录下的所有文件会被直接复制到out目录根层级,不会保留public这层目录,你写的../public/fonts/xxx路径在构建后的CSS里会指向不存在的位置,自然加载失败。
修复方案
  1. 直接修改globals.css中所有@font-face规则的src路径,删掉../public前缀,统一用站点根路径开头的绝对地址,修改后代码:
@font-face {
  font-family: "Roboto Light";
  src: url('/fonts/Roboto-Light.ttf');
  font-display: swap;
}

@font-face {
  font-family: "Roboto Black";
  src: url('/fonts/Roboto-Black.ttf');
  font-display: swap;
}

@font-face {
  font-family: "Due Credit Regular";
  src: url('/fonts/Due-Credit-Regular.otf');
  font-display: swap;
}

@font-face {
  font-family: "Otamendi";
  src: url('/fonts/Otamendi.ttf');
  font-display: swap;
}

@font-face {
  font-family: "Compacta Regular";
  src: url('/fonts/Compacta-Regular.ttf');
  font-display: swap;
}

加font-display: swap是可选优化,避免字体加载过程中页面文字长时间空白。

  1. 重新执行npm run export生成新的静态产物
  2. 先检查导出的out文件夹,确认根目录下存在fonts文件夹、里面所有字体文件都完整,再把out目录的全部内容重新上传到服务器覆盖旧文件即可。
兜底排查

如果改完路径还是加载失败,去检查服务器的静态资源配置:

  • 给.ttf文件配置MIME类型为font/ttf,.otf文件配置MIME类型为font/otf,否则服务器会把字体文件当成普通二进制文件拦截返回
  • 不要给fonts目录下的资源开防盗链、跨域拦截规则,CSS加载同域字体不会触发跨域,但防盗链的referer校验很容易把字体请求拦下来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:27:25