Webpack 3 CommonsChunkPlugin으로 번들 최적화하기
문제 상황
회사 프로젝트의 빌드 결과물이 2.3MB를 넘어가면서 3G 환경에서 초기 로딩이 10초 이상 걸리는 이슈가 발생했다. React, Lodash, Moment 등 라이브러리가 매번 함께 번들링되고 있었다.
CommonsChunkPlugin 적용
Webpack 3에서 제공하는 CommonsChunkPlugin을 사용해 vendor 청크를 분리했다.
module.exports = {
entry: {
app: './src/index.js',
vendor: ['react', 'react-dom', 'lodash', 'moment']
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: Infinity
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
})
]
};
manifest 청크 분리 이유
vendor만 분리하면 webpack runtime이 vendor에 포함되어, 앱 코드 변경 시 vendor의 해시값도 변경되는 문제가 있었다. manifest 청크로 runtime을 별도 분리하니 vendor 캐싱이 제대로 동작했다.
결과
- app.js: 2.3MB → 800KB
- vendor.js: 1.2MB (캐싱 가능)
- manifest.js: 5KB
초기 로딩은 여전히 2MB지만, 이후 배포에서는 app.js만 다시 받으면 되어 사용자 경험이 개선되었다. 다음은 dynamic import로 route별 code splitting을 적용해볼 예정이다.