Next.js 项目图片存放实践:Assets vs Public

📂 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 项目中通常两者要结合使用

  1. 放 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} />;
}
  1. 放 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/运维管理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值