웹 성능 최적화를 위해 이미지 크기 줄이기
September 03, 2022
이미지 크기 줄이기
- 이미지 크기를 줄이는 방법으로는 웹팩을 통하는 방법과 컴퓨터에서 직접 변환하는 방법이 있다.
웹팩 image-webpack-loader 사용
- image-webpack-loader는 이미지 자체를 압축해준다. JPG, PNG, GIF, SVG를 지원한다. 이 로더는 압축한 파일을 임베딩 해주지는 않으므로,- enforce: 'pre'옵션을 통해 다른 로더보다 먼저 실행하여 압축하고 다른 로더(file-loader)를 통해 임베딩되도록 한다.
// webpack.config.js
module.exports = {
	module: {
		rules: [
			{
				test: /\.(jpe?g|png|gif|svg)$/,
				loader: "image-webpack-loader",
				// enforce: 'pre'는 이 로더를 다른 로더들보다 먼저 실행
				enforce: "pre",
			},
			// file-loader
			{
				test: /\.(jpe?g|png|gif|svg)$/i,
				loader: "file-loader",
				options: {
					name: "static/[name].[ext]",
				},
			},
		],
	},
}애니메이션 GIF를 비디오로 대체하여 페이지를 더 빠르게 로드
- MPEG 비디오 만들기
ffmpeg -i find.gif -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" -b:v 0 -crf 25 -f mp4 -vcodec libx264 -pix_fmt yuv420p find.mp4- before & after
      
   
    
- 비디오 넣기(자동재생, 무음, 무한반복)
import freeMp4 from "../../assets/images/free.mp4"
;<video autoPlay loop muted playsInline>
	<source src={freeMp4} type="video/mp4" />
</video>이미지를 WebP 확장자로 변환
- WebP 형식은 일반적으로 이전 형식보다 더 나은 압축을 제공하며 가능한 경우 사용해야 한다. 모든 최신 브라우저에서 지원되고 있으나, 몇몇 구형 브라우저에서 지원이 필요한 경우 WebP를 다른 이미지 형식과 함께 폴백으로 사용하는 방법도 있다.
      
   
    
- cwebp을 사용하여 다른 형식의 이미지를 WebP 형식으로 변환
- 
cwebp의 기본 압축 설정을 사용하여 단일 파일을 변환하는 명령어 cwebp images/flower.jpg -o images/flower.webp
- 
품질 수준 50을 사용하여 단일 파일을 변환하는 명령어cwebp -q 50 images/flower.jpg -o images/flower.webp
- 
디렉터리의 모든 파일을 변환하는 명령어 for file in images/*; do cwebp "$file" -o "${file%.*}.webp"; done
- images.d.ts 에 declare module 추가
declare module "*.webp"- png에서 webp로 변환에 따른 파일 용량 변화
- 
이미지 크기(4100x2735)는 동일하나, 파일 용량이 10.7MB에서 382KB로 축소되었다.   
picture 태그를 사용하여 webp 미지원 브라우저에 fallback 제공
- picture 태그는 여러 이미지 리소스를 상황에 맞게 유연하게 지정할 수 있는 방법이다.
- <picture>태그 내부에- <source>와- <img>태그를 넣는다.
- <source>태그는 기본 제공될 이미지를 지정하고, 브라우저가 해당 이미지를 지원하지 않으면, fallback으로서- <img>태그에 지정한 이미지가 제공된다.
- 예시: webp 기본 제공 후 미지원 브라우저에서는 jpeg 제공
<picture>
	<source type="image/webp" srcSet={heroImageWebp} />
	<img className={styles.heroImage} src={heroImageJpeg} alt="hero image" />
</picture>이미지 크기 적절하게 설정하기
- 라이트하우스 감사 결과, WebP 형식으로 압축하여 변환한 이미지가 여전히 이미지 크기(4100x2735)가 크다며, 적절하게 설정하여 절감할 것을 권장하고 있다
      
   
    
- 크롬 개발자 도구에서 해당 이미지 요소를 확인한 결과, 맥북 기준으로 최대 1534x690 정도의 이미지 크기만 차지하고 있었다. 따라서 기존의 이미지 크기에서 50% 가량 축소하는 것이 데이터 절감 및 이미지 퀄리티 유지 차원에서 적절할 것 같다.
      
   
    
- 이미지 크기 조절
- 
homebrew를 통해 imagemagick설치brew install imagemagick
- 
imagemagick을 통해 이미지 크기 조절하는 명령어// 파일 하나 변환 // macOS convert hero.webp -resize 50% hero_small.webp // windows magick convert hero.webp -resize 50% hero_small.webp// 디렉터리 내에서 png 확장자인 파일들의 변환 for file in *.png; do convert $file -resize 50% resized-$file; done // 디렉터리 내의 모든 파일 크기 변환 for file in image/*; do convert $file -resize 50% $file; done
- 
이미지 크기 조절 결과 - 이미지 크기가 절반인 1640x1094로 줄어들며 용량도 절반 가량인 107kb로 축소되었다.
 
이미지 압축(jpg, png)
- jpg
brew install jpegoptim
find . -name "*.jpg" -exec jpegoptim -m80 -o -p --strip-all {} \;- png
brew install optipng
find . -name "*.png" -exec optipng -o7 {} \;