การใช้งาน Image Component
next/image
เป็น Component ที่ Next.js ให้มาเพื่อจัดการรูปภาพ ซึ่งการใช้งาน next/image
จะช่วยเพิ่มความเร็วในการโหลดหน้าเว็บผ่านการปรับแต่งภาพอัตโนมัติ เช่น การบีบอัด การปรับขนาด และการใช้ฟอร์แมตที่เหมาะสมกับอุปกรณ์ของผู้ใช้งาน
คุณสมบัติของ next/image
- การโหลดรูปภาพแบบ Lazy Loading: ช่วยให้หน้าเว็บโหลดเร็วขึ้น
- การปรับขนาดรูปอัตโนมัติ: รองรับการกำหนดขนาดภาพตามอุปกรณ์ที่ใช้งาน
- การแสดงผลภาพแบบ Responsive: ปรับขนาดตามหน้าจอที่แตกต่างกัน
- การรองรับฟอร์แมตที่เหมาะสม: แปลงไฟล์เป็น WebP หรือ AVIF โดยอัตโนมัติ (ถ้าเบราว์เซอร์รองรับ)
- การแคชและ CDN: รูปภาพจะถูกแคชและโหลดจาก CDN ของ Next.js
วิธีการใช้งาน next/image
1. การติดตั้ง Next.js (ถ้ายังไม่มีโปรเจกต์)
หากเรายังไม่มีโปรเจกต์ Next.js สามารถสร้างได้โดยใช้คำสั่งต่อไปนี้:
npx create-next-app@latest my-next-app
cd my-next-app
npm install
2. นำเข้าและใช้งาน next/image
ใน Next.js เราสามารถใช้งาน next/image
ได้โดยการนำเข้าและใช้งานแทน <img>
ปกติ ดังนี้:
|
|
ในตัวอย่างนี้เราจะนำ Image เข้ามาโดยการ import
ในบรรทัดที่ 2 และ Load เข้าไปใน DOM ด้วย property src
ในบรรทัดที่ 9
นอกจาก property src
แล้ว Image Component ยังมี props อื่นๆที่ต้องรู้จักไว้ ดังนี้
Prop | ใช้สำหรับ | ตัวอย่าง |
---|---|---|
alt | คำอธิบายรูปภาพ | alt=“Picture of the author” |
width | ความกว้าง(หน่วยเป็น pixle) | width={500} |
height | ความกว้าง(หน่วยเป็น pixle) | height={500} |
fill | ต้องการให้รูปขยายเต็ม Parent หรือไม่ | fill={true} |
sizes | กำหนดขนาดของรูป สามารถใช้ Media Query ได้ | sizes="(max-width: 768px) 100vw, 33vw" |
loader | ระบุวิธีการสร้าง Loading Image | loader={imageLoader} |
Image Component จะบังคับให้เราใส่ props 2 ตัวคือ
src
และalt
3. Next.JS Image กับ External URL
หากรูปภาพของเราอยู่ใน Server ภายนอก เช่น Image เรามาจาก CDN เราต้องกำหนดค่าใน next.config.js
เพื่ออนุญาตให้ Load รูปภาพจากโดเมนที่อยู่ใน Whitelist นี้ได้ เช่น ในตัวอย่างนี้เราต้องการให้สามารถ Load รูปภาพได้แค่ Domain example.com เท่านั้น
module.exports = {
images: {
domains: ['example.com'],
},
};
จากนั้นเราจึงจะเรียกใช้งาน Image Source ได้แบบนี้
import Image from 'next/image';
export default function ExternalImage() {
return (
<Image
src="https://example.com/image.jpg"
alt="External Image"
width={500}
height={300}
/>
);
}
4. Responsive
next/image
มีความสามารถในการปรับขนาดของรูปตามขนาดของหน้าจอ(Responsive Image) ซึ่งเราสามารถกำหนดค่าต่างๆ ดังนี้
-
กำหนด Style โดยให้ความกว้างของรูปเท่ากับความกว้างของ Container แต่ความสูงให้คำนวนจาก Aspect Ratio เพื่อให้คงสัดส่วนของรูปไว้
<Image src={myImage} alt="Example" sizes="100vw" // ความกว้างเต็มพื้นที่ ส่วนความสูงคำนวนจากความกว้างของรูป style={{ width: '100%', height: 'auto', }} />
แต่ถ้ารูปนี้ไม่ได้ import เข้ามาแต่ใช้การ Load มาจาก URL เราต้องใส่
width
และheight
เพื่ิอบอกสัดส่วนของรูปให้ Next.js ได้รู้ -
Responsive โดยการใช้
fill
,ObjectFit
และsizes
(เราจะใช้ในกรณีที่เราไม่รู้ Aspect Ratio ของรูป)
<Image
src={myImage}
alt="Example"
fill
sizes="(min-width: 808px) 50vw, 100vw"
style={{
objectFit: 'cover', // cover, contain, none
}}
/>
ในตัวอย่างนี้เรากำหนด props เข้าไปดังต่อไปนี้
- fill เป็น
true
เพื่อให้รูปขยายเต็มพื้นที่ - sizes เป็น Media Query ที่กำหนดให้ความกว้างของรูปเป็นครึ่งหนึ่งเมื่อขนาดของหน้าจอที่เปิดกว้างกว่า
808px
- ObjectFit เราจะกำหนด Style เข้าไปด้วยว่าจะให้ Scale รูปภาพแบบไหน โดยมี 3 ทางเลือก ดังนี้
contain
รูปภาพจะย่อขนาดลงมาแต่ยังคงสัดส่วนของรูป(Aspect Ratio)ไว้cover
รูปภาพจะถูกเติมให้เต็ม Container และอาจถูกตัดบางส่วนออก(Crop)none
รูปภาพจะถูกยืดให้เท่ากับขนาดของ Container โดยไม่สนใจ Aspect Ratio
5. การเพิ่มคุณสมบัติ Placeholder
เราสามารถใช้ placeholder="blur"
เพื่อให้มีเอฟเฟกต์เบลอก่อนโหลดภาพ:
<Image
src={myImage}
alt="Example"
width={800}
height={600}
placeholder="blur"
blurDataURL="data:image/jpeg;base64,..."
/>
สรุป
next/image
เป็นเครื่องมือที่ช่วยเพิ่มประสิทธิภาพของเว็บไซต์ที่ใช้ Next.js ได้อย่างมาก โดยช่วยลดขนาดภาพ ปรับขนาดอัตโนมัติ และทำให้โหลดเร็วขึ้น ซึ่งช่วยให้ประสบการณ์ใช้งานดีขึ้นและเพิ่มคะแนน SEO ของเว็บได้อีกด้วย