# 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
์ 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)์์ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
โ Tutorials