개발 블로깅/Improving Performance

[2021.05.02] 웹 성능 최적화를 위한 Webpack Bundle Size 줄이기

Hello이뇽 2021. 5. 2. 13:14

 

 

요즘 웹 페이지의 Build 최적화를 위해서 Bundle 사이즈를 줄이는 작업을 하는 중인데, 새롭게 알게 된 내용에 대해 정리해 보려고 한다.

 

# Webpack Bundle Analizer

Webpack Bundle Analizer를 이용하면 Build된 Bundle 파일의 상태를 아래처럼 시각화 하여 볼 수 있다.

 

우선 Chunk 파일을 어떻게 분리할지 Webpack에서 설정을 해주지 않으면, 기본 설정인 페이지 별로 Chunk 파일이 분리 되도록 되어있다. 하지만 이러한 방식은, 각 페이지에서 동일하게 사용되는 코드가 중복으로 들어가게 된다.

 

현재 내가 작업 중인 프로젝트의 Chunk를 확인해보면, 각 페이지 별로 Sentry 라이브러리를 사용하는데, 각 페이지의 Chunk 파일마다 Sentry 관련 요소가 포함되어 있는 것을 확인할 수 있다.

 

# Optimization SplitChunks

이 문제를 해결하기 위해서 중복되는 요소를 하나의 Chunk로 분리해서 사용하도록 해야한다. 
Webpack4부터 이 방식을 알아서 지원해주는 optimization.splitChunks.chunks를 이용하면, 중복되는 Chunk 요소를 줄여서 Bundle Size를 최적화 시킬 수 있다.

module.exports = {
  //...
  optimization: {
    splitChunks: {
      // include all types of chunks
      chunks: 'all',
    },
  },
};

 

 

chunks option은 아래와 같다.

  • initial: 기본 Chunk Spliting.
  • async: 비동기로 호출하는 요소 중 중복되는 부분을 Spliting.
  • all: 모든 코드의 중복되는 요소들을 확인하여 Spliting.

 

옵션은 3가지가 있지만, 그냥 all로 하면 된다..ㅋㅋ Webpack 공식 Doc에도 'all'을 쓰는 것을 권장하고 있다.

 

webpack.js.org/plugins/split-chunks-plugin/#splitchunkschunks
This indicates which chunks will be selected for optimization. When a string is provided, valid values are 
all, async, and initial. Providing all can be particularly powerful, because it means that chunks can be shared even between async and non-async chunks.

 

Optimization splitChunks 적용 결과

optimization.splitChunks.chunks를 적용 후 다시 Bundle 사이즈를 확인해보니, 관련있는 동일한 Chunk 요소들을 하나로 묶이면서 약 0.2MB 정도 줄어든 것을 확인할 수 있었다.

Webpack 내 Optionmization 설정에서 splitChunks 뿐 아니라 다른 설정 값들도 꽤나 있는데, 한번 쭉 봐보면서 번들 전략을 세우면 더 좋을 것 같다.

 

# Optimization Minimize

Webpack Doc에서는 Bundle 파일을 최소화 하는 것이라고 설명이 되어 있는데, 너무 이해가 되지 않아서 다른 블로그에 찾아보니 Bundle 파일을 압축하는 것이라고 한다.

const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
};

TerserPlugin을 이용한 압축방식이기 때문에, minimize를 설정을 위해서는 terser-webpack-plugin 모듈을 install 해야한다.

하지만, Webpack5부터는 해당 Plugin이 내장 지원이 되므로, 이를 생략할 수 있다.

module.exports = {
  optimization: {
    minimize: false,
  },
};

 

 

Optimization minimize 적용 결과

역시 압축이 짱인가...😦
전체 Bundle Size가 1MB 이하로 줄었다..

 

# Optimization Minimizer

 

(작성중)

 

반응형