Closed hyeyoonS closed 2 months ago
리스티웨이브팀의 경우 Next/Image 태그를 이용하여 자동 최적화를 진행했습니다.
이미지 최적화를 하는 방법은 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 텍스트를 설정한다.
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;
}
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],
},
};
외부 이미지를 사용하는 경우, 이미지 도메인을 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
컴포넌트를 통해 사용하는 방법을 보여준다.
이미지 최적화를 극대화하기 위해 다음과 같은 전략을 고려할 수 있다.
next/image
는 기본적으로 lazy loading을 지원.이미지 최적화를 구현하는 방법은 next/image
컴포넌트를 사용하는 것. 이를 통해 다양한 최적화 기능을 간편하게 사용할 수 있으며, 설정 파일을 통해 세부적인 조정도 가능하다.
최신 버전의 next.js를 사용하였기에, next.js에서 제공하는 <Image>컴포넌트
를 사용했습니다.
Q. 리스티웨이브에 적용한 이미지 최적화 방식
next/Image 컴포넌트를 이용
포맷 최적화 아이콘, 서버제공 이미지들은 svg 포맷으로 제공 가능한 많은 부분에 png, jpeg 포맷보다 이미지 용량이 적은 svg 포맷 사용해서 이미지 로딩속도 개선시킴
Next에서 제공하는 next/Image를 사용하면 다음과 같은 이미지 최적화를 할 수 있습니다.
페이지의 요소 중 가장 큰 요소를 Largest Contentful Paint (LCP) element라고 합니다. 콘솔에 경고로 이미지가 LCP에 해당하는지 알 수 있습니다.
priority = {true}
옵션을 사용하면 우선적으로 해당 이미지를 preload하여 최적화할 수 있습니다.
📎 질문
이미지 최적화를 어떻게 했나요?
✏ 구술 답변 키워드
next/image
컴포넌트sharp
라이브러리avif
포맷✏ 서술 답변
next/image
컴포넌트,sharp
라이브러리,avif
포맷, 이미지 파일 타입 지정,svg
포맷 사용 등의 방법으로 이미지를 최적화했다.next/image
컴포넌트priority = {true}
옵션을 통해 우선적으로 해당 이미지를 preload하여 Largest Contentful Paint (LCP) 를 방지하고 최적화 할 수 있다.sharp
라이브러리avif
포맷webp
이다.webp
대비avif
가 최초 로드는 20% 느리지만, 이미지 사이즈가 20% 더 작기 때문에 캐싱을 통해 속도 이점을 가진다.avif
를 지원하지 않는 브라우저는 webp으로 알아서 최적화 해준다.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; }