public 和 assets 是常见的资源目录,但它们的定位和使用方式有本质差异。以下是针对前端开发的对比说明:
核心区别对比表
| 特征 | public 目录 | assets 目录 |
|---|---|---|
| 定位 | 无需构建处理的静态资源 | 需要构建处理的动态资源 |
| 典型框架 | Vue CLI / Create-React-App | Vue CLI / Next.js / Nuxt |
| 文件处理 | 直接拷贝到构建输出目录 | 会被 Webpack 等打包工具处理 |
| 路径引用 | 绝对路径 /logo.png | 相对路径 @/assets/logo.png |
| 典型文件类型 | favicon.ico, robots.txt | 图片、SCSS、字体、JSON |
| 版本控制 | 无哈希后缀 | 带哈希后缀(如 logo.abc123.png) |
使用场景详解
1. public 目录
适用场景:
- 需要保持原始文件名的资源(如 PWA 的 manifest.json)
- 第三方库的 CDN 文件(如未模块化的 legacy.js)
- 通过
<link>直接引用的资源(如字体文件) - 绕过前端路由的 HTML 文件(如 404.html)
代码示例:
html<!-- 直接引用 public 下的文件 --> <img src="/logo.png" /> <link rel="icon" href="/favicon.ico" />
2. assets 目录
适用场景:
- 需要 Webpack 处理的资源(如图片压缩、Base64 内联)
- 通过 JavaScript 动态加载的资源(如
import bg from '@/assets/bg.jpg') - 需要 CSS 预处理处理的文件(如 SCSS 中
@import "assets/variables.scss") - 需要 Tree-Shaking 优化的 SVG 图标
代码示例:
javascript// Vue 组件中引用 <template> <img :src="require('@/assets/logo.png')" /> </template> // React 中通过 import 引用 import styles from './App.module.scss'; import icon from './assets/icon.svg';
常见误区解释
图片加载失败问题:
- 把需要动态处理的图片放在
public会导致路径错误 - 正确做法:小图标放
assets(享受打包优化),超大文件放public(避免构建耗时)
- 把需要动态处理的图片放在
CSS 背景图路径:
scss/* 错误:public 路径在构建后可能失效 */ background: url('/public/bg.jpg'); /* 正确:使用 assets 相对路径 */ background: url('@/assets/bg.jpg');动态路径问题:
javascript// 错误:public 目录无法使用模板语法 const path = `/images/${fileName}.png` // 可能 404 // 正确:使用 require 动态加载 assets const path = require(`@/assets/images/${fileName}.png`)
性能优化建议
public 使用原则:
- 单文件 > 500KB 时优先使用
- 需要跨项目共享的配置文件
- 必须保持原始文件名的资源
assets 使用原则:
- 小于 10KB 的图片自动转 Base64
- 需要按需加载的代码分割文件
- 需要哈希命名的缓存策略文件