next optimize image

Posted by : on

Category : nextJs   react


Next.js Image 컴포넌트란?

Next.js에서는 이미지를 효율적으로 처리하고 최적화하기 위한 Image 컴포넌트를 제공 이미지를 최적화하여 페이지 로딩 속도를 개선하고, 사용자 경험을 향상시킬 수 있음

import Image from 'next/image';

<Image
  src="/path/to/image.jpg"
  alt="이미지 설명"
  width={500}
  height={300}
/>
속성명 (prop) 설명 및 예시
src 표시할 이미지 파일 경로 또는 URL (예: src="/profile.png")
width 이미지 너비 지정 (예: width={500})
height 이미지 높이 지정 (예: height={500})
alt 이미지 대체 텍스트 설정 (예: alt="Picture of the author")
loader 이미지 로딩 방식을 지정하는 함수 (예: loader={imageLoader})
fill 이미지를 자동으로 필드에 맞게 채울지(예: fill={true})
sizes 반응형 이미지의 크기 조절 (예: sizes="(max-width: 768px) 100vw")
quality 이미지 품질을 설정 (1-100까지의 정수, 예: quality={80})
속성명 (prop) 설명 및 예시
priority 이미지 로딩 우선순위 설정 (예: priority={true})
placeholder 이미지 로딩 중에 표시할 미리보기 이미지 설정 (예: placeholder="blur")
styles 커스텀 CSS 스타일을 지정하여 이미지에 스타일링 적용 (예: style=)
onLoadingComplete 이미지 로딩이 완료된 후 호출되는 콜백 함수 설정 (예: onLoadingComplete={img => done()})
onLoad 이미지 로딩이 시작될 때 호출될 콜백 함수 설정 (예: onLoad={event => done()})
onError 이미지 로딩 중 오류 발생 시 호출되는 콜백 함수 설정 (예: onError={event => fail()})
loading 이미지 로딩 전략 설정 (eager / lazy) (예: loading="lazy")
blurDataURL 이미지 로딩 중 미리보기 이미지로 사용할 데이터 URI 설정 (예: blurDataURL="data:image/jpeg...")

Next/Image 컴포넌트 특징

  • 이미지 최적화: 이미지를 자동으로 최적화하고, 필요한 크기로 조정함
  • 이미지 포맷: WebP, JPEG, PNG 등 다양한 이미지 포맷 지원.
  • 브라우저의 지원 여부에 따라 최상의 포맷 자동 선택
  • 반응형 이미지: next/image를 사용하면 반응형 이미지 쉽게 생성 가능. 다양한 크기의 이미지를 제공하며 브라우저 창 크기에 따라 적절한 크기 이미지 자동 선택
레이아웃 속성: next/image의 layout 속성을 사용해서 이미지의 레이아웃 제어 가능 (layout=”fixed”)
  • intrinsic: (기본값) 이미지의 원본 크기를 유지하면서 조정
  • fixed: 지정된 너비와 높이로 이미지가 고정
  • responsive: 반응형 이미지로, 가로 비율을 유지하면서 너비만 지정
  • 미리보기 이미지: 이미지 로딩 전, 미리보기 이미지를 생성하여 페이지 레이아웃이 변경되지 않고 사용자 경험을 향상

  • Lazy loading: next/image 모듈은 레이지 로딩을 자동으로 지원, 화면에 나타날 때 이미지를 로드

따라서, 페이지 초기 로딩 성능을 향상시키고 대역폭을 절약

  • 효율적인 캐싱: 이미지를 효율적으로 캐싱하여 이미지 로딩을 최적화
  • 테마 감지: 테마(다크 모드 또는 라이트 모드)에 따라 이미지를 동적으로 선택할 수 있음
  • 애니메이션 이미지: GIF와 같은 애니메이션 이미지를 지원함
  • 기본적으로 이미지를 자동으로 최적화하고, 로딩할 때 애니메이션 유지
.imgDark {
  display: none;
}

@media (prefers-color-scheme: dark) {
  .imgLight {
    display: none;
  }
  .imgDark {
    display: unset;
  }
}
import styles from './theme-image.module.css'
import Image from 'next/image'

const ThemeImage = (props) => {
  const { srcLight, srcDark, ...rest } = props;

  return (
    <>
      <Image {...rest} src={srcLight} className={styles.imgLight} />
      <Image {...rest} src={srcDark} className={styles.imgDark} />
    </>
  );
}

Image 라는 컴포넌트를 사용하면 거의 대부분 최적화를 해준다

참고로 외부에서 불러오는 이미지에대한 안전성을 부여하려면 next.config.mjs에서 images:{ domains:[“도메인””] } 을 넣어주면 된다.


About 유재석
유재석

개발자 유재석 입니다. Web Developer.

Email : jaeseok9405@gmail.com

Website : https://github.com/yoo94