React favicon 不显示?这样修复
React 渲染到一个 DOM 节点,从不碰 head,所以 favicon 存在于一个静态 HTML 文件里。标签页空白,说明那个文件里的 link 标签写错了,或者图标是从 src 导入的、不再位于固定路径上。
head 是一个静态文件,不是组件
浏览器在解析 head 时就会请求 favicon,远早于 React 挂载。所以图标 link 必须放在 HTML 外壳里:Vite 下是项目根目录的 index.html,Create React App 下是 public/index.html。
有两件事会导致它出问题。在 Create React App 中,一个跳过了 %PUBLIC_URL% 占位符的 href 在本地能用,一旦离开域名根路径就会 404。而在任何 React 项目里,从 src 导入图标就是把它交给了打包器,打包器会用内容哈希给它重命名,于是 /favicon.ico 处再也没有东西响应。
追查问题
- 1
直接打开 /favicon.ico
出现 404 说明文件没有在该路径上提供:这是构建或路径问题。如果能加载,说明文件没问题,问题出在 link 标签或缓存。
- 2
读取构建后的 index.html
看构建输出,而不是你的源文件。确认图标 href 解析到了一个真实路径,并且对 CRA 而言,%PUBLIC_URL% 被替换掉了、而不是原样保留。
- 3
别再从 src 导入图标
public/ 里的文件会保留名字并在固定路径上响应;从 src/ 导入的文件会被加哈希。favicon 必须放在 public/ 里。
React favicon 不显示:常见问题
为什么我的 React favicon 不显示?
几乎总是 index.html 里的 link 标签指向了文件不存在的地方,或者图标是从 src 导入的、拿到了一个带哈希的文件名。直接打开 /favicon.ico,看看该路径上到底有没有提供这个文件。
为什么部署到子路径后 favicon 就 404 了?
href 相对域名根路径解析,而不是相对你的子目录。在 Vite 中设置 vite.config.js 里的 base;在 Create React App 中设置 homepage 字段并在模板里使用 %PUBLIC_URL%,然后检查构建后的 index.html。
我需要在 React 代码里导入 favicon 吗?
不需要。public/ 里的文件会原样复制到构建输出,并不属于模块图。导入它会生成第二份带哈希的副本,并破坏固定的 /favicon.ico 路径。