Vite๋Š” ์™œ ๋น ๋ฅผ๊นŒ, ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ฆฌ

@choi2021 ยท January 23, 2023 ยท 8 min read

๐Ÿ™„ Vite๋ฅผ ์‚ฌ์šฉํ•œ ๊ณ„๊ธฐ

CRA(Create React App)๋Š” ๋ฆฌ์•กํŠธ์—์„œ ๊ณต์‹์ ์œผ๋กœ ๋ฐ€์–ด์ฃผ๋Š”(?) ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ์ด๋‹ค. ๊ธฐ์กด์— ์ž˜ ์‚ฌ์šฉํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์—… ๊ณผ์ œ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์ง€๋งŒ, ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ๊ต์œก์„ ๋ฐ›์œผ๋ฉฐ CRA๋ณด๋‹ค ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅธ Vite๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค๋Š” ๋ฉ˜ํ† ๋‹˜์˜ ์ด์•ผ๊ธฐ๊ฐ€ ๋– ์˜ฌ๋ผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค. Vite๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์‹ค์ œ ๋นŒ๋“œ์†๋„์™€ dev ์„œ๋ฒ„๊ฐ€ ์ผœ์ง€๋Š” ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ง์ ‘ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ Vite๊ฐ€ ๊ธฐ์กด์˜ CRA๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ์žˆ์„์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

โ“ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—†๋Š” ๊ฒƒ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ž์ฒด์ ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์—†๋‹ค. ๋‹น์‹œ์— ์ž‘์€ ํ”„๋กœ์ ํŠธ์— ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์ด ์—†์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์™”๋˜ ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์ด Common JS๋ฐฉ์‹์œผ๋กœ require๊ณผ module.export๋กœ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๊ฒฐํ–ˆ๊ณ , npm์„ ํ†ตํ•ด์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋ชจ๋“ˆ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋“ค์„ ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์ฒด ๋ชจ๋“ˆ์˜ ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๋“ค์„ ๋ฐ›์•„์˜ค๋‹ค ๋ณด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ž์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋Š” ์–ด๋ ค์›€์ด ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๊ณ , ์–ธ์ œ ์–ด๋–ค ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ์ง€์— ๋”ฐ๋ฅธ ์‹œ์ ์˜ ๋ฌธ์ œ์ ๋„ ๋ฐœ์ƒํ–ˆ๋‹ค.

โ— ๋ฒˆ๋“ค๋Ÿฌ ๋“ฑ์žฅ

๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฒˆ๋“ค๋Ÿฌ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๋งŒ์„ ๊ฐ€์ ธ์™€ ๊ธฐ์กด์˜ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์™”๋˜ ์šฉ๋Ÿ‰ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ JS ํŒŒ์ผ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ์˜ ์ˆœ์„œ์™€ ์–ธ์ œ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ๋™์‹œ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฒƒ์€ ์•„๋งˆ Webpack์ด๋ผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ธฐ์กด์— ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ CRA๋Š” ๋ฐ”๋กœ ์ด Webpack์„ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. Webpack์€ ๋‹จ์ˆœํžˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์—ญํ•  ๋ฟ ์•„๋‹ˆ๋ผ HMR (Hot module Replacement), code splitting, CSS, HTML, asset ๋“ฑ ์ข…ํ•ฉ์ ์œผ๋กœ ์ง€์›ํ•ด์ฃผ๋Š” tool๋กœ ํ˜„์žฌ๊นŒ์ง€ ์•ˆ์ •์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. CRA๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ƒˆ๋กœ ๊ณ ์นจ ์—†์ด๋„ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜์˜๋˜๋Š” ์ ์ด webpack์˜ HMR ๊ธฐ๋Šฅ ๋•๋ถ„์ด๋ผ๋Š” ๊ฒƒ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ Webpack์˜ ๊ธฐ๋Šฅ์„ ์ข€ ๋” ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

webpack
webpack

๐Ÿ“Œ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฌธ์ œ์ ๊ณผ ES Build์˜ ๋“ฑ์žฅ

Webpack๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋“ฑ์žฅ์€ JS์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์†๋„์˜ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์—ฌ๋Ÿฌ JSํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ญ์ƒ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ–ˆ๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋งŽ์•„์ ธ ๋นŒ๋“œ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋„๊ตฌ๋กœ ES Build๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ES Build๋Š” ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ๋“ค์˜ ์†๋„๋ณด๋‹ค 100๋ฐฐ ์ด์ƒ ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„๋ฅผ ๊ฐ€์กŒ๋‹ค. ์ด๋ ‡๊ฒŒ ๋น ๋ฅธ ์†๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์œ ๋Š” JS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ๋“ค๊ณผ ๋‹ฌ๋ฆฌ Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ๋น ๋ฅธ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฒˆ๋“ค๋Ÿฌ๋กœ์จ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ HMR, code splitting๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์ด ์ข…ํ•ฉ์ ์œผ๋กœ ์ œ๊ณต๋˜๋˜ Webpack์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ES Build๊ฐ€ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์—ˆ๋‹ค.

esbuild
esbuild

โœจVite์˜ ๋“ฑ์žฅ

์›น์ด ๋ฐœ์ „ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์—์„œ ESM(ES Modules)์ด ์ถ”๊ฐ€๋œ๋‹ค. import์™€ export๋กœ ์ž‘์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆํ™” ๋ฐฉ์‹์„ ๋ฒˆ๋“ค๋Ÿฌ ์—†์ด <script type="module">์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. Go ์–ธ์–ด์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ๋†’์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„ ES Build์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ESM์„ ์ด์šฉํ•ด Vite๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

vite
vite

Vite๋Š” ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํฌ๊ฒŒ dependencies์™€ source code๋กœ ๊ตฌ๋ถ„ํ•ด, ๊ฐœ๋ฐœ ์‹œ์— ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š์„ dependency์˜ ์ฝ”๋“œ๋Š” ES Build๋กœ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์„ ํ•˜๊ณ , ๊ณ„์†ํ•ด์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” source code ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ESM์„ ์ด์šฉํ•ด์„œ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ESM์€ ์š”์ฒญ๋ฐ›์€ ๋ชจ๋“ˆ๋งŒ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ์„œ๋ฒ„์— ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

devserver
devserver

esm
esm

๋ฐฐํฌ ์‹œ์—๋Š” ESM์ด ๋™์ž‘ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋˜ JS๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฒ„์ „์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•œ๋‹ค. ๋นŒ๋“œ ์‹œ์— ์•„์ง ESBuild๊ฐ€ Code splitting, CSS์ฒ˜๋ฆฌ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ES Build ๋Œ€์‹ ์— Rollup์„ ์ด์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๐Ÿ˜ ์ •๋ฆฌํ•˜๊ธฐ

Vite๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œ์ถœํ•œ ํ•œ ๊ธฐ์—…์˜ ๋ฉด์ ‘์—์„œ CRA ๋Œ€์‹  Vite๋ฅผ ์ด์šฉํ•ด์„œ ๊ณผ์ œ๋ฅผ ํ•˜์…จ๋„ค์š”. Vite๊ฐ€ ์™œ CRA๋ณด๋‹ค ๋น ๋ฅธ์ง€ ์•„์‹œ๋‚˜์š”?๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค... ๊ธฐ์ˆ ์„ ์•Œ๊ณ  ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋„์ž…ํ•œ ๋ชจ์Šต์ด ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ์ด์ œ๋Š” ES Build์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ESM์„ ์ด์šฉํ•œ ๋ฒˆ๋“ค๋ง์œผ๋กœ ๊ธฐ์กด CRA์˜ WebPack๋ณด๋‹ค ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค๋ผ๊ณ  ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์–ด๋– ํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•ญ์ƒ ์™œ๋ฅผ ๋” ๊ณ ๋ฏผํ•ด๋ณด์ž.

[์ฐธ์กฐ]

@choi2021
๋งค์ผ์˜ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐœ๋ฐœ์ผ์ง€์ž…๋‹ˆ๋‹ค.