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

๋– ์˜ค๋ฅด๋Š” ์ฐจ์„ธ๋Œ€ ๋นŒ๋“œ ํˆด Vite๋Š” ์™œ ๋น ๋ฅธ๊ฐ€?

by LasBe 2024. 1. 4.
๋ฐ˜์‘ํ˜•

๐Ÿ“’ Vite


๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ ํ”„๋ž‘์Šค์–ด๋กœ “๋น ๋ฅธ”์„ ์˜๋ฏธํ•˜๋Š” ๋น„ํŠธ๋Š” ์ฐจ์„ธ๋Œ€ ๋ฒˆ๋“ค๋Ÿฌ๋กœ์„œ ์ ์ฐจ ๋‘๊ฐ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด Webpack์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ณด์˜€๋˜ ๋‹ต๋‹ตํ•œ ๊ฐœ๋ฐœ์„œ๋ฒ„์™€ ๋ฒˆ๋“ค๋ง ์„ฑ๋Šฅ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋Œ์–ด์˜ฌ๋ฆฐ ๊ฒƒ์œผ๋กœ

์ ์  ์œ ๋ช…์„ธ๋ฅผ ํƒ€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•Œ์•„๋ณด์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ ๋ฒˆ๋“ค๋ง ์†๋„๋ฅผ ๋Œ์–ด์˜ฌ๋ ธ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋น ๋ฅธ Cold Start

CRA๋กœ ์ƒ์„ฑํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Webpack์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

Webpack์€ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ํ•˜๊ธฐ๋Š” ์ข‹์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ๋™์‹œ๊ฐ„์ด ์ง€๋ฃจํ•  ์ •๋„๋กœ ๊ธธ์–ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Š” ๋ฒˆ๋“ค๋Ÿฌ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•ด ํฌ๋กค๋ง ๋ฐ ๋นŒ๋“œ ์ž‘์—…์„ ๋งˆ์ณ์•ผ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์— ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ด์— ๋ฐ˜ํ•ด Vite๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆ์„ dependencies์™€ source code ๋‘ ๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • dependencies
    ๊ฐœ๋ฐœ ๋„์ค‘ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
    Vite๋Š” Go lang์œผ๋กœ ์ž‘์„ฑ๋˜์–ด Webpack ๋ณด๋‹ค ๋ฒˆ๋“ค๋ง ์†๋„๊ฐ€ 10~100๋ฐฐ ๋น ๋ฅด์ง€๋งŒ ์šด์˜ ํ”„๋กœ๋•ํŠธ ๋ฒˆ๋“ค๋ง ๋„๊ตฌ๋กœ์„œ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ESbuild๋ฅผ ๊ฐœ๋ฐœ์„œ๋ฒ„์— ์ ์šฉํ•จ์œผ๋กœ์จ ์—„์ฒญ๋‚œ ์†๋„์˜ ํ–ฅ์ƒ์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.
  • source code
    JSX, CSS ๋˜๋Š” Vue/Svelte ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋ง์ด ํ•„์š”ํ•˜๊ณ , ์ˆ˜์ • ๋˜ํ•œ ๋งค์šฐ ์žฆ์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
    Vite๋Š” Native ESM์„ ์ด์šฉํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    ES6์— ๋„์ž…๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ธ Native ESM์€ ๋ชจ๋“ˆ ์ž์ฒด๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๋ฒˆ๋“ค๋ง ํ–ˆ๋˜ ์ฝ”๋“œ๋“ค์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์ดˆ๊ธฐ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์‹ ์†ํ•œ HMR(Hot Module Replacement)

Webpack์œผ๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•  ๋•Œ ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ–ˆ์Œ์—๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ˆ˜์ •๋˜๊ธฐ ๊นŒ์ง€ ์ˆ˜ ์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๊ธฐ์–ต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •๋œ ๋ถ€๋ถ„์„ ์ฐพ๊ณ , ์ปดํŒŒ์ผ ํ•˜๊ณ , ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

Vite์—์„œ๋Š” ๋ฐ”๋กœ ์œ„์—์„œ ์„ค๋ช…ํ•œ Native ESM ๋•๋ถ„์— ์•ฑ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ ธ๋„ ๊ฐฑ์‹  ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋ชจ๋“ˆ์ด ์ˆ˜์ •๋˜์—ˆ๋‹ค๋ฉด Vite๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ์„ ๊ต์ฒด → ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜์ •๋œ ๋ชจ๋“ˆ ์š”์ฒญ → ๋ชจ๋“ˆ ์ „๋‹ฌ์˜ ๊ณผ์ •๋งŒ์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ ์†ํ•œ ๊ฐฑ์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ HTTP ํ—ค๋”๋ฅผ ์ด์šฉํ•ด ํ•„์š”์— ๋”ฐ๋ผ ์†Œ์Šค ์ฝ”๋“œ๋Š” 304 Not Modified๋กœ, ๋””ํŽœ๋˜์‹œ๋Š” Cache-Control: max-age=31536000,immutable์„ ์ด์šฉํ•ด ์บ์‹œ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๊ณผ์ •์„ ๊ฑด๋„ˆ ๋œ๋‹ˆ๋‹ค.

 

๊ณต์‹๋ฌธ์„œ์— ์žˆ๋Š” ๋‹ค์Œ ์‚ฌ์ง„๋“ค์„ ๋ณด๋ฉด ๋”์šฑ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Rollup์„ ์ด์šฉํ•œ ๋ฒˆ๋“ค๋ง

10~100๋ฐฐ ๋น ๋ฅธ ESbuild๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ API์˜ ํ˜ธํ™˜ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค๋ง์‹œ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ ์œ ์—ฐํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ API์™€ ์ธํ”„๋ผ๋ฅผ ๊ฐ€์ง„ Rollup์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”Ž ๋ฒˆ๋“ค๋ง ๋ฐฉ๋ฒ•

Rollup์€ ๋ฒˆ๋“ค๋ง ์‹œ Webpack๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  ์ฝ”๋“œ๋“ค์„ ๋™์ผํ•œ depth๋กœ ํ˜ธ์ด์ŠคํŒ… ํ•ด์„œ ํ•œ๋ฒˆ์— ๋ฒˆ๋“ค๋ง ํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

 

๋ชจ๋“  ์ฝ”๋“œ๋“ค์ด ๊ฐ™์€ depth์—์„œ ๋ฒˆ๋“ค๋ง ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋“ค์ด ์ถฉ๋Œ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒ ์ง€๋งŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์‹๋ณ„์ž๋ฅผ ๋ณ€๊ฒฝํ•ด ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์„ฑ๊ณผ ์†๋„ ๋‘๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์„ ๊ฐ๊ฐ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด ๋ณ€์ˆ˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” Webpack์— ๋น„๊ตํ•˜๋ฉด ์•ˆ์ •์„ฑ์€ ๋’ค๋–จ์–ด์ง‘๋‹ˆ๋‹ค.


๐Ÿ”Ž Tree Shaking

Tree Shaking์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

MDN์—์„œ๋Š” ES6์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ, ์ฆ‰ import/export ๋ฌธ๋ฒ•์— ์˜์กดํ•˜์—ฌ ์ฐธ์กฐ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ES6์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ๋งŒ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ES6 ๋ชจ๋“ˆ์— ํ•œํ•ด ํŒŒ์ผ ๋‹จ์œ„๋กœ๋งŒ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ์ด์šฉํ•˜๋Š” ES6 ๋ฌธ๋ฒ•์„ CommonJS๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ”๋ฒจ, ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์„ค์ • ๋“ฑ๋“ฑ ์ž˜ ๋˜์ง€๋„ ์•Š๋Š”๋ฐ ์„ค์ •์€ ๋˜ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— CommonJS ์ฝ”๋“œ๋ฅผ ES6 ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ–์ถ˜ Rollup์ด ๋” ๋›ฐ์–ด๋‚œ ํŠธ๋ฆฌ ์‰์ดํ‚น ์‹ค๋ ฅ์œผ๋กœ ๋” ์ž‘์€ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋งˆ๋ฌด๋ฆฌ

์œ„์—์„œ ์‚ดํŽด๋ณธ ๋‚ด์šฉ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์— ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ๋ฒˆ๋“ค๋ง์˜ ๋ถˆ์•ˆ์ •์„ฑ์€ ์ ์  ์ปค์ง€๊ฒŒ ๋˜์–ด “๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Webpack, ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์€ Rollup”์ด๋ž€ ๋ง์ด ์œ ํ–‰์ฒ˜๋Ÿผ ๋ฒˆ์กŒ์Šต๋‹ˆ๋‹ค.

 

Vite๊ฐ€ ๊ฐ๊ด‘์„ ๋ฐ›์œผ๋ฉฐ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ๋‹จ์œ„ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹ ์ค‘ํ•˜๊ฒŒ ๋„์ž…ํ•ด๋ณด๋ฉฐ ์ตํ˜€๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ