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

React.js加载public目录本地图片失败的解决方案

问题原因

加载失败核心是搞混了React项目两类静态资源的加载规则:

  • require()、import是打包工具的模块引入语法,只能用来引用src目录下会走打包流程的资源,打包时会自动完成压缩、哈希命名、路径替换等处理。
  • public目录下的文件不会走打包流程,构建时会直接原封不动拷贝到最终产物的根目录,根本不支持用require/import的模块方式引入。你现在用require去引public里的图片,打包阶段根本解析不到正确的模块,返回的路径是错误的,自然会出现裂图。之前尝试import方法失败也是同一个原因——图片放在public目录下,模块引入逻辑扫描不到这个资源。
正确加载方案

根据你当前的目录结构选一种即可:

  • 方案1:图片保留在public目录,直接写绝对路径(改造成本最低)
    public目录下的资源访问路径直接对应站点根路径,不需要任何引入操作,直接写路径就能用:
export default function Home() {
  return (
    <img src="/images/icon.png" alt="功能图标" />
  )
}

如果项目不是部署在域名根路径、而是在子目录下,就拼接脚手架自带的公共路径变量避免404:

<img src={`${process.env.PUBLIC_URL}/images/icon.png`} alt="功能图标" />

不管是本地调试还是部署到Vercel,Create React App、Next.js这些常用React脚手架都默认支持这个变量,会自动匹配实际部署路径。

  • 方案2:把图片移到src目录下,用模块方式引入
    如果希望图片享受打包压缩、哈希缓存、tree-shaking等构建优化,可以把图片从public目录挪到src下的资源文件夹(比如src/assets/images),再用import/require引入:
// 写法1:顶部提前import
import icon from '../assets/images/icon.png'
export default function Home() {
  return <img src={icon} alt="功能图标" />
}

// 写法2:行内直接require(注意:Webpack5、React18及以上的新版本,不需要加.default,直接取require返回值即可,只有老版本才需要加.default,多写反而会导致路径错误)
export default function Home() {
  return <img src={require('../assets/images/icon.png')} alt="功能图标" />
}
异常效果参考

渲染异常裂图截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:30:45