Vite 的 public 目录用于零处理直拷贝静态资源,文件原样复制到 dist 根目录,路径不变,需用绝对路径(如 /logo.png)或相对路径引用;base 配置影响访问前缀,推荐 base: './' 适配子路径部署;src/assets 下资源会经构建处理,不适用于需裸放的资源。

Vite 默认会把 public 目录下的文件原样复制到构建输出目录(如 dist)的根路径下,不经过任何构建处理——这是它处理静态资源最直接、最可靠的方式。
public 目录是专为“免处理静态资源”设计的
只要把图片、字体、favicon.ico、robots.txt、第三方 JS/CSS(如统计脚本)、甚至 HTML 模板放在 public/ 下,Vite 构建时就会 1:1 复制过去,路径保持不变。
比如:
public/
├── favicon.ico
├── logo.png
└── assets/
└── font.woff2构建后 dist/ 中对应结构为:
dist/
├── favicon.ico
├── logo.png
└── assets/
└── font.woff2你可以在代码中直接用绝对路径引用(注意:路径以 / 开头,表示从站点根目录起):
<link rel="icon" href="/favicon.ico" /> <img src="/logo.png" alt="logo" />
⚠️ 注意:
/开头的路径在开发和生产环境都有效,前提是base配置合理(见下文)。
如何控制 public 资源的最终位置?
Vite 不提供对 public 内容的重命名或哈希处理(那是 src/assets/ 下资源才有的能力),但你可以通过 base 配置影响其访问前缀:
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
-
base: '/'(默认)→ 访问路径为https://example.com/logo.png -
base: '/my-app/'→ 访问路径变为https://example.com/my-app/logo.png,此时<img src="/logo.png">会 404,必须改成<img src="/my-app/logo.png">或使用相对路径(如./logo.png)
更稳妥的做法是配合 base: './'(相对路径模式),这样所有资源引用都基于当前 HTML 文件位置,适合部署到任意子路径:
// vite.config.ts
export default defineConfig({
base: './', // 关键:让 /xxx 变成 ./xxx 解析
publicDir: 'public', // 默认就是 public,可显式声明
})此时 public/logo.png 在 HTML 中写 <img src="./logo.png"> 或 <img src="logo.png"> 都能正常加载,无需关心部署在哪一级路径。
不建议把静态资源放 src/assets 下再“当成 public 用”
src/assets/ 下的资源会被 Vite 当作模块处理:打包、哈希、重命名、走构建流程。例如:
import logoUrl from '@/assets/logo.png' // → 构建后变成 assets/logo.abc123.png,且有导出路径
这适合需要缓存更新、按需加载、类型检查的资源,但不是“直接复制”的语义。如果你只想要原始文件原封不动上线,就别放这里。
小结关键点
- ✅
public/是唯一支持“零处理、直拷贝”的目录 - ✅ 文件路径与
dist/中路径完全一致,引用时用/xxx或./xxx - ✅
base配置决定/开头路径的解析基准,base: './'最适配子目录部署 - ❌ 不要用
src/assets/存放意图“裸放”的资源(如 CDN 初始化脚本、固定命名的配置 JSON) - ❌ 不要试图用插件去“模拟 public 行为”——没必要,也易出错
不复杂但容易忽略。

















