next/image
의 Image
컴포넌트를 사용한다.img
태그가 아닌, Image
컴포넌트를 사용함으로써, 이미지를 읽을 때 서버 사이드에서 이미지를 최적화한다.예시로 img 태그와 Image 컴포넌트를 각각 사용했을 때를 비교해보자.
public/image/
아래 임의의 이미지를 배치하고, 그것을 표시하는 페이지를 pages/image-sample.tsx
에 작성한다.Image
컴포넌트로 이미지를 표시할 때는 img
태그와 마찬가지로 src
에 이미지 경로를 전달한다.Image
컴포넌트로 사용할 때는 width
와 height
를 생략할 수 있다.import { NextPage } from "next";
import Image from "next/image";
const ImageSample: NextPage<void> = (props) => {
return (
<div>
<h1>이미지 표시 비교</h1>
<p>img 태그로 표시한 경우</p>
{/* 일반적인 img 태그를 사용해서 이미지를 표시한다. */}
{/* <img src="/image/dog.jpeg" /> */}
<p>Image 컴포넌트로 표시한 경우</p>
{/* Image 컴포넌트를 사용해서 표시한다. */}
<Image src="/image/dog.jpeg" alt="dog image" width={500} height={500} />
<p>Image로 표시한 경우는 사전에 그리기 영역이 표시된다.</p>
</div>
);
};
export default ImageSample;
Image
컴포넌트는 초기 단계에서 뷰 포트에 표시되니 않는 이미지는 그리지 않고, 스크롤해서 뷰포트에 가까워지는 단계에서 화면을 얻고 그리기 시작한다.layout
에는 뷰포트의 변화에 따라 이미지를 리사이즈할 것인지를 설정할 수 있다. (next/legacy/image
에만 있는 속성)intrinsic
(기본 값) : 뷰포트가 이미지 크기보다 작을 때, 뷰포트에 맞춰 리사이즈한 이미지를 표시한다.responsive
: 뷰포트에 맞춰 리사이즈한 이미지를 표시한다.fixed
: width와 height에 기반해, 뷰포트의 크기에 관계없이 같은 사이즈 이미지를 표시한다fill
: 부모 요소에 맞춰서 이미지를 표시한다.empty
: 이미지의 영역만 확보하고 아무것도 표시하지 않는다.blur
: 흐릿한 이미지를 표시한다.import
문으로 읽은 로컬 이미지의 경우에는 흐릿한 이미지가 자동 생성되어 표시되지만, 경로로 지정한 경우나 외부 이미지의 경우는 blurDataURL
에 표시할 흐릿한 이미지의 URL을 지정해야 한다.next.config.js
의 domains
에 최적화를 허가하는 이미지의 도메인을 추가하거나, Image 컴포넌트의 unoptimized
에 true
를 전달해 최적화를 무효화 해야한다.// next.config.js
const nextConfig = {
reactStrictMode: true,
images: {
// example.com 아래의 이미지를 Image 컴포넌트에 표시하기 위해 추가
domains: ['example.com'],
}
}
module.exports = nextConfig