# Vite

๋น„ํŠธ(Vite) (opens new window)๋Š” ๊ธฐ์กด์˜ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œ์ผœ์ค„ ์ƒˆ๋กœ์šด ํ”„๋ŸฐํŠธ์—”๋“œ ํˆด์ž…๋‹ˆ๋‹ค. Vue ์ฐฝ์‹œ์ž ์—๋ฐ˜ ์œ ๊ฐ€ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ ํ˜„์žฌ Vue, React, Svelte ๋“ฑ์˜ ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ฃผ๋ชฉํ•˜๊ณ  ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ํ”„๋ŸฐํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ๋“ค๊ณผ ์–ด๋– ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ์–ด๋–ค ๊ฒฝํ—˜์„ ์šฐ๋ฆฌ์—๊ฒŒ ์ œ๊ณตํ•ด์ฃผ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# Vite๋ž€?

๋น„ํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ (opens new window)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฐ๋ธŒ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ํ˜„๋Œ€ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์ƒํƒœ๊ณ„๋Š” ์›นํŒฉ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ์‹œ์Šคํ…œ์ด ๊ตฌ์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ๋น„ํŠธ์™€ ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ๋‚˜์™”์„๊นŒ์š”? ๊ทธ ์ด์œ ๋Š” ์›นํŒฉ์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์™œ ๋น ๋ฅธ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋ฒˆ๋“ค๋ง๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ๋ฒˆ๋“ค๋ง

์›นํŒฉ(Webpack) (opens new window), ๋กค์—…(Rollup) (opens new window), ํŒŒ์…€(Parcel) (opens new window)๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋‚˜์™”๋˜ ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“ˆํ™”์™€ ๊นŠ์€ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ๋˜ ESM(ECMAScript Modules)์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ๋ ˆ๋ฒจ์—์„œ์˜ ๋ชจ๋“ˆํ™” ๋ฐฉ์‹์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. require.js (opens new window) ์™€ ๊ฐ™์€ ๋ชจ๋“ˆ ๋กœ๋”๋‚˜ IIFE(Immediately Invoked Function Expression) (opens new window)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“ˆํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์ฃ . ์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ ˆ๋ฒจ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋งˆ์นจ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์— ๋ชจ๋“ˆํ™” ๋ฌธ๋ฒ•(import, export)์ด ๋“ค์–ด์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆํ™” ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ฃผ๊ฑฐ๋‚˜ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„๋กœ ๋ฌถ์–ด ์ฃผ๋Š” ๊ฒƒ์„ ๋ฒˆ๋“ค๋ง์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ํ˜„์žฌ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์ƒํƒœ๊ณ„์—์„œ๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ๋Œ€๋ถ€๋ถ„ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

# ESM(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ)

ESM์€ ๋ชจ๋“ˆํ™” ๋ฌธ๋ฒ•์ธ import, export๋ฅผ ๋ณ„๋„์˜ ๋„๊ตฌ ์—†์ด ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์—์„œ ์†Œํ™”ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์›นํŒฉ๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

// app.js
import { sum } from './math.js';

console.log(sum(10, 20));
<script src="./app.js"></script>

import-error

๊ธฐ์กด์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” import์™€ export๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด์ œ๋Š” script ํƒœ๊ทธ์— ์•„๋ž˜์™€ ๊ฐ™์ด type="module" ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<script type="module" src="./app.js"></script>

๋ธŒ๋ผ์šฐ์ €์—์„œ import์™€ export๋ฅผ ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ๋ฐ”๋กœ ESM์ž…๋‹ˆ๋‹ค.

# Vite ํŠน์ง•

๋น„ํŠธ๋Š” ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฒˆ๋“ค๋ง์„ ํ•˜์ง€ ์•Š๊ณ  ESM ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ์„œ๋ฒ„ ๊ตฌ๋™ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. 500๊ฐœ ์ •๋„ ๋˜๋Š” ๋ชจ๋“ˆ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ์›นํŒฉ ๋ฐ๋ธŒ ์„œ๋ฒ„ (opens new window)์™€ ๋น„ํŠธ๋กœ ๋น„๊ตํ•ด ๋ณธ๋‹ค๋ฉด ์‹คํ–‰ ์‹œ๊ฐ„์ด 20 ~ 30๋ฐฐ ์ด์ƒ ์ฐจ์ด๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ์›นํŒฉ ๋ฐ๋ธŒ ์„œ๋ฒ„๋Š” ์ฒ˜์Œ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ด€๋ จ ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ๋ฒˆ๋“ค๋ง ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์–ด๋Š ์ •๋„์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋น„ํŠธ๋Š” ๋ฒˆ๋“ค๋ง์„ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•จ๊ณผ ๋™์‹œ์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.

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

// vite.config.js
module.exports = defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/guide/en/#big-list-of-options
    }
  }
})

# Vite ์‹œ์ž‘ํ•˜๊ธฐ

๋น„ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

npm init vite@latest my-vite

๋ฆฌ์•กํŠธ, ๋ทฐ, ์Šค๋ฒจํŠธ ๋“ฑ ์›ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

TIP

๋น„ํŠธ๋Š” Node.js ๋ฒ„์ „ 12 ์ด์ƒ (opens new window)์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.