[Vite] Code Splitting ์ ๋ต - ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํํ๊ธฐ(manualChunks)
๐ ๋ค์ด๊ฐ๋ฉฐ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง์๋ก ๋ฒ๋ค ํฌ๊ธฐ๋ ํจ๊ป ์ปค์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ฃ .
Vite์์ ์ ๊ณตํ๋ Code Splitting ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํด๋น ๊ธ์์๋ manualChunks์ ๋ํด์๋ง ๋ค๋ฃน๋๋ค.
์ Code Splitting์ด ํ์ํ ๊น?
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ฉด ๋ชจ๋ Javascript ์ฝ๋๊ฐ ํ๋์ ํฐ ํ์ผ๋ก ๋ฒ๋ค๋ง ๋ฉ๋๋ค.
ํ์ง๋ง ์ด ์ํฉ์ ์๋ ๋ฌธ์ ๋ค์ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ๊ธด ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ: ์ฌ์ฉ์๊ฐ ์ฒซ ํ์ด์ง๋ฅผ ๋ณด๊ธฐ ์ ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
- ๋ถํ์ํ ๋ฆฌ์์ค ๋ญ๋น: ๋น์ฅ ํ์ํ์ง ์์ ์ฝ๋๋ ํจ๊ป ๋ถ๋ฌ์ต๋๋ค.
- ๋นํจ์จ์ ์ธ ์บ์ฑ: ์์ ์ฝ๋ ๋ณ๊ฒฝ์๋ ์ ์ฒด ๋ฒ๋ค์ ๋ค์ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ: ๋ถํ์ํ ์ฝ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ์ ํ ๋ถํ ํ ํ์๊ฐ ์์ต๋๋ค. ํนํ
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝ๋์ ๊ทธ๋ ์ง ์์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ
- ํน์ ํ์ด์ง์์๋ง ํ์ํ ์ฝ๋๋ ํด๋น ํ์ด์ง ์ ์ ์์๋ง ๋ถ๋ฌ์ฌ ์ ์๋๋ก.
- ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ณ๋์ ์ฒญํฌ๋ก ๋ถ๋ฆฌ
๋ฑ ํ๋ก์ ํธ ์ํฉ์ ๋ง๊ฒ ๊ธฐ์ค์ ์ธ์ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ทธ๋์ ๋๋ ์ manualChunks๊ฐ ํ์ํ๋๊ฐ?
์ด๋ฏธ ํ๋ก์ ํธ์ lazy Loading, Dynamic Import ๊ธฐ๋ฒ ๋ฑ ํ์ํ ๋ถ๋ถ์ ๋ํด์ ์ ์ฉ๋ ์ํ์์ต๋๋ค๋ง..
์ ์ด๋ฏธ์ง๋ build ๋ ํ์ผ๋ค์ ๊ฒฐ๊ณผ์ ๋๋ค.
์ ค ํ๋จ์ index.js๋ฅผ ๋ณด์๋ฉด ์ฉ๋์ด 3MB ์ด๊ณผํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ ๊ฐ ๋ด๋นํ ํ๋ก์ ํธ ํน์ฑ์ ํ ํ์ด์ง์ ๋ง์ ๊ธฐ๋ฅ์ ๋ด๋นํ ์๋ฐ์ ์๋ ๊ตฌ์กฐ์ด๊ณ , ์ ์ผ ๋ง์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํ์ด์ง์ด๊ธด ํ์ผ๋,
๋ถํ์ํ๊ฒ ์ฉ๋์ด ํฌ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์์์ ์ธ๊ธํ ๋ฌธ์ ๋ค์ ๊ฒช๋ ์ํฉ์ ๋ง์ดํ๊ฒ ๋ฉ๋๋ค.
manualChunks๋?
manualChunks๋ Vite(์ค์ ๋ก๋ Rollup)์์ ์ ๊ณตํ๋ ์ฝ๋ ๋ถํ ๊ธฐ๋ฅ์ ๋๋ค.
๋น๋ ์์ ์ ์ด๋ค ๋ชจ๋๋ค์ ํ๋์ ์ฒญํฌ๋ก ๋ฌถ์์ง ์ง์ ์ ์ดํ ์ ์๊ฒ ํด ์ฃผ์ฃ .
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์๊ฐํด ๋ด ์๋ค.
- React์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ํ๋์ ํ์ผ๋ก
- UI ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ ๋ค๋ฅธ ํ์ผ๋ก
- ์ฉ๋์ด ํฌ๊ณ ์ ๋ณํ์ง ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํ์ผ๋ก
- ๋๋จธ์ง node_modules๊ฐ ๋ณ๋์ ํ์ผ๋ก
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด manualChunks๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค. ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor';
}
}
}
}
})
ํ์ฌ ํ๋ก์ ํธ์ ์์ ๊ฐ์ด ์ค์ ์ ํ๊ณ build๋ฅผ ํ๊ฒ ๋๋ฉด ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋ ๊น์?
node_modules๊ฐ ํฌํจํ๊ณ ์๋ ๊ฒ๋ค์ vender.js์ ๋ชจ๋ ํฌํจ๋์์ต๋๋ค!
๊ธฐ์กด์ ์ ์ผ ํฐ ์ฉ๋์ ์ฐจ์งํ๋ index.js์ ํฌ๊ธฐ๋ ์ด์ ๋ณด๋ค ์ฝ 71%๊ฐ ๊ฐ์๋์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ผ์ด๋ด์ index.js์ ์ฉ๋ ์์ฒด๋ ๊ฐ์ ๋์์ผ๋, ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ ์์ต๋๋ค.
node_modules๊ฐ ํฌํจํ๊ณ ์๋ ๊ฒ๋ค์ ๋ํด์ ํ๋์ ํ์ผ๋ก ๋ฌถ์ด ๋ฒ๋ฆฌ๊ฒ ๋๋ฉด, ๋ง์ฝ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ๋ ์์ ๋๊ณ build๋ฅผ ํ๊ฒ ๋๋ฉด vendor.js๊ฐ ์๋กญ๊ฒ ์์ฑ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ฌ์ฉ์ ์ ์ฅ์์ ํฐ ์ฉ๋์ ๊ฐ์ง๊ณ ์๋ vendor.js์ ๋ํด์ ์๋กญ๊ฒ ๋ค์ด๋ก๋๋ฅผ ํ๊ฒ ๋๊ฒ ์ฃ .
์ฆ, ์์ ๋ณ๊ฒฝ์๋ ํฐ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ฒ ๋๋ ์ํฉ์ ๋๋ค.
๋น์ฅ ํ์ํ์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฒ์๋ถํฐ ๋ก๋๋๊ณ , ์บ์ ํ์ฉ ํจ์จ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
๊ฐ์ ๋ Code Splitting ์ ๋ต
๊ทธ๋ผ ์ด๋ป๊ฒ ์กฐ๊ธ ๋ ๊ฐ์ ํ ์ ์์๊น์?
๋ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ๋ค๋ฉด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ฑ์ ๋ฐ๋ผ chunks๋ฅผ ๋๋ ์ ์์ต๋๋ค.
์ฆ, ๋จ์ํ node_modules๋ง ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์๋ถํฐ๋ ํ๋ก์ ํธ ํน์ฑ์ ๋ง์ถฐ์ ๊ธฐ์ค์ ์ ์ธ์์ผ ํฉ๋๋ค.
์ ๋ ๊ทธ๋์ ์ฐ์ vite-bundle-visualizer ๋ฅผ ์ด์ฉํ์ฌ ์ฉ๋์ด ์๋์ ์ผ๋ก ํฌ๊ณ ์ ๋ณํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ถํฐ ๋ถ๋ฆฌ๋ฅผ ํด๋ดค์ต๋๋ค.
- pdf ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- lottie ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊ฐ ์ฉ๋์ ํฌ๊ฒ ์ฐจ์งํ๋๋ผ๊ณ ์.
๊ทธ๋ฆฌ๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ๋ฐ์ดํธํ๋ ๋ฑ์ ์ํฉ์ด ๊ฑฐ์ ์ผ์ด๋์ง ์์์ ์ฐ์ ์ ์ฉํด ๋ณด์์ต๋๋ค.
๊ธฐ์กด ๋งค์ฐ ํฐ vendor์ ๋ํด์๋ ์ฒญํฌ ๋ถํ ์ด ๋์์ต๋๋ค.
์ฝ 2MB ์ ๋ ๊ฐ์๋์๋ค์.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์๋ฅผ ๋ค์ด, pdf๊ฐ ํ์ํ ์ํฉ์๋ง ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐ๋ก React ์์กด์ฑ๋ง ๋ฌถ๋๋ค๋์ง, UI ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ๋ฌถ๋ ๋ฑ์ ๊ธฐ์ค์ ์ธ์ธ ์ ์๊ฒ ์ฃ ?
์ด ๋ฐฉ์์๋ ์ฃผ์ํ ์ ์ด ๋ช ๊ฐ์ง ์์ต๋๋ค.
- ์ฒญํฌ๊ฐ ๋ง์์ง์๋ก ๋ณ๋ ฌ HTTP ์์ฒญ๋ ์ฆ๊ฐํฉ๋๋ค.
- ๋คํธ์ํฌ ์ํ๊ฐ ์ข์ง ์์ ํ๊ฒฝ์์๋ ์คํ๋ ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
๊ทธ๋์ ์์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ, ๊ธฐ์ค์ ๋ช ํํ๊ฒ ์ธ์ฐ๊ณ ์ฒญํฌ ๊ตฌ์ฑ์ ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํฉ๋๋ค.
ํ๋ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณผ๊น์?
์๋๋ ์์์ ๋๋ค.
manualChunks๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์์ ๋:
build/
โโโ index.12345.js # ๋ชจ๋ ์ฝ๋๊ฐ ํ๋์ ํ์ผ (์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ + ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด) (7,200kb | gzip: 2,100kb)
๋จ์ํ node_modules๋ง ๋ถ๋ฆฌํ์ ๋:
build/
โโโ index.1234.js # ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ (920kb | gzip: 268kb)
โโโ vendor.5678.js # ๋ชจ๋ node_modules ๋ผ์ด๋ธ๋ฌ๋ฆฌ (4,994kb | gzip: 1,448kb)
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณ๋ก ๋ถ๋ฆฌํ์ ๋:
build/
โโโ index.1234.js # ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ (920kb | gzip: 268kb)
โโโ lottie-lib.abc.js # lottie ๊ด๋ จ (600kb | gzip: 150kb)
โโโ pdf-lib.def.js # PDF ๊ด๋ จ (1,000kb | gzip: 343kb)
โโโ common-vendor.ghi.js # ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (3,000kb | gzip: 1,000kb)
โโโ ... # ๊ธฐํ ํ์ผ
์ด๋ฐ ์์ผ๋ก ๋ถ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
๊ฒฐ๋ก
์์ ์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ด์.
Code Splitting์ ๊ฐ๋ ฅํ ์ฑ๋ฅ ์ต์ ํ ๋๊ตฌ์ง๋ง, ํ๋ก์ ํธ์ ํน์ฑ์ ๋ง๊ฒ ์ ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ ๋๋ ๋ฒ๋ค ๋ถ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ต์ ์ ๋ถํ ์ ๋ต์ ์ฐพ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
๊ทธ๋ฆฌ๊ณ manualChunks์๋ง ์์กดํ๋ ๊ฒ์ด ์๋, ์ ์ ํ ์ฝ๋ ์คํ๋ฆฌํ ์ด ์ ์ฉ ๋์ด ์๋ค๋ฉด ๋ ํฐ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
manualChunks ํ๋ฒ ์ ์ฉํด ๋ณด์ธ์!