[최적화] 트리 쉐이킹(Tree Shaking)

rsuubinn·2023년 3월 30일
0

최적화

목록 보기
3/4

🌳 트리 쉐이킹(Tree Shaking)

: 나무를 흔들어 잔가지를 털어내듯 불필요한 코드를 제거하는 것을 의미한다.
다양한 라이브러리를 가져다 사용하게 되면 불필요한 코드를 그대로 가져가는 경우가 생각보다 많이 생긴다.
이런 불필요한 코드를 찾아내어 제거하면 웹 사이트 성능 최적화에 큰 도움이 된다.

1. JavaScript 파일의 크기

JavaScript 파일 크기의 증가, 요청 횟수의 증가는 그만큼 파일이 오고 가는 동안 화면 표시가 늦어진다는 것을 뜻하고, 네트워크 속도가 느린 환경에서는 더 큰 병목현상을 유발한다.
따라서 트리 쉐이킹을 통해 파일의 크기를 가능한 줄이는 것이 최적화에 도움이 된다.

2. JavaScript 파일의 실행 시간

JavaScript 파일이 실행되기 위해서는 여러 과정을 거치게 된다.
다운로드부터 필요한 경우에는 우선 요청을 보내어 파일을 다운받아 온 다음 압축을 해제해야 한다.
그 다음에는 JavaScript 코드를 파싱하여 DOM 트리를 생성한다.
파싱이 끝나면 컴파일하여 컴퓨터가 이해할 수 있는 언어로 바꿔줘야 한다.
이 컴파일 과정까지 거쳐야 비로소 코드를 실행할 수 있다.
이처럼 코드 실행까지 거쳐야 하는 과정이 많기 때문에 JavaScript는 다른 리소스에 비해 실행하기까지 상대적으로 많은 시간을 소모하게 된다.

실제로 JavaScript 파일의 크기가 커진 만큼, 파일의 실행 시간 또한 증가한 것을 알 수 있다.
실행 시간이 증가하면 사용자의 이탈률이 그만큼 커질 수 있다.
이러한 상황을 최대한 줄이기 위해서라도 트리 쉐이킹을 통한 최적화가 필요하다.

JavaScript 트리 쉐이킹

웹팩을 사용하는 환경에서 효과적으로 트리 쉐이킹을 수행하는 방법에 대해서 알아보자.

1. 필요한 모듈만 import 하기

import 구문을 사용해서 라이브러리를 불러와서 사용할 때, 라이브러리 전체를 불러오는 것이 아니라 필요한 모듈만 불러오면 번들링 과정에서 사용하는 부분의 코드만 포함시키기 때문에 트리 쉐이킹이 가능하다.

import { useState, useEffect } from "react"

2. Babelrc 파일 설정하기

Babel은 자바스크립트 문법이 구형 브라우저에서도 호환이 가능하도록 ES5 문법으로 변환하는 라이브러리이다.
이 때 ES5 문법은 import 를 지원하지 않기 때문에 commonJS 문법의 require 로 변경시키는데, 이 과정은 트리 쉐이킹에 큰 걸림돌이 된다.
requireexport 되는 모든 모듈을 불러오기 때문이다.
이를 방지하기 위해서 Babelrc 파일에 다음과 같은 코드를 작성해주면 ES5로 변환하는 것을 막을 수 있다.

{
  “presets”: [ 
    [
      “@babel/preset-env”,
      {
	    "modules": false
      }
    ]
 ]
}

반대로 modules 값을 true 로 설정하면 항상 ES5 문법으로 변환하므로 주의해서 작성하도록 한다.

3. sideEffects 설정하기

웹팩은 사이드 이펙트를 일으킬 수 있는 코드의 경우, 사용하지 않는 코드라도 트리 쉐이킹 대상에서 제외시킨다.

const crews = ['kimcoding', 'parkhacker']

const addCrew = function (name) {
  crews.push(name)
}

위 코드에서 addCrew 함수는 함수 외부에 있는 배열인 crews 를 변경시키는 함수이다.
해당 함수는 외부에 영향을 주지도 받지도 않는 함수, 순수 함수가 아니기 때문에 트리 쉐이킹을 통해 제외하는 경우 문제가 생길 수도 있다고 판단해 웹팩은 이 코드를 제외시키지 않는다.

이럴 때 package.json 파일에서 sideEffects 를 설정하여 사이드 이펙트가 생기지 않을 것이므로 코드를 제외시켜도 됨을 웹팩에게 알려줄 수 있다.

{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": false
}

혹은 아래와 같이 작성하여 특정 파일에서는 발생하지 않을 것임을 알려줄 수 있다.

{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": ["./src/components/NoSideEffect.js"]
}

4. ES6 문법을 사용하는 모듈 사용하기

트리 쉐이킹이 적용되지 않는 라이브러리가 있다면, 해당 라이브러리가 어떤 문법을 사용하고 있는지 확인해볼 필요가 있다.
모듈에 따라서 ES5로 작성된 모듈이 있을 수 있기 때문이다.
ES6 문법을 사용하는 모듈을 사용하면 해당 모듈에서도 필요한 부분만 import 해서 사용하지 않는 코드는 빌드할 때 제외되어 트리 쉐이킹에 유리하다.

profile
@rsuubinn

0개의 댓글