
کامپوننت <Image> در Next.js، عنصر استاندارد <img> در HTML را گسترش میدهد تا بهینهسازی تصاویر را بهصورت خودکار و بدون نیاز به پیکربندی پیچیده در اختیار توسعهدهنده قرار دهد. این کامپوننت بخشی جداییناپذیر از معماری App Router در Next.js است و برای رفع مشکلات رایج کارایی مرتبط با تصاویر در وب طراحی شده است.
کامپوننت <Image> چهار مزیت اصلی نسبت به تگ ساده <img> ارائه میدهد:
برای شروع استفاده از این کامپوننت، کافی است آن را از next/image ایمپورت کرده و در کامپوننت خود رندر کنید:
import Image from 'next/image'
export default function Page() {
return <Image src="" alt="" />
}مقدار src میتواند یک تصویر Local یا Remote باشد.
فایلهای استاتیک مانند تصاویر و فونتها را میتوان در پوشهای به نام public در ریشه پروژه ذخیره کرد. فایلهای داخل این پوشه از طریق URL پایه (/) در کد قابل ارجاع هستند.
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}اگر تصویر بهصورت استاتیک ایمپورت شود، Next.js بهطور خودکار width و height ذاتی تصویر را تشخیص میدهد. این مقادیر برای تعیین نسبت تصویر و جلوگیری از Cumulative Layout Shift هنگام بارگذاری استفاده میشوند.
import Image from 'next/image'
import ProfileImage from './profile.png'
export default function Page() {
return (
<Image
src={ProfileImage}
alt="Picture of the author"
// width={500} بهصورت خودکار فراهم میشود
// height={500} بهصورت خودکار فراهم میشود
// blurDataURL="data:..." بهصورت خودکار فراهم میشود
// placeholder="blur" // اختیاری، برای نمایش محو هنگام بارگذاری
/>
)
}اگر امکان استفاده از import استاتیک برای تصاویر وجود نداشته باشد، میتوان از import() داینامیک درون یک Server Component استفاده کرد تا همچنان width، height و blurDataURL بهصورت خودکار به دست بیایند:
import Image from 'next/image'
async function PostImage({
imageFilename,
alt,
}: {
imageFilename: string
alt: string
}) {
const { default: image } = await import(
`../content/blog/images/${imageFilename}`
)
// image شامل width، height و blurDataURL است
return <Image src={image} alt={alt} />
}اگر یک path alias (مانند @/) پیکربندی شده باشد، میتوان بهجای مسیر نسبی از آن استفاده کرد:
const { default: image } = await import(
`@/content/blog/images/${imageFilename}`
)نکته مهم این است که مسیر باید شامل یک پیشوند استاتیک (مانند ../content/blog/images/) باشد. بهتر است این مسیر تا حد امکان دقیق و مشخص باشد، چون تمام فایلهای منطبق با آن پیشوند در باندل قرار میگیرند. تنها فایلهای داخل دایرکتوری مشخصشده شامل میشوند و ورودی خارجی نمیتواند خارج از آن دایرکتوری دسترسی پیدا کند.
برای استفاده از یک تصویر ریموت، میتوانید یک رشته URL را بهعنوان مقدار src بدهید.
import Image from 'next/image'
export default function Page() {
return (
<Image
src="https://s3.amazonaws.com/my-bucket/profile.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}از آنجا که Next.js در زمان build به فایلهای Remote دسترسی ندارد، لازم است مقادیر width، height و بهصورت اختیاری blurDataURL را بهصورت دستی مشخص کنید. مقادیر width و height برای تعیین نسبت تصویر صحیح و جلوگیری از Layout Shift هنگام بارگذاری استفاده میشوند. بهعنوان جایگزین، میتوانید از پراپرتی fill استفاده کنید تا تصویر اندازه المان والد را پر کند.
برای اجازه دادن ایمن به تصاویر از سرورهای ریموت، باید فهرستی از الگوهای URL مجاز را در فایل next.config.js تعریف کنید. برای جلوگیری از سوءاستفاده احتمالی، بهتر است این الگوها تا حد امکان دقیق باشند. برای مثال، پیکربندی زیر فقط اجازه دسترسی به تصاویر یک باکت مشخص در AWS S3 را میدهد:
import type { NextConfig } from 'next'
const config: NextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 's3.amazonaws.com',
port: '',
pathname: '/my-bucket/**',
search: '',
},
],
},
}
export default configکامپوننت <Image> در Next.js با ارائه تغییر اندازه خودکار، فرمتهای مدرن، Lazy Loading بومی و جلوگیری از Layout Shift، یکی از مؤثرترین ابزارها برای بهبود کارایی و تجربه کاربری در پروژههای Next.js است. چه از تصاویر Local استفاده کنید و چه از منابع ریموت، رعایت نکات ذکرشده در این مقاله — بهویژه تعیین صحیح width، height و پیکربندی امن remotePatterns — تضمین میکند که تصاویر پروژه شما هم سریع بارگذاری شوند و هم از نظر امنیتی قابلاطمینان باشند.
برای بررسی مجموعه کامل قابلیتهای این کامپوننت، به مستندات رسمی Image Component مراجعه کنید.