프로젝트의 최적화를 위해서 번들링 사이즈를 줄이고자 하였다. 그런데 한 파일에서 import는 되어있으나 사용하지 않는 경우도 빌드 시 번들링에 포함되었었다. 그래서 이 부분에 대해서 한 번 지피티와 대화하였다.
import { isConstructorDeclaration } from 'typescript'
이와 같이 선언하고 사용을 안해도 빌드 시에는 포함되어서 사이즈가 늘어난다는 것이다.
Tree-shaking의 경우에는 안쓰는 코드를 제거해서 번들 사이즈를 줄이는데, ESM은 잘된다.
ESM(ES Modules)은 태생적으로 정적(static) 구조 이기 때문이다.
import { foo } from './utils.js'
CommonJS는 반대로 동적(Dynamic)이라 분석이 어렵다
const utils = require('./utils')
그래서 또다른 예시로 lodash가 있는데, lodash-es 패키지를 활용해서 트리쉐이킹에 사용하기도 한다.
정적 : 미리 읽고 계획을 세울 수 있음
동적 : 실행해보기 전에는 뭘 쓸지 모른다.
엄청 와닿지는 않을 수 있지만, 프로젝트 개발을 하면서 안쓰는 것은 지우고, 모듈시스템에서 패키지들을 잘 관리하여 필요한 것들만 번들링할 수 있도록 점검하는 것이 좋을 것 같다.