NextJS执行npm run export静态导出时如何正确引入字体文件
故障原因
本地开发字体加载正常、静态导出部署后失效,核心是@font-face配置的资源路径不符合Next.js静态导出的资源映射逻辑:
- 开发模式下Next.js内置服务会兼容
../public/开头的相对路径引用,所以不会报错 - 执行
npm run export导出静态包时,public目录下的所有文件会被直接复制到out目录根层级,不会保留public这层目录,你写的../public/fonts/xxx路径在构建后的CSS里会指向不存在的位置,自然加载失败。
修复方案
- 直接修改
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是可选优化,避免字体加载过程中页面文字长时间空白。
- 重新执行
npm run export生成新的静态产物 - 先检查导出的
out文件夹,确认根目录下存在fonts文件夹、里面所有字体文件都完整,再把out目录的全部内容重新上传到服务器覆盖旧文件即可。
兜底排查
如果改完路径还是加载失败,去检查服务器的静态资源配置:
- 给
.ttf文件配置MIME类型为font/ttf,.otf文件配置MIME类型为font/otf,否则服务器会把字体文件当成普通二进制文件拦截返回 - 不要给fonts目录下的资源开防盗链、跨域拦截规则,CSS加载同域字体不会触发跨域,但防盗链的referer校验很容易把字体请求拦下来。
内容的提问来源于stack exchange,提问作者Jolan
相关产品推荐
相关产品推荐

