최적화는 사용자 경험 향상과 더불어 기업의 비용 측면에서도 중요한 요소 입니다. 그래서 많은 채용 공고들에서 최적화 경험을 묻는 것이겠지요.
꾸준하게 최적화 방법들을 정리해보고 프로젝트에 적용하기 위한 체크리스트를 만들어 보도록하겠습니다.
Front-end 영역에서 개발의 비용 효율성을 최적화하는 방법은 매우 많습니다.
가장 효과적인 특정 기술과 접근 방식은 주어진 프로젝트의 특정 목표와 제약 조건에 따라 달라질 수 있습니다.
등등...
그중에서 이미지 최적화와 webpack 최적화 기법에 대해서 끄적여보겠습니다.
이후 React, lighthous, Network 최적화 방법들에 대해서도 정리해보는 시간을 가질 예정입니다.
WebP
WebP대신 다른 확장자를 사용해야할 경우
JPEG: 복잡하고 연속적인 톤 콘텐츠가 포함된 사진
PNG: 색상이 평평한 영역이나 투명한 배경이 있는 이미지
이전 웹 브라우저와의 호환성이 문제가 되는 경우
WebP는 모든 웹 브라우저에서 지원되지 않으므로 이전 브라우저 사용자가 웹 페이지나 애플리케이션에 액세스할 수 있어야 하는 경우 대신 JPEG 또는 PNG를 사용해야 하는 경우
이미지에서 투명도(알파 채널)를 지원해야 하는 경우
WebP는 투명도를 지원하지만 모든 웹 브라우저가 이 기능을 지원하는 것은 아니므로 이미지에 투명도가 중요한 경우 더 광범위하게 지원되는 다른 이미지 형식을 사용해야 하는 경우
이미지의 파일 크기나 성능이 주요 관심사가 아니거나 이미지 편집 및 기타 도구에서 보다 광범위하게 지원되는 이미지 형식을 사용해야 하는 경우
큰 이미지는 다운로드하는 데 시간이 오래 걸리고 더 많은 대역폭을 사용하므로 이미지를 사용할 웹 페이지 또는 애플리케이션에 적합한 크기로 이미지 크기를 조정하는 것이 중요
파일 크기와 이미지 품질 사이의 균형을 최적화하기 위해 적절한 압축 설정을 자동으로 적용할 수 있는 ImageOptim 또는 Kraken.io와 같은 도구를 사용할 수 있음
해상도가 낮은 기기에는 더 작고 최적화된 이미지를 제공하는 동시에 더 큰 화면과 고해상도 디스플레이를 사용하는 사용자에게는 고품질 환경을 제공함으로써 웹 페이지의 성능을 개선하는 데 도움이 될 수 있음
srcset 및 sizes속성 사용
<img src="default.jpg"
srcset="small.jpg 400w,
medium.jpg 800w,
large.jpg 1200w"
sizes="(max-width: 400px) 100vw,
(max-width: 800px) 50vw,
(max-width: 1200px) 33.3vw"
alt="My image">
srcset
: 사용할 수 있는 이미지의 세 가지 다른 버전(소, 중, 대)을 지정
w
descriptor: 이미지의 너비를 픽셀 단위로 나타냄
sizes
: 이미지가 서로 다른 화면 크기에서 차지하는 화면 너비를 지정
Webpack은 JavaScript 및 CSS 파일을 더 적은 수의 파일로 묶음으로써 웹사이트의 성능을 최적화할 수 있는 도구로, 웹사이트 로딩 시간을 개선할 수 있습니다.
Webpack을 사용하면 요청 시 로드할 수 있는 더 작고 집중된 번들로 코드를 분할할 수 있습니다. 이를 통해 웹 사이트의 초기 로드 시간을 줄이고 전반적인 성능을 향상시킬 수 있습니다.
module.exports = {
// other webpack options here
optimization: {
splitChunks: {
chunks: 'all',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
자세한 사항은 여기를 확인 해주세요.
splitChunks
옵션: 코드를 여러 번들로 분할하도록 구성
chunks
옵션: all
( 즉, 모든 코드가 별도의 청크로 분할)
minSize
옵션: 최대 사이즈 30000바이트로 설정 (이 크기보다 작은 청크는 분할되지 않는다.)
maxSize
옵션: 0(청크의 최대 크기가 없음을 의미한다.)
minChunks
, maxAsyncRequests
옵션: 모듈이 별도의 청크로 분할되기 전에 가져와야 하는 횟수를 제어한다.
automaticNameDelimiter
옵션: name생성된 청크의 이름을 지정하는 방법을 제어한다.
cacheGroups
옵션: webpack에서 다르게 처리할 수 있는 청크 그룹을 만들 수 있다.(이 예에서 vendors
캐시 그룹은 node_modules
디렉토리의 모든 모듈을 포함하도록 구성된다.)
priority
: 더 높은 우선 순위가 부여되어 이러한 모듈이 먼저 별도의 청크로 분할된다.
default
: 다른 모든 모듈을 포함하도록 구성되며 이러한 모듈을 여러 번 가져오는 경우에만 분할되도록 낮은 우선 순위가 지정된다.
번들에서 사용하지 않는 코드를 제거하여 크기를 줄이고 성능을 향상시킬 수 있는 webpack의 기능
module.exports = {
// other webpack options here
optimization: {
usedExports: true,
sideEffects: true
}
};
웹사이트가 총 번들 크기 및 로드 시간과 같은 성능 메트릭에 대한 특정 제한 내에서 유지되도록 하는 데 사용할 수 있는 일련의 지침으로, webpack의 성능 예산 기능을 사용하여 성능 예산을 집행하고 웹사이트의 성능을 유지할 수 있습니다.
module.exports = {
// other webpack options here
performance: {
hints: 'warning',
maxEntrypointSize: 1000000,
maxAssetSize: 500000
}
};
번들이 지정된 크기 제한을 초과하면 webpack이 경고를 생성
production mode에서는 축소 및 트리 쉐이킹과 같은 최적화가 가능하여 웹 사이트의 성능을 향상시킬 수 있습니다.