์ค๋์ ์ต๊ทผ์ ๊ณต๋ถํ Vite์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. Vite๋ฅผ ์ด๋ป๊ฒ ์ปค์คํ ํ ์ง๋ฅผ ๋ค๋ฃจ๊ธฐ ๋ณด๋ค๋ Vite๊ฐ ์ ๋์ค๊ฒ ๋์๊ณ Webpack ๊ฐ์ ๋ฒ๋ค๋ฌ์ ๋น๊ตํ์ฌ ๋ฌด์์ด ์ข์์ง ๋ฑ์ ๊ฐ๋จํ๊ฒ ํ์ด๋๊ณ ์ ํฉ๋๋ค.
Vite ํ์ ์ผํ
Vite๋ ํ๋์ค์ด๋ก "๋น ๋ฅด๋ค(Quick)"๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ทธ ์ด๋ฆ๋ต๊ฒ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ๋ชจ๋ ์น ํ๋ก์ ํธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ด์ ์ ๋ง์ถฐ ํ์ํ ๋น๋ ๋๊ตฌ์ ๋๋ค.
๊ทธ๋ผ Vite๋ ์ด๋ป๊ฒ ๊ทธ๋ ๊ฒ ๋น ๋ฅธ ๊ฑธ๊น์?
- ์ฐ์ Vite๋ Dependencies(ํจํค์ง)์ Source Code(์์ค ์ฝ๋)๋ฅผ ๋๋์ด ๋ฒ๋ค๋ง ํฉ๋๋ค. ์ค์ ๊ฐ๋ฐ์ ํ๋ฉด์ ์์ค ์ฝ๋๋ ์์ฃผ ๋ฐ๋๋ ๋ฐ๋ฉด ํจํค์ง๋ ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌํ์ฌ ํจํค์ง๋ฅผ ์ฌ์ ๋ฒ๋ค๋ง ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฌ์ ๋ฒ๋ค๋ง์ Esbuild๋ฅผ ์ฌ์ฉํฉ๋๋ค. Go๋ก ์์ฑ๋ Esbuild๋ Webpack, Parcel๊ณผ ๊ฐ์ ๊ธฐ์กด์ ๋ฒ๋ค๋ฌ ๋๋น 10~100๋ฐฐ๊น์ง์ ๋น ๋ฅธ ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ ํ ๋ฒ ๋น๋ํ ๊ฒฐ๊ณผ๋ ์บ์ฑ์ ํด๋๊ธฐ ๋๋ฌธ์ ๋ค์ ๋น๋์์๋ ๋์ฑ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํฉ๋๋ค.
- ๋ํ Vite๋ Native ESM์ ์ด์ฉํด ์์ค ์ฝ๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฒ๋ค๋ฌ์ ์์ ์ ์ผ๋ถ๋ฅผ ์ฐจ์งํ ์ ์๋๋ก ํ๋ฏ๋ก, Vite๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ๋ ๋๋ก ์์ค ์ฝ๋๋ฅผ ๋ณํํ๊ณ ์ ๊ณตํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์กฐ๊ฑด๋ถ ๋์ import ์ดํ์ ์ฝ๋๋ ํ์ฌ ํ๋ฉด์์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋ง ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ฆ, ์๋์ผ๋ก routes๋ง๋ค code splitting์ด ์ผ์ด๋ Dynamic import๊ฐ ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Vite๋ HMR์ ๋ฒ๋ค๋ฌ๊ฐ ์๋ ESM์ ์ฌ์ฉํ์ฌ ์ง์ํฉ๋๋ค. ์ด๋ค ๋ชจ๋์ด ์์ ๋๋ฉด Vite๋ ๊ทธ์ ์์ ๋ ๋ชจ๋๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ง ๊ต์ฒดํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ ํด๋น ๋ชจ๋์ ์์ฒญํ๋ฉด ๊ต์ฒด๋ ๋ชจ๋์ ์ ๋ฌํฉ๋๋ค. ์ ๊ณผ์ ์์ ์๋ฒฝํ๊ฒ ESM์ ์ด์ฉํ๊ธฐ์, ์ฑ ์ฌ์ด์ฆ๊ฐ ์ปค์ ธ๋ HMR์ ํฌํจํ ๊ฐฑ์ ์๊ฐ์๋ ์ํฅ์ ๋ผ์น์ง ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก Vite๋ HTTP ํค๋๋ฅผ ํ์ฉํ์ฌ ์ ์ฒด ํ์ด์ง์ ๋ก๋ ์๋๋ฅผ ๋์
๋๋ค. ํ์์ ๋ฐ๋ผ ์์ค ์ฝ๋๋
304 Not Modified
๋ก, ๋ํ๋์๋Cache-Control: max-age=31536000,immutable
์ ์ด์ฉํด ์บ์๋ฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์์ฒญ ํ์๋ฅผ ์ต์ํํ์ฌ ํ์ด์ง ๋ก๋ฉ์ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
๋ค๋ง Vite ๋ฌธ์์๋ ๋์์๋ค์ํผ Vite๋ ํ์ฌ ํ๋ก๋์ ๋ฒ๋ค๋ง ๊ณผ์ ์์๋ Esbuild๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Rollup์ ์ฌ์ฉํฉ๋๋ค. ๋ฌผ๋ก ์๋๋ก๋ esbuild๊ฐ ๋ ๋น ๋ฅด์ง๋ง, ํ์ฌ๋ก์๋ Rollup์ด ์ฑ๋ฅ ๋ ์ ์ฐ์ฑ ํธ๋ ์ด๋์คํ์์ ๋ ๋์ ์ ํ์ด๋ผ๊ณ ์ฌ๊ฒผ๊ธฐ์ ๊ทธ๋ ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ esbuild๋ ์ง๋ ๋ช ๋ ๋์ ๋ง์ ์ง์ ์ ์ด๋ฃจ์๊ณ , ํฅํ ํ๋ก๋์ ๋น๋์์ esbuild๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ๋ ์กด์ฌํ๋ค๊ณ ํ๋, ์์ ํ esbuild๋ก ๋์ด๊ฐ ๋ ์ด ์ฌ์ง ์กฐ๊ธ ๊ธฐ๋๊ฐ ๋๋ค์.
Vite๋ ๋ ๊ฐ์ง ์ปจ์ ์ ์ค์ฌ์ผ๋ก ํ๊ณ ์์ต๋๋ค.
- ๊ฐ๋ฐ ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฒ๋ค๋ง ์ Rollup ๊ธฐ๋ฐ์ ๋ค์ํ ๋น๋ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋์ ์์ค์ผ๋ก ์ต์ ํ๋ ์ ์ (Static) ๋ฆฌ์์ค๋ค์ ๋ฐฐํฌํ ์ ์๊ฒ๋ ํ๋ฉฐ, ๋ฏธ๋ฆฌ ์ ์๋ ์ค์ (Pre-configured)์ ์ ๊ณตํฉ๋๋ค.
Vite๋ ์ด์ ๊ฐ์ด ์ต์ ํ๋ ์ค์ ์ ์ ๊ณตํ์ง๋ง, Plugin API ๋๋ JavaScript API๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
Vite ํ๋ก์ ํธ ์์ฑ
๊ทธ๋ผ ์ด์ Vite๊ฐ ๋น ๋ฅธ ๊ฒ๋ ์์๊ณ , ๊ฐ๋จํ๊ฒ ์ด๋ป๊ฒ ๋์๊ฐ๋ ์์คํ ์ธ์ง๋ฅผ ํ์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋จผ์ Vite๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ด
์๋ค. ๊ฐ๊ฐ ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์ ์ ๋ง๊ฒ ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์ ๋ react + typescript๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ react-ts
ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
# npm 6.x
npm create vite@latest app --template react-ts
# npm 7+
npm create vite@latest app -- --template react-ts
# yarn
yarn create vite app --template react-ts
# pnpm
pnpm create vite app --template react-ts
Vite๊ฐ ์ง์ํ๋ ํ
ํ๋ฆฟ์ vanilla
, vanilla-ts
, vue
, vue-ts
, react
, react-ts
, react-swc
, react-swc-ts
, preact
, preact-ts
, lit
, lit-ts
, svelte
, svelte-ts
๊ฐ ์์ผ๋ ์ํฉ์ ๋ง๊ฒ ํ
ํ๋ฆฟ๋ง ๋ฐ๊ฟ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ ํ๋ก์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
react์ CRA์ ๋น๊ตํ์ ๋ ํ ๊ฐ์ง ๋์ ๋๋ ์ ์ด ๋ณด์ด์ง ์๋์? index.html
์ด public ํด๋๊ฐ ์๋ ๋ฃจํธ ํด๋์ ์์ต๋๋ค. Vite๋ ์ด๊ฒ ์๋์ ์ธ ์์น ์ ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ ์ถ๊ฐ์ ์ธ ๋ฒ๋ค๋ง ๊ณผ์ ์์ด index.html
์ด ์ฑ์ ์ง์
์ ์ด ๋๊ฒ๋ ํ๊ธฐ ์ํจ์
๋๋ค. ๊ทธ๋์์ธ์ง index.html ํ์ผ ์์ ๋ณด๋ฉด ๊ฐ์ฅ ๋ฉ์ธ์ด ๋๋ tsx ํ์ผ์ด <script> ํ๊ทธ๋ก ์ฝ์
๋์ด ์์ต๋๋ค. (<script type="module" src="/src/main.tsx"></script>
)
์. index.html๊ณผ main.tsx๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง๋ฅผ ์์๊ฒ ๋ค, ์ด์ ๋ package.json
์ ๋ฏ์ด๋ณผ ์ฐจ๋ก์
๋๋ค.
๊ฐ์ฅ ๋จผ์ scripts ๋ถ๋ถ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ํ์์ต๋๋ค.
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview"
},
๊ทผ๋ฐ ๋น๋ ์์ tsc๋ฅผ ์ฌ์ฉํ๋ค์? ์ ์ง ์์ ์ ๊ธ์ด ์๊ฐ๋๋ค์ ๐
์ด์ธ์ ์ปค๋งจ๋ ๋ผ์ธ์์ ์ต์ ์ผ๋ก ๋ถ์ผ ์ ์๋ ๊ฒ๋ค์ด ์ฌ๋ฟ ์กด์ฌํฉ๋๋ค. ์ด๋ ๊ณต์ ๋ฌธ์ - CLI ๋ถ๋ถ์ ์ ์ ๋ฆฌ๊ฐ ๋์ด์์ผ๋, ์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ฌ ์ฉ๋์ ๋ง๊ฒ ์ปค์คํ ํ์ฌ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
TypeScript ์ง์?
๋น์ฐํ๊ฒ๋ Vite๋ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํฉ๋๋ค. ํ์ง๋ง ํ์
์ ๋ํ ๊ฒ์ฌ๋ IDE ์์ฒด์์ ํ๋ ๊ฒ๊ณผ build ๊ณผ์ ์์๋ง ์งํํฉ๋๋ค.
(์์ scripts์์ build ์ tsc๋ฅผ ๋จผ์ ์ํํ๋ ๋ฐ, ์ด ๋ถ๋ถ์ด ํ์
๊ฒ์ฌ์ ํด๋นํฉ๋๋ค.)
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ ์์๋ .ts ํ์ผ์ ๋ํด์ ํธ๋์คํ์ผ๋ง๋ง ์ํํฉ๋๋ค.
์ ์ด๋ ๊ฒ ํ๋ ๊ฑธ๊น์? ์ด๋ Vite์ ์ฅ์ ์ธ "๋น ๋ฅธ ์๋"์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ง์ฝ ๊ฐ๋ฐ ์์๋ ๊ณ์ ํ์
๊ฒ์ฌ๋ฅผ ํ๋ค๋ฉด ์ ์ฒด ๋ชจ๋ ๊ทธ๋ํ์ ๋ํ ํ์์ด ํ์ํ๋ฏ๋ก ์ด ์ฅ์ ์ด ํด์๋ ์ ๋ฐ์ ์๊ฒ ์ฃ .
๋๋ฌธ์ Vite์์๋ ํ์
๊ฒ์ฌ๋ ๋น๋ ์ ์ํํ๋๋ก ๋ถ๋ฆฌํ์ต๋๋ค. (๋น์ฐํ ์ด๋ ๊ธฐ๋ณธ ์ค์ ์ด๋ฏ๋ก ํ์
๊ฒ์ฌ๋ฅผ ํ๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.)
Vite์์๋ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ ์ esbuild๋ฅผ ์ด์ฉํฉ๋๋ค. ์ด๋ก ์ธํด ts ์ฝ๋๋ฅผ js ์ฝ๋๋ก ๋ณํ์ด tsc ๋๋น ์ฝ 20~30๋ฐฐ ์ ๋ ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง๋๋ค.
๊ทธ๋ผ Webpack๊ณผ Vite ์ค์์ ๋ญ ์ ํํ ๋?
์ ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํ๋ ๋ฐ ๋น๋ ์๋๋ ํฐ ๋น์ค์ ์ฐจ์งํ๋ ์์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Webpack์ ์ค๋๋ ๋ฒ๋ค๋ฌ๋ก์ ์ํ๊ณ๊ฐ ํฌ๊ณ ํ๋ฌ๊ทธ์ธ๋ ๋ง์ ํ์ฅํ๋ ๋ฐ ๋ณด๋ค ์ ๋ฆฌํ๊ณ , ํธ๋ฌ๋ธ์ํ
๋ ๊ด๋ จ ์์๊ฐ ๋ง์ ์ ๋นํ ์ฌ์ฉํ๊ธฐ ์ข์์ต๋๋ค.
๋ค๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด์ ์์กด์ฑ์ด ๋์ด๋๊ณ ํ๋ฌ๊ทธ์ธ๋ ํ๋๋ ์ถ๊ฐ๋๋ฉด์ ๋น๋ ์๋๊ฐ ํ์ฐํ ๋๋ ค์ก์ต๋๋ค. ์ด๋ ๋ก์ปฌ์์ ํ
์คํธํ ๋๋ ํฐ ๋ถ๋ง์ ๋ชป ๋๊ผ์ง๋ง, ์ค์ ๋ก aws๋ vercel, netlify ๊ฐ์ ํ๋ซํผ์ ์ฌ์ฉํด ๋ฐฐํฌ๋ฅผ ํ๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ๊ณผ ๊ทธ ์๊ฐ์ ๋น๋กํ์ฌ ๋๋ ๋น์ฉ์๋ ํฐ ๋ถ๋ง์ ๋๊ผ์ต๋๋ค.
๊ทธ๋์ ๋น ๋ฅธ ์๋์ ์ฌ์ด ์ค์ ์ด ์๋์ด๋ผ๋ Vite์ ๊ด์ฌ์ด ์๊ฒผ๊ณ , ๋จผ์ ์กฐ๊ทธ๋ง ํ ์ด ํ๋ก์ ํธ์ Vite๋ฅผ ์ฌ์ฉํด๋ณด๋ฉฐ ํ์คํ ๋น๋ ์๋๊ฐ ๋น ๋ฆ์ ๋ง์ด ์ฒด๊ฐํ์ต๋๋ค. (์์ ์ ๊ฐ๋ฐ ๋ชจ๋์์ webpack์ ์ฌ์ฉํ ๋๋ ์๋ฒ๋ฅผ ์์ํ๊ณ ์ ์ด๋ 2์ด ์ด์์ ๊ธฐ๋ค๋ ค์ผ ํ๋ฉด์ด ๋ด๋๋ฐ, vite๋ฅผ ์ฌ์ฉํ๋๋ 1์ด๋ ์๋ผ์ ํ๋ฉด์ด ๋จ๋ ๊ธฐํ์์ ๋ณผ ์ ์์์ต๋๋ค. ์ ๋ง ๊ทธ๋์ ์ฌ๊ฒฝ์...)
์ฌ์ค Webpack vs Vite
๋ผ๋ ๋น๊ต ์์ฒด๋ ์ด๋ป๊ฒ ๋ณด๋ฉด ํ๋ก์ ํธ์ ์ฃผ์ ๋ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฒ ์คํธ๋ ๋ค๋ฅผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ต์ฐ์ ์ผ๋ก ์ฌ๊ธด๋ค๋ฉด Webpack
์ด ์ฌ์ ํ ์ข์ ์ ํ์ง์ผ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง๋ง Vite๋ ๊พธ์คํ ์
๋ฐ์ดํธ๋ฅผ ํ๋ฉฐ ๋ง์ด ์์ ์ ์ผ๋ก ๋ฐ๋์๊ณ ์ง์ํ๋ ํ๋ฌ๊ทธ์ธ๋ ๋ง์ด ๋์ด๋ฌ์ผ๋, ๋ง์ฝ ๋ณธ์ธ์ด ์ํ๋ ๊ธฐ๋ฅ์ Vite์์ ํ๋ฌ๊ทธ์ธ ๋ฑ์ผ๋ก๋ ๊ตฌํํ ์ ์๋๋ก ์ง์์ ํด์ฃผ๊ณ ์๋ค๋ฉด Vite
๊ฐ ์์ฃผ ๋งค๋ ฅ์ ์ธ ์ ํ์ง๊ฐ ๋ ์ ์๊ฒ ์ฃ .