ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2021.05.02] 웹 성능 최적화를 위한 Webpack Bundle Size 줄이기
    개발 블로깅/Improving Performance 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

     

    (작성중)

     

    반응형

    댓글

Designed by Tistory.