Skip to content

public/ 目录

public/ 目录用于存放不需要构建处理的静态资源文件,它们会被原样复制到输出目录。

为什么需要 public/?

有些文件你不想让 Vite 处理:

文件为什么不需要构建处理
favicon.ico浏览器直接请求,需要固定路径 /favicon.ico
robots.txt搜索引擎爬虫直接请求,不能改文件名
sitemap.xml同上,固定路径
og-image.png社交媒体分享图,URL 需要固定

如果放在 assets/ 里,Vite 会给文件名加哈希(如 favicon.3a4b.ico),导致浏览器和爬虫找不到。

特点

  • 文件通过 URL 根路径直接访问
  • 不经过 Vite 构建,不哈希文件名
  • 适合存放不变的、需要固定 URL 的文件

目录结构

text
public/
├── favicon.ico        → /favicon.ico
├── robots.txt         → /robots.txt
├── sitemap.xml        → /sitemap.xml
├── images/
│   └── og-image.png   → /images/og-image.png
└── fonts/
    └── icon.woff2     → /fonts/icon.woff2

URL 映射规则

public/ 目录下的文件,URL 路径就是从 public/ 之后的路径。如 public/images/og-image.png/images/og-image.png

在代码中引用

vue
<template>
  <!-- 使用绝对路径(以 / 开头) -->
  <img src="/images/og-image.png" alt="OG Image" />
</template>

<head>
  <!-- favicon 也是直接引用 -->
  <link rel="icon" href="/favicon.ico" />
</head>

为什么用 / 而不是 ~/

  • public/ 下的文件不走构建流程,~ 路径别名是 Vite 的功能
  • 它们在部署后就在网站根目录下,直接用 / 绝对路径访问
  • 记住:assets/~/public//

public/ vs assets/

特性public/assets/
构建处理❌ 不处理,原样复制✅ Vite 处理(压缩、优化)
文件名哈希❌ 保持原名✅ 内容哈希(如 logo.3a4b.png
引用方式绝对路径 /相对路径 ~/assets/
Tree-shaking❌ 全部打包,不管用没用✅ 未使用的不会打包
缓存策略手动管理哈希文件名自动破缓存
适用场景favicon、robots.txtCSS、需要优化的图片

文件名哈希有什么用?

当你更新了一张图片,如果文件名不变,浏览器可能使用缓存中的旧版本。assets/ 下的文件会自动加哈希(如 logo.3a4b.png),内容变了哈希就变,浏览器会自动加载新版本。

public/ 的文件没有哈希,所以如果你更新了 public/images/og-image.png,用户可能还看到旧版本。解决方案:手动在文件名加版本号(如 og-image-v2.png)。

适合放在 public/ 的文件

文件原因
favicon.ico浏览器固定请求 /favicon.ico
robots.txt搜索引擎爬虫固定请求 /robots.txt
sitemap.xml同上
og-image.png社交平台固定 URL 抓取
_redirectsNetlify 重定向规则
_headersCloudflare 头部规则
不需要优化的静态文件如已经压缩好的字体文件

不适合放在 public/ 的文件

文件应该放哪原因
需要压缩的图片assets/ + <NuxtImg>Vite 会自动压缩优化
CSS 文件assets/需要构建处理
需要版本控制的文件assets/会自动哈希,缓存自动更新
大量图片考虑 CDN不应该打包进项目,用外部 CDN

常见问题

public/ 下的文件访问 404

  1. 确认文件确实在 public/ 目录下
  2. 确认 URL 路径正确(不要包含 public/ 本身)
  3. 开发模式下重启服务器
  4. 构建后检查 .output/public/ 目录是否有该文件

更新了文件但浏览器显示旧版本

这是缓存问题。public/ 的文件名不变,浏览器会使用缓存。解决方案:

  1. 开发:Ctrl+Shift+R 强制刷新
  2. 生产:给文件名加版本号(如 og-image-v2.png
  3. 更好的方案:把这类文件移到 assets/,让 Vite 自动管理缓存

基于 Nuxt 4 官方文档整理编写