在 Next.js 中,public 文件夹下的图片不能通过 import 语句导入,而应使用绝对路径(以 / 开头)直接赋值给 或 的 src 属性;误用相对路径或导入文件夹会导致资源加载失败。
在 next.js 中,public 文件夹下的图片不能通过 import 语句导入,而应使用绝对路径(以 `/` 开头)直接赋值给 `` 的 `src` 属性;误用相对路径或导入文件夹会导致资源加载失败。
Next.js 将 public 文件夹作为静态资源根目录进行自动托管——所有位于该文件夹内的文件均可通过以 / 开头的绝对 URL 路径直接访问,无需 import,也不支持对文件夹的导入(如 import profilePic from '../../public/images/profile/' 是非法且无效的)。
✅ 正确做法:使用绝对路径引用 public 中的图片
假设你的项目结构如下:
my-next-app/ ├── public/ │ └── images/ │ └── profile/ │ └── profile-pic.png ├── src/ │ └── app/ │ └── page.tsx
你应在组件中这样使用 :
import Image from 'next/image';
export default function HomePage() {
return (
<main classname="flex items-center text-dark w-full min-h-screen"><div classname="flex items-center justify-between w-full">
<div>
{/* ✅ 正确:以 / 开头,路径相对于 public 根目录 */}
<image src="/images/profile/profile-pic.png" alt="Profile picture" width="{200}" height="{200}" classname="w-full h-auto"></image>
</div>
</div>
</main>
);
}
⚠️ 注意:
组件要求显式传入 width 和 height(或使用 fill + 容器样式),否则会报错。
❌ 常见错误及原因
-
错误 1:尝试 import public 下的图片
// ❌ 错误!public 内文件不可被 import import profilePic from '../../public/images/profile/profile-pic.png';
→ Webpack/Next.js 不会处理 public 目录下的模块解析,此语法将导致编译失败或运行时 undefined。
-
错误 2:路径包含 ../../public
src="../../public/images/profile/profile-pic.png" // ❌ 多余且无效
→ public 是服务根路径,/images/... 已等价于 http://localhost:3000/images/...,加 ../../public 反而破坏路径逻辑。
-
错误 3:只写到文件夹层级
src="/images/profile/" // ❌ 浏览器无法加载目录
→ 必须指定具体文件名及扩展名(如 .png, .jpg, .webp)。
? 额外提示:何时才需要 import 图片?
仅当图片位于 src/ 目录下(如 src/assets/logo.svg)且你希望借助 Webpack 进行优化(如自动转为 Data URL、生成占位符、类型推导等)时,才应使用 import:
import logo from '@/assets/logo.svg'; // ✅ 合法(需配置别名)
<image src="%7Blogo%7D" alt="Logo" width="{120}" height="{40}"></image>
但对于 public/ 中的图片,请始终坚持「零 import,纯路径」原则——这是 Next.js 官方推荐的静态资源分发方式,性能更优、语义更清晰、构建更轻量。
总结:牢记 public = web root,一切从 / 开始,精准指向文件,即可无缝加载。










