QueenCards / ProjectAnalysis

플젝뿌셔
1 stars 0 forks source link

[17] 이미지 최적화를 어떻게 했나요? #20

Closed hyeyoonS closed 2 months ago

hyeyoonS commented 2 months ago

📎 질문

이미지 최적화를 어떻게 했나요?

✏ 구술 답변 키워드

✏ 서술 답변

sharp 라이브러리

avif 포맷

next-env.d.ts 를 통해 이미지 파일 타입 지정

// Add custom image types if necessary declare module '*.jpg' { const content: string; export default content; }

declare module '*.png' { const content: string; export default content; }



### `svg` 포맷
- 아이콘, 서버 제공 이미지 등 가능한 많은 부분에 png, jpeg 포맷보다 이미지 용량이 적은 svg 포맷을 사용함으로서 이미지 로딩 속도를 개선 시킬 수 있다.
Nahyun-Kang commented 2 months ago

리스티웨이브팀의 경우 Next/Image 태그를 이용하여 자동 최적화를 진행했습니다.

Next/Image 사용 이점

Jyophie commented 2 months ago

이미지 최적화를 하는 방법은 Next.js가 제공하는 기본 이미지 컴포넌트와 다양한 설정 옵션을 활용하는 것이다.

1. Next.js 이미지 컴포넌트 사용하기

Next.js는 이미지 최적화를 위해 next/image 컴포넌트를 제공함. 이 컴포넌트를 사용하면 이미지 크기 조정, 포맷 변환, lazy loading 등 다양한 최적화 기능을 자동으로 처리할 수 있다.

사용 예시

// pages/index.tsx
import Image from 'next/image';
import exampleImage from '../public/example.jpg';

const Home = () => (
  <div>
    <h1>Next.js Image Optimization</h1>
    <Image
      src={exampleImage}
      alt="Example Image"
      width={500}
      height={300}
    />
  </div>
);

export default Home;

위 코드에서 next/image 컴포넌트를 사용하여 이미지를 렌더링하고 있으며, 이미지의 크기와 alt 텍스트를 설정한다.

2. 이미지 파일 타입 지정하기

TypeScript 프로젝트에서는 이미지 파일을 import 할 때 타입을 지정해주는 것이 좋다. 이를 위해 next-env.d.ts 파일을 수정해준다.

// next-env.d.ts
/// <reference types="next" />
/// <reference types="next/types/global" />
/// <reference types="next/image-types/global" />

// Add custom image types if necessary
declare module '*.jpg' {
  const content: string;
  export default content;
}

declare module '*.png' {
  const content: string;
  export default content;
}

3. next.config.js 설정

Next.js에서 이미지 최적화 설정을 추가할 수 있다. 예를 들어, 도메인 허용 및 이미지 로더 설정을 하는 방안.

// next.config.js
module.exports = {
  images: {
    domains: ['example.com'], // 외부 이미지 도메인 추가
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
};

4. 외부 이미지 사용

외부 이미지를 사용하는 경우, 이미지 도메인을 next.config.js 파일에 추가하여 허용해야 함.

import Image from 'next/image';

const Home = () => (
  <div>
    <h1>Next.js Image Optimization with External Images</h1>
    <Image
      src="https://example.com/example.jpg"
      alt="Example External Image"
      width={500}
      height={300}
    />
  </div>
);

export default Home;

위 코드에서 외부 이미지를 next/image 컴포넌트를 통해 사용하는 방법을 보여준다.

5. 이미지 최적화 전략

이미지 최적화를 극대화하기 위해 다음과 같은 전략을 고려할 수 있다.

결론

이미지 최적화를 구현하는 방법은 next/image 컴포넌트를 사용하는 것. 이를 통해 다양한 최적화 기능을 간편하게 사용할 수 있으며, 설정 파일을 통해 세부적인 조정도 가능하다.

hyeyoonS commented 2 months ago

최신 버전의 next.js를 사용하였기에, next.js에서 제공하는 <Image>컴포넌트를 사용했습니다.

컴포넌트의 특징

Eugene-A-01 commented 2 months ago

Q. 리스티웨이브에 적용한 이미지 최적화 방식

  1. next/Image 컴포넌트를 이용

    • 레이지로딩 : 스크린 안에 있는 이미지만 로드하는 레이지로딩을 자동으로 적용
    • 이미지 사이즈 최적화 : 디바이스에 따라 적절한 사이즈로 이미지를 제공하고 작은용량의 webp 포맷으로 변환하여 사용
    • 이미지 캐싱
  2. 포맷 최적화 아이콘, 서버제공 이미지들은 svg 포맷으로 제공 가능한 많은 부분에 png, jpeg 포맷보다 이미지 용량이 적은 svg 포맷 사용해서 이미지 로딩속도 개선시킴

wise-Ag commented 2 months ago

Image 컴포넌트 사용하기

Next에서 제공하는 next/Image를 사용하면 다음과 같은 이미지 최적화를 할 수 있습니다.

  1. 사이즈 최적화 : 장치별로 이미지 사이즈를 자동으로 조정합니다.
  2. 화면 안정화 : 이미지를 로딩할때 레이아웃이 이동하는 layout shift를 예방합니다.
  3. 빠른 페이지 로드 : 이미지가 뷰포트에 들어올 때 이미지를 로드합니다. 이미지를 미리 로드하지 않음으로써 빠른 속도를 제공합니다.

페이지의 요소 중 가장 큰 요소를 Largest Contentful Paint (LCP) element라고 합니다. 콘솔에 경고로 이미지가 LCP에 해당하는지 알 수 있습니다.

스크린샷 2024-05-13 오후 12 05 04

priority = {true} 옵션을 사용하면 우선적으로 해당 이미지를 preload하여 최적화할 수 있습니다.