트리쉐이킹
트리 쉐이킹이란?
- 사용되지 않는 코드를 제거하여 최적화 기법
- 트리 쉐이킹이 가능한 정도는 앱과 앱에서 사용하고 있는 디펜던시 및 설계 구조에 따라 다름
how?
-
현재 애플리케이션에서 번들러로 webpack을 사용하고 있으므로 webpack을 사용하여 트리쉐이킹 진행
-
require
대신import
사용- webpack 버전2부터 ES6의
import
구문이 사용된 파일에 대하여 사용하지 않는 모듈의 export를 감지하는 기능을 제공
- webpack 버전2부터 ES6의
-
package.json
에서sideEffects
설정- webpack 버전 4 부터는 제공
sideEffects: flase
: 사용되지 않는 모듈을 삭제하여도 사이드이펙트가 없는 경우sideEffects: [sideEffects가 있을것 같은 파일 path]
: 배열 안에 있는 파일을 제외하고 트리쉐이킹 진행.
적용
Application
default 설정 (418.34KB → 405.51KB)
- default 설정과 함께 export (418.34KB)
- default 없이 export (405.51KB)
- 조직별로 리소스를 모듈화하여 사용하고 있는데, 기본 조직의 정보가 default value로 설정되어있었음
- 다른 조직의 경우, 기본조직의 정보가 필요 없으므로 default value 설정 변경
- 기본조직 정보가 저장된 파일이 트리쉐이킹되어 번들 용량이 줄어듬
디펜던시
- CRA에서 공식적으로 추천하는 라이브러리인
explore-source-map
을 사용하여 빌드 사이즈 분석 - 용량을 많이 차지하고있는 라이브러리에 대해 tree shaking 진행
lodash
lodash 사용 (필요한 함수만 가져오기 60.35KB → 4.6KB)
import _ from ‘lodash’
(60.35KB)
import values from 'lodash/values'
(4.6KB)
lodash-es (필요한 함수만 가져오기 84.95KB → 3.65KB)
import _ from lodash-es
(84.95 KB)
import { values } from lodash-es
(3.65KB)
lodash
의 경우,import
구문을 사용하지않으므로(require
로 작성되어있음)import {values} from lodash
로는 최적화 할 수 없음lodash
나lodash-es
둘 다 필요한 모듈만 불러오는 경우, 최적화를 할 수 있음
crypto.js
필요한 함수만 가져오기 (51.13KB → 5.26KB)
import crypto from crypto
(51.13KB)
- (5.26KB)
crypto
도require
로 작성되어있으므로import cryptoEncHex from 'crypto-js/enc-hex
와 같은 방식으로 필요한 모듈을 불러옴
chart.js
-
용량이 커 트리쉐이킹을 시도하려 했으나, 라이브러리도
import
구문으로 작성되어있고, 이미 트리쉐이킹 된 것으로 확인됨
결론
ES6
문법을 사용하여 필요한 함수만 가져올 경우 트리쉐이킹이 잘 적용됨- 오래된 라이브러리인 경우 트리쉐이킹을 지원하지 않기도 함 (ex. moment)