๋ฒ๋ค๋ง
์ฌ๋ฌ ๊ฐ์ ํ์ผ(Javascript, CSS ๋ฑ)์ ํ๋์ ํ์ผ๋ก ํฉ์น๋ ๊ฒ
Vite๋ก ๋ง๋ค์ด์ง ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Rollup, CRA๋ Webpack์ด๋ผ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ค.
ํจ๊ณผ
- HTTP ์์ฒญ์ ์๋ฅผ ์ค์ฌ ์๋ ํฅ์ (๋ชจ๋ javascript, css, ์ด๋ฏธ์ง ํ์ผ์ ํ๋์ ํ์ผ์ด๋ ์ฌ๋ฌ ํ์ผ๋ก ๊ฒฐํฉํจ)
- ์ฝ๋๋ฅผ ์์ถํด ํ์ผ ํฌ๊ธฐ ์ถ์ (๋ถํ์ํ ๊ณต๋ฐฑ, ์ฃผ์ ๋ฑ์ ์ ๊ฑฐํ๊ณ ๋ณ์๋ช ์ ๋จ์ถํจ)
- ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํด ์ต์ ํ (Tree shaking์ผ๋ก dead code ์ ๊ฑฐ)
package.json์์ build ํญ๋ชฉ์ ์ฐพ์๋ณผ ์ ์๋๋ฐ, ์ด build์๋ ๋ฒ๋ค๋ง ๊ณผ์ ์ด ํฌํจ๋์ด ์๋ค.
์ด์ ์ ์ค์ตํ๋ https://hydeveloper.tistory.com/210์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํด ๋ดค๋ค.
ํฐ๋ฏธ๋๋ก npm run build๋ฅผ ์คํํด ๋ณด๋ฉด ์๋ ์์๋ dist ํด๋๊ฐ ์๊ธด ๊ฒ์ ๋ณผ ์ ์๋ค
์๋๋ jsx ํ์ผ๋ค๋ ํ๋์ js ํ์ผ๋ก ํฉ์ณ์ ธ์ ์ถ๋ ฅ๋๋ค๋๋ฐ ๋๋ jsxํ์ผ์ ๊ฐ์ ๊ทธ๋๋ก 5๊ฐ๊ฐ ๋์ค๊ธธ๋ ์์ง... ํ์๋๋ฐ
๋ฐ๋ก ์ด์ ์ lazy๋ฅผ ์ฌ์ฉํด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ js ํ์ผ๋ก ๋ถํ ํด ์ค ๊ฑฐ๋ค... ์ด๋ฅผ ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ผ๊ณ ํ๋ค.
์ฝ๋ ์คํ๋ฆฌํ (Code Splitting)
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ
ํจ๊ณผ
- ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์
=> ๋ฒ๋ค๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์์ถํ๋๋ฐ, ์ด๋ ํฉ์ณ์ง๋ฉด์ ์ฝ๋๊ฐ ์ปค์ง๋ ๊ฒ์ ์ด์ฉ ์ ์์
=> ์ฝ๋์คํ๋ฆฌํ ์ผ๋ก ์ด๊ธฐ ๋ก๋ฉ ์ ํ์ํ ์ฝ๋๋ง ๋ถ๋ฆฌํด ๋จผ์ ์ ์กํด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ - ๋ถํ์ํ ์ฝ๋ ๋ก๋๋ฅผ ๋ฐฉ์ง (์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ ์ฐ์ด๋ ์ฝ๋๋ ๋ก๋๋๋ ๊ฒ์ ๋ฐฉ์ง, lazy๋ฅผ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ !)
- ๋ฐ์ดํฐ ๋น์ฉ ์ ๊ฐ ํจ๊ณผ (์ชผ๊ฐ์ ํ์ํ ๋ถ๋ถ๋ง ์ ์กํ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๋น์ฉ์ด ์ ๊ฐ)
์ ๋ฒ ๊ธ์์ ์์ ํ lazy์ Suspense๋ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์คํ๋ฆฌํ ์ ํด์ฃผ๋ ๋ํ์ ์ธ ์ฝ๋ ์คํ๋ฆฌํ ๋ฐฉ๋ฒ์ด๋ค.
์ปดํฌ๋ํธ ๋ฟ๋ง์ด ์๋ ๋ค๋ฅธ ์ฝ๋๋ ์คํ๋ฆฌํ ์ ํด์ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ์ค์ ์ ์์ ํด์ฃผ๋ฉด ๋๋ค.
vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
})
์ด๊ธฐ์ vite.config.js์ด๋ค. react๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ด์ฉ ์ธ์๋ ๋ณ ๋ค๋ฅธ ๋ด์ฉ์ ์๋ค.
+ ์ค์ ์ถ๊ฐ
export default defineConfig({
plugins: [react()],
// build ์์ฑ์ ๊ฐ์ฒด ์ ๋ฌ
build: {
// ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ(dist ํด๋)๋ฅผ docs/ ํด๋์ ์ ์ฅํ๊ฒ ๋ค
// ๊ธฐ๋ณธ๊ฐ์ด dist์ธ๋ฐ, docs๋ก ์ค์ ํ์ผ๋ฏ๋ก ์ด์ docs ํด๋์ ์์ฑ๋จ
outDir: 'docs',
// Vite์์๋ Rollup์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ด rollupOptions
rollupOptions: {
output: {
// chunks๋ ๋ฉ์ด๋ฆฌ๋ผ๋ ๋ป์ผ๋ก, ์ฌ๊ธฐ์๋ ๋ฒ๋ค์ ์๋ฏธ
manualChunks: (id) => {
if (id.indexOf('node_modules') !== -1) {
const module = id.split('node_modules/').pop().split('/')[0];
return `vendor-${module}`;
}
},
},
},
},
});
rollupOptions.output.manualChunks : ์ฝ๋ ๋ถํ ์ ๋ต์ ์ง์ ์ ์ดํ๋ ๋ถ๋ถ
manualChunk : ์ด๋ค ํ์ผ์ ์ด๋ค chunk(๋ฒ๋ค)๋ก ๋ถ๋ฆฌํด ์ ์ฅํ ์ง ์ง์
// ๋ชจ๋ ๋ชจ๋์ ๊ฒฝ๋ก id๋ฅผ ํ์ธ
manualChunks: (id) => {
// ๋ง์ฝ node_modules ๋ด์ ์๋ ํ์ผ์ด๋ผ๋ฉด
if (id.indexOf('node_modules') !== -1) {
// ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ node_modules/๋ค ๊ฒฝ๋ก๋ง ์ถ์ถ
// pop() : ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๊บผ๋
// split('/') : ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํด๋ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ
// [0] : ์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ๋ง ์ถ์ถ
const module = id.split('node_modules/').pop().split('/')[0];
// chunk์ ์ด๋ฆ์ vendor-${module}๋ก ๋ฆฌํด
return `vendor-${module}`;
}
}
๊ธ๋ก๋ง ์จ๋์ผ๋ ๋ญ์๋ฆฐ์ง ํ๋๋ ๋ชจ๋ฅด๊ฒ ์ด์ ์๋ ์์๋ฅผ ๊ฐ์ ธ์๋ค...
์ด๋ฌํ id๊ฐ์ด ์๋ค.
id = '/project/node_modules/react/index.js';
1. id.split('node_modules/')
'node_modules/'๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋๋ ์ ๋ฐฐ์ด ์์ฑ
[
'/project/',
'react/index.js'
]
2. .pop()
๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๊บผ๋
'react/index.js'
3. split('/')[0]
์ฌ๋์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ
['react', 'index.js']
[0]๋ฒ ์์๋ฅผ ์ถ์ถ => ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ!
'react'
4. return `vendor-${module}`;
return `vendor-${module}`; // => 'vendor-react'
์๋ฌดํผ ์ด๋ ๊ฒ ์ค์ ์ ๋ง์ณค์ผ๋ ๋น๋๋ฅผ ํด๋ณด๋ฉด...
์ด๋ ๊ฒ ๋น๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ ๋น๋์ ๋น๊ตํด๋ณด๋ฉด...
์๋๋ index~~~.js๊ฐ 166kb์๋๋ฐ ์ค์ ์์ ๋ชจ๋์ ์คํ๋ฆฌํ ํ ํ์๋ index.js๊ฐ 3.39kb ์ ๋๋ก ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค ์ด์ด vite.config.js์ ์ค์ ํ ๋๋ก vender-๋ชจ๋์ด๋ฆ์ผ๋ก ์์ฑ๋ ํ์ผ๋ค์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ์คํ๋ฆฌํ ์ ํ๋ฉด ๋ชจ๋๋ค๋ ์ฌ์ฉํ๋ ๊ณณ์์ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํด ์ต์ ํํด์ค ์ ์๋ค.
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React / Next.js (2) | 2025.04.29 |
---|---|
React / Debounce, Throttle (0) | 2025.04.24 |
React / lazy, Suspense (1) | 2025.04.24 |
React / React Developer Tools (0) | 2025.04.24 |
React / ์ต์ ํ ํจ์ (0) | 2025.04.23 |