Vite 构建的 React 项目中图片放置的最佳实践
4 min
在 Vite 构建的 React 项目中,正确处理图片等静态资源非常重要。通常有两种主要方式来放置和引用图片:使用 public 目录或 src/assets 目录。
1. 使用 public 目录
将图片放置在项目根目录下的 public 文件夹中是一种简单直接的方式。
工作原理
public目录下的文件在构建时会被 原样复制 到输出目录(默认为dist)的根路径下。- 这些文件 不会 被 Vite 处理、压缩或重命名(不会添加 hash)。
- 你可以通过 绝对路径 (
/) 来引用这些文件。
示例
假设你的项目结构如下:
project-root/
├── public/
│ └── logo.png
├── src/
│ └── App.jsx
...在你的 React 组件(例如 App.jsx)中,可以这样引用 logo.png:
function App() {
// 使用绝对路径 /logo.png
return <img src="/logo.png" alt="Logo" />
}构建后,logo.png 会位于 dist/logo.png,浏览器可以通过 http://your-domain.com/logo.png 访问到它。
注意:为什么必须使用绝对路径
/? 如果你省略了开头的/,像这样写:// 错误示例:使用相对路径 return <img src="logo.png" alt="Logo" />;浏览器会将其解析为 相对于当前页面 URL 的路径。例如,如果当前页面是
http:/your-domain.com/about,浏览器会尝试请求http://your-domain.com/about/logo.png,这通常会导致 404 错误。因此,引用public目录下的资源时,务必使用以/开头的绝对路径。
2. 使用 src/assets 目录
将图片放置在 src 目录下的 assets 文件夹(或其他子目录)是另一种常用的方式,尤其适用于需要 Vite 处理的资源。
工作原理
- 需要通过 JavaScript 的
import语句来引入图片。 - Vite 会将这些导入的图片视为 模块依赖。
- 在构建时,Vite 会处理这些图片(例如,优化、添加 hash 以实现缓存控制),并将它们复制到输出目录(通常是
dist/assets)。 import语句会返回处理后的图片的 最终公共路径。
示例
假设你的项目结构如下:
project-root/
├── src/
│ ├── assets/
│ │ └── logo.png
│ └── App.jsx
...在 App.jsx 中,你需要先 import 图片,然后将其作为 src 属性的值:
import logoSrc from './assets/logo.png' // 相对路径导入
function App() {
// 使用导入的路径变量
return <img src={logoSrc} alt="Logo" />
}构建后,logo.png 可能会被重命名为类似 dist/assets/logo.a1b2c3d4.png 的文件,而 logoSrc 变量的值将是这个最终的路径(例如 /assets/logo.a1b2c3d4.png)。
总结:如何选择?
- 使用
public目录:- 需要确保文件名不变时。
- 需要通过绝对 URL 直接访问资源时。
- 对于不需要 Vite 处理或优化的文件(例如
favicon.ico、robots.txt或一些第三方库的静态资源)。
- 使用
src/assets目录:- 希望 Vite 处理和优化图片时。
- 希望利用构建过程中的 hash 实现长期缓存时。
- 对于作为应用程序一部分的图标、背景图等资源。