Vite
Last updated
ํ๋์ค์ด๋ก "๋น ๋ฅด๋ค"๋ผ๋ ์๋ฏธ
Vue๋ฅผ ๊ฐ๋ฐํ ์๋ฐ ์ ๊ฐ ๊ฐ๋ฐ์ ์ํ ๊ฐ๋ฐ ์๋ฒ ๊ธฐ๋ฅ๊ณผ ํ๋ก๋์ ์ ์ํ ๋ฒ๋ค ๊ธฐ๋ฅ์ ๊ฐ์ง ๋น ๋ฅธ ๊ฐ๋ฐ ๋๊ตฌ
์ฒ์์ vue์์ ์ฐ์์ง๋ง ํ์ฌ๋ ๋ค๋ฅธ ํด๋ค์๋ ๋๋ฆฌ ์ฐ์ด๊ณ ์์
๊ธฐ๋ณธ์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ ๋ฐ ๊ฐ์ข css ๋ก๋๋ฅผ ๋ด์ฅํ๊ณ ์์ผ๋ฉฐ HMR(Hot Module Replacemen)๊ณผ ๊ฐ๋ฐ ์๋ฒ, Proxy ๋ฑ์ ์ง์
๋ด๋ถ์ ์ผ๋ก esbuild์ Rollup์ ์ฌ์ฉํจ
ํ๋ก๋์ ์ ์ํ ๋ฒ๋ค๋ง์๋ Rollup์ ์ฌ์ฉํจ
์นํฉ์ ๋ณต์กํ ์ค์ ๋ฐฉ์์ ์ข์ํ์ง ์๋ Rollup ์ฌ์ฉ์๋ค์ ๋๊ฑฐ ํก์ํ์ฌ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ํ๊ณ์์ ์ฑ์ฅํจ
๊ฐ๋ฐ ํ๊ฒฝ์ด ๋น ๋ฅด๋ค๋ ์ฅ์ ์ผ๋ก ๋ง์ ํ๋ก์ ํธ๋ค์ด ์นํฉ์์ ๋นํธ๋ก ๋ณ๊ฒฝํ์
Native ESM, esbuild๋ฅผ ํตํ ์ฌ์ ๋ฒ๋ค๋ง์ผ๋ก ๋น ๋ฆ
๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณต์์ ์ผ๋ก ์ง์ํ๊ณ ์์ง๋ ์์ง๋ง, ํ๋ฌ๊ทธ์ธ์ ํตํด ์ ๊ณตํจ
์ต๊ทผ ๋ฐํ์์๋ ๋ง์ผ์คํค์ ๋ชจ๋ ํ๋๋ ์ด์ ์ด ํฌํจ๋จ
์ง๋ฃจํ ์ ๋๋ก ๊ธธ์๋ ์๋ฒ ๊ตฌ๋์ ๋จ์ถ์ํด
์ฝ๋ ์คํํธ(์ต์ด๋ก ์คํ๋์ด ์ด์ ์ ์บ์ฑํ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ)๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์๋ฒ๋ฅผ ๊ตฌ๋ํ ๋, dependencies์ source code ๋๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ก ๋๋์ด ๊ฐ๋ฐ์๋ฒ์ ์์ ์๊ฐ์ ๊ฐ์
esbuild๋ฅผ ์ด์ฉํด์ dependencies๋ฅผ ESM์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๋๋ก ์ฌ์ ๋ฒ๋ค๋งํจ
vite๋ Native ESM์ ์ด์ฉํด source code๋ฅผ ๋ง๋ค์ด๋ด๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ Native ESM์ ๊ทธ๋ฅ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ ๋๋ฌธ์ ๋ง์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฒ๋ค๋ง ์ผ๋ถ๋ฅผ ๋ด๋นํ๊ฒ ๋จ
๋๋ ธ๋ ์์ค ์ฝ๋ ๊ฐฑ์
vite๋ ๋ฒ๋ค๋ฌ๊ฐ ์๋ ESM์ ์ด์ฉํด์ HMR์ ์ง์ํจ
์ด๋ค ๋ชจ๋์ด ์์ ๋๋ฉด vite๋ ์์ ๋ ๋ชจ๋๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ง์ ESM์ผ๋ก ๋ค์ ๋ง๋ค์ด๋
์ผ๋จ ์๋ฒ๋ฅผ ๋์ฐ๊ณ ์๋ฒ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ํ์ด์ง์์ ์ฌ์ฉ๋๋ ์์ค์ฝ๋๋ค์ ์ฌ์ฉ, ํด๋น ์ฝ๋๋ค์ ์ด๋ฏธ ESM ๋ฐฉ์์ผ๋ก ์ฌ์ ๋ฒ๋ค๋ง ๋์ด์์ -> ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ถ๋ถ๋ง ๋ค์ ESM์ผ๋ก ๋ง๋ค์ด๋ด๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋น ๋ฆ
Vite๋ Node.js ๋ฒ์ 18++ ๋๋ 20+์ ํ์๋ก ํจ
์ผ๋ถ ํ ํ๋ฆฟ์ ๊ฒฝ์ฐ ๋ ๋์ ๋ฒ์ ์ ์๊ตฌ
pnpm create vite@latest [ํ๋ก์ ํธ ๋ช ] -- --template[ํ ํ๋ฆฟ ๋ช ]
React ๊ด๋ จ ํ ํ๋ฆฟ: react, react-ts, react-swc, react-swc-ts
Vite๋ฅผ ํตํด ESM ์คํ์ผ๋ก ์ฌ์ ์ ๋ฒ๋ค๋ง๋ CommonJS ๋ฐ UMD ๋ชจ๋์ import ํ ์ ์๋ค.
์ด ๊ณผ์ ์ esbuild๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, JS ๊ธฐ๋ฐ์ ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ๋น ๋ฅธ ์ฝ๋ ์คํํธ๊ฐ ๊ฐ๋ฅํจ
/node_modules/.vite/deps/my-dep.js?v=f3sf2ebd ์ ๊ฐ์ด URL์ ์ด์ฉํด ESM์ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก import ๊ตฌ๋ฌธ์ ์์
๋ํ๋์๋ ๋ฐ๋์ ์บ์๋๋ค.
Vite๋ ๊ธฐ๋ณธ์ ์ผ๋ก ESM๋ฅผ ํตํด HMR API๋ฅผ ์ ๊ณตํจ
HMR ๊ธฐ๋ฅ์ด ์๋ ํ๋ ์์ํฌ๋ API๋ฅผ ํ์ฉํ์ฌ ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ ๋ฆฌ์ง ์๊ณ ์ฆ๊ฐ์ ์ด๊ณ ์ ํํ ์ ๋ฐ์ดํธ ์ ๊ณตํจ
Vite๋ Vue Singlie File Components, React Fast Refresh์ ๊ฐ์ First-part HMR ๋ชจ๋์ ์ ๊ณต
create-vite ์์ ์ ๊ณตํ๋ ํ ํ๋ฆฟ ์์๋ HMR ๋ชจ๋์ด ํฌํจ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ์ค์ ํ ํ์ ์์
TypeScript - ํธ๋์คํ์ผ๋ง ์ํํ๋ฉฐ, ํ์ ๊ฒ์ฌ๋ IDE์ ๋น๋ ํ๋ก์ธ์ค์์ ์งํํ๋๋ก ๊ถ์ฅํจ
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํ์ง๋ง ํ์ ๊ฒ์ฌ๋ฅผ ์ํ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋ ํ์ด๋ฐ์ tsc๋ฅผ ํตํด ํ์ ๊ฒ์ฌ๋ฅผ ๋ฐ๋ก ํด์ฃผ์ด์ผํจ
JSX - .jsx์ .tsx ์ญ์ ์ฌ์ฉ ๊ฐ๋ฅ. esbuild๋ฅผ ์ด์ฉํด ์ปดํ์ผ
CSS - .cssํ์ผ์ ๊ฐ์ ธ์ค๋ฉด HMR์ ์ง์ํ๋ <style> ํ๊ทธ๋ฅผ ํตํด ํ์ด์ง์ ํด๋น ์ฝํ ์ธ ๊ฐ ์ฃผ์ ๋จ
Png - ์ ์ ์์ ์ importํ๋ ๊ฒฝ์ฐ, ์ด์ ๋ํ Public URL์ด ๋ฐํ๋จ
JSON - JSON ํ์ผ์ ๋ฐ๋ก import ๊ฐ๋ฅ, ๊ฐ์ ธ์ฌ ํ๋๋ฅผ ์ง์ ํ๋ฉด ํธ๋ฆฌ ์ธ์ดํน ๋จ
React๋ฅผ ํฌํจํด์ ๋ฒ๋ค๋งํ๊ฒ๋๋ฉด ๋ฆฌ์ํธ ์์ค์ฝ๋๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์ํธ ์ปดํฌ๋ํธ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค ๋ ๋ฆฌ์ํธ๋ฅผ ํฌํจํด์ ๋ง๋๋๊ฒ ์๋ ์ฌ์ฉํ๋ ์ชฝ์์ ๋ฆฌ์ํธ๋ฅผ ๊ฐ์ง๊ณ ์ฌ์ฉํ๋๋ก ํด์ผํ๋ค.
Typescript๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํจํค์ง๋ก ์ ๊ณตํ ๋ Type Definition์ ์ ๊ณตํด์ฃผ๋๊ฒ์ด ์ข๋ค.
vite-plugin-dts
insertTypesEntry: true
-> ํ์
๋ค์ Entry ํ์ผ์ ๋ง๋ค์ด package.json์ types์ ์ฐ๊ฒฐ
peerDependencies๋ ์ฌ์ฉํ๋ ์ธก์์ ํด๋น ๋ํ๋์๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค๊ณ ์ ์ํ๋๊ฒ
dependencies์ ๋ณ๋๋ก ์ ์ํ๋๊ฒ (์ฆ, ์ค๋ณต์ผ๋ก ์์ฑ๋๋ ๋ฌธ์ ์์)
๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํจํค์ง์ ์ ๋ฐ๋ก ์ง์ ํด์ ๋ค๋ฅธ ํจํค์ง๊ฐ ๊ฐ์ ธ๋ค์ธ๋ ์์ค์ฝ๋๋ก ์ ์ฐ๊ฒฐ๋๋๋ก ์ค์