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

使用Emotion全局样式时本地字体无法生效的问题

解决Create React App + Emotion中本地字体不生效的问题

我之前也碰到过一模一样的情况,问题确实出在路径处理上——Create React App对静态资源的加载规则和咱们直接写相对路径的预期不太一样,咱们一步步来修复:

1. 确认本地字体的存放位置

Create React App要求字体、图片这类静态资源放在public文件夹下,才能被正确访问到。你需要把字体文件整理成这样的结构:

public/
└── fonts/
    └── DancingScript-Regular.ttf

如果之前把字体放在src文件夹里,webpack会把它当作模块处理,直接用相对路径肯定找不到。

2. 修正@font-face的路径

Emotion的Global样式是全局作用的,路径要相对于public目录的根节点,所以把原路径改成绝对路径,同时建议加上字体格式声明(帮助浏览器识别):

@font-face {
  font-family: "Local Font";
  src: url("/fonts/DancingScript-Regular.ttf") format('truetype');
}

这里的/fonts/对应public下的fonts文件夹,不管你的组件在src哪个子目录,这个路径都能稳定生效。

3. 验证文件名和大小写

一定要确保代码里的文件名和实际文件完全匹配,比如DancingScript-Regular.ttf不能写成dancingscript-regular.ttf——本地开发环境可能不区分大小写,但部署到Linux服务器上就会直接失效。

修改后的完整GlobalStyles代码

const GlobalStyles = css`
@import url("https://fonts.googleapis.com/css?family=Dancing+Script&display=swap");
@font-face {
  font-family: "Local Font";
  src: url("/fonts/DancingScript-Regular.ttf") format('truetype');
}
* {
  text-align: center;
}
`;

至于谷歌字体为什么能正常工作?因为它用的是完整的绝对URL,浏览器可以直接请求到资源;而本地字体的相对路径会被webpack编译后改变位置,导致找不到文件,换成基于public的绝对路径就解决了这个核心问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:22:27