Webpack 3로 마이그레이션하며 겪은 빌드 최적화
배경
회사 프로젝트의 빌드 시간이 느려지면서 Webpack 3 마이그레이션을 진행했다. 주요 목표는 번들 사이즈 감소와 빌드 속도 개선이었다.
Scope Hoisting 적용
Webpack 3의 가장 큰 변화는 Scope Hoisting이다. 기존에는 모듈마다 함수로 감싸졌는데, 이제 가능한 경우 하나의 스코프로 합쳐진다.
// webpack.config.js
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.optimize.ModuleConcatenationPlugin()
]
};
이것만으로 번들 사이즈가 12% 정도 줄었다.
CommonsChunkPlugin 재설정
벤더 번들 분리 전략도 수정했다.
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function(module) {
return module.context && module.context.includes('node_modules');
}
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
})
]
manifest 청크를 별도로 분리해 vendor 파일의 해시가 코드 변경마다 바뀌는 문제를 해결했다.
UglifyJS 옵션 조정
프로덕션 빌드에서 UglifyJS 옵션을 더 공격적으로 설정했다.
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_console: true,
collapse_vars: true,
reduce_vars: true
},
sourceMap: true
})
결과
- 번들 사이즈: 1.2MB → 1.02MB (약 15% 감소)
- 빌드 시간: 42초 → 38초
- 브라우저 파싱 시간도 체감상 개선됨
마이그레이션 자체는 breaking change가 거의 없어서 반나절 만에 완료했다. Scope Hoisting의 효과가 생각보다 좋았다.