📂 Assets 目录(import img from "@/assets/xxx.png")
适合:
- 组件级、局部、不会经常改的图片资源(例如:Logo、小图标、UI 插图)
- 需要构建时优化的图片(响应式、WebP/AVIF 自动生成)
- 和代码强绑定的资源(例如按钮上的小图标)
优势:
- 构建时 Next.js 会对图片做优化(压缩、自动生成多分辨率版本)。
- 和组件同目录 → 便于代码维护、类型检查。
- 未使用的图片不会被打包(Tree Shaking)。
劣势:
- 图片必须通过
import,不支持字符串动态路径。 - 需要额外配置 CI/CD 才能让构建后的资源走 CDN。
📂 Public 目录(/public/images/xxx.png)
适合:
- 用户上传的图片(头像、商品图、帖子配图)
- CMS 或后台可配置的图片(广告图、Banner、SEO 图片)
- CDN 直连的图片(静态大图、视频封面、3D 模型贴图)
优势:
- 可以用字符串路径访问,适合动态渲染:
<img src={`/images/${bannerName}.png`} />
- 和 CDN 同步简单,只要同步
public/就行。 - 不依赖构建,可以随时替换文件。
劣势:
- 没有自动优化,需要手动压缩。
- 路径错误要等到运行时报错。
- 缓存失效需要加版本号(例如
/images/logo.png?v=2)。
✅ 推荐实践(混合使用)
在 Next.js 项目中通常两者要结合使用:
- 放 Assets(代码里 import 的图片)
- UI 图标
- Logo
- 插图(产品图、功能说明图)
import Logo from "@/assets/logo.png";
import Image from "next/image";
export default function Header() {
return <Image src={Logo} alt="logo" width={100} height={40} />;
}
- 放 Public(动态 & CDN 图片)
- Banner 图、广告图
- 用户上传内容(头像、相册)
- SEO 相关图片(og:image、favicon)
export default function Banner({ bannerName }: { bannerName: string }) {
return <img src={`/images/${bannerName}.png`} alt="banner" />;
}
📌 一句话总结:
- **代码绑定的图片 → 放 **
**assets**(享受 Next.js 优化) - **动态可替换的图片 → 放 **
**public**(方便 CDN/运维管理)
730

被折叠的 条评论
为什么被折叠?



