๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / ๋ฒˆ๋“ค๋ง, ์ฝ”๋“œ์Šคํ”Œ๋ฆฌํŒ…

๋ฒˆ๋“ค๋ง

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ(Javascript, CSS ๋“ฑ)์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์น˜๋Š” ๊ฒƒ

Vite๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ Rollup, CRA๋Š” Webpack์ด๋ผ๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํšจ๊ณผ

  • HTTP ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ์ค„์—ฌ ์†๋„ ํ–ฅ์ƒ (๋ชจ๋“  javascript, css, ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด๋‚˜ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๊ฒฐํ•ฉํ•จ)
  • ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•ด ํŒŒ์ผ ํฌ๊ธฐ ์ถ•์†Œ (๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ, ์ฃผ์„ ๋“ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ณ€์ˆ˜๋ช…์„ ๋‹จ์ถ•ํ•จ)
  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์ตœ์ ํ™” (Tree shaking์œผ๋กœ dead code ์ œ๊ฑฐ)

 

package.json

 

package.json์—์„œ build ํ•ญ๋ชฉ์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด build์—๋Š” ๋ฒˆ๋“ค๋ง ๊ณผ์ •์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

์ด์ „์— ์‹ค์Šตํ–ˆ๋˜ https://hydeveloper.tistory.com/210์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด ๋ดค๋‹ค.

ํ„ฐ๋ฏธ๋„๋กœ npm run build๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์›๋ž˜ ์—†์—ˆ๋˜ dist ํด๋”๊ฐ€ ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

๋นŒ๋“œ๊ณผ์ • / ๋นŒ๋“œ ํ›„ ์ƒ์„ฑ๋œ dist ํด๋” / 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'

 

 

์•„๋ฌดํŠผ ์ด๋ ‡๊ฒŒ ์„ค์ •์„ ๋งˆ์ณค์œผ๋‹ˆ ๋นŒ๋“œ๋ฅผ ํ•ด๋ณด๋ฉด...

 

๋นŒ๋“œ ๋!

 

์ด๋ ‡๊ฒŒ ๋นŒ๋“œ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ „ ๋นŒ๋“œ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด...

 

 

vite.config.js ์„ค์ • ์ „ / ์„ค์ • ํ›„

 

 

์›๋ž˜๋Š” 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