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

Vite(๋น ๋ฅด๋‹ค): ๋ชจ๋˜ ์›น ํ”„๋กœ์ ํŠธ์˜ ๋ฏธ๋ž˜

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2022. 11. 23.
728x90

Vite(๋น ๋ฅด๋‹ค): ๋ชจ๋˜ ์›น ํ”„๋กœ์ ํŠธ์˜ ๋ฏธ๋ž˜

Vite(๋น ๋ฅด๋‹ค)๋Š” ํ”„๋ž‘์Šค์–ด๋กœ "๋น ๋ฅด๋‹ค(Quick)"๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฐœ์Œ์€ "veet"์™€ ๋น„์Šทํ•œ /vit/์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ชจ๋˜ ์›น ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๋„ค์ดํ‹ฐ๋ธŒ ES Module์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ๊ฐœ๋ฐœ ์‹œ์— ํƒ์›”ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Vite์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ์ด์ ์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

1. ํ•ต์‹ฌ ์ฝ˜์…‰ํŠธ

Vite๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ฝ˜์…‰ํŠธ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1.1 ๋„ค์ดํ‹ฐ๋ธŒ ES Module ์ง€์›

Vite๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES Module์„ ๋„˜์–ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, Hot Module Replacement (HMR)๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ํšจ์œจ์ ์ธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: HMR ํ™œ์šฉ

// main.js
import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);

if (import.meta.env.DEV) {
  // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ HMR์„ ํ™œ์„ฑํ™”
  import.meta.hot.accept();
  import.meta.hot.dispose(() => {
    // ๋ชจ๋“ˆ์ด ๊ต์ฒด๋˜๊ธฐ ์ „์— ์‹คํ–‰ํ•  ๋กœ์ง
  });
}

app.mount('#app');

1.2 ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์ปค๋งจ๋“œ ์ง€์›

Vite๋Š” Rollup ๊ธฐ๋ฐ˜์˜ ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์ „์— ์„ค์ •๋œ ์„ค์ •์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: ๋นŒ๋“œ ์ปค๋งจ๋“œ ํ™œ์šฉ

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    // ์—ฌ๋Ÿฌ ์„ค์ • ์˜ต์…˜๋“ค...
  },
});

2. Vite์˜ ํ•ด๊ฒฐ์ฑ…

Vite๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์กด์˜ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

2.1 ๋ธŒ๋ผ์šฐ์ €์—์„œ ESM์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฌธ์ œ

์ด์ „์—๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ESM(ES Modules)์„ ์ง€์›ํ•˜๊ธฐ ์ „๊นŒ์ง€ JavaScript ๋ชจ๋“ˆํ™”๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ ˆ๋ฒจ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Vite๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜๋Š” ES Modules ๋ฐ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ JavaScript ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: ๋„ค์ดํ‹ฐ๋ธŒ ES Module ํ™œ์šฉ

// import.js
export const message = 'Hello from native ES Module!';

2.2 ๋Š๋ฆฐ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ๋™

Vite๋Š” ์„œ๋ฒ„๋ฅผ ์ฝœ๋“œ-์Šคํƒ€ํŠธ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉฐ, Dependencies์™€ Source Code๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. Dependencies๋Š” Esbuild๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๋ฒˆ๋“ค๋ง๋˜๊ณ , Source Code๋Š” Native ESM์„ ํ™œ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ๋™

# Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
vite

2.3 ๋Š๋ฆฐ ์†Œ์Šค ์ฝ”๋“œ ๊ฐฑ์‹ 

Vite๋Š” HMR์„ ์ง€์›ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ ๊ฐฑ์‹  ์‹œ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •๋œ ๋ชจ๋“ˆ๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„๋งŒ ๊ต์ฒดํ•˜๋ฏ€๋กœ ๊ฐฑ์‹  ์‹œ๊ฐ„์ด ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, HTTP ํ—ค๋”๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ํผํฌ๋จผ์Šค๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: HMR์„ ํ†ตํ•œ ๋น ๋ฅธ ์†Œ์Šค ์ฝ”๋“œ ๊ฐฑ์‹ 

// main.js
import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);

if (import.meta.env.DEV) {
  // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ HMR์„ ํ™œ์„ฑํ™”
  import.meta.hot.accept();
}

app.mount('#app');

3. ๋ฐฐํฌ์™€ ๋ฒˆ๋“ค๋ง

Vite๋Š” ํ”„๋กœ๋•์…˜์—์„œ ๋ฒˆ๋“ค๋ง์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ์˜ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ ์…ฐ์ดํ‚น, ์ง€์—ฐ ๋กœ๋”ฉ, ์ฒญํฌ ํŒŒ์ผ ๋ถ„ํ•  ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ: ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์„ค์ •

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    // ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์„ค์ • ์˜ต์…˜๋“ค...
  },
});

4. Esbuild ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์„ ํƒ

Vite๋Š” ๋นŒ๋“œ ์‹œ์— Esbuild๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋กœ, Esbuild๊ฐ€ ์•„์ง ์ฝ”๋“œ ๋ถ„ํ•  ๋ฐ CSS ์ฒ˜๋ฆฌ์— ๋ฏธ๋น„ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Vite๋Š” ํ˜„์žฌ๋กœ์„œ Rollup์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ–ฅํ›„ Esbuild์˜ ์•ˆ์ •ํ™” ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒ์„ ์žฌํ‰๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Vite๋Š” ๋ชจ๋˜์›น ๊ฐœ๋ฐœ์— ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ œ์‹œํ•˜๋ฉฐ, ์ƒ์‚ฐ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ์— ์ฃผ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ตœ์ƒ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€