๐น vite (veet) : ํ๋์ค์ด๋ก “๋น ๋ฅด๋ค”
๐น vue๋ฅผ ๊ฐ๋ฐํ Evan You
๐น ๋ค์ํ ํ๋ ์์ํฌ ์ง์ (Vue, React, TypeScript, VanilaJS ๋ฑ)
๐น ์ค์ ํ๋ก๋์ ์ ํ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์์ํค๋๋ฐ ๋์์ ์ฃผ๋ ํด
1. ๋ฐฐ๊ฒฝ์ง์
vite์ ๋์๋ฐฉ์๊ณผ ์ด๋ค ์ญํ ์ ํ๋์ง ์์๋ณด๊ธฐ ์ ์ ํ์ํ ๋ฐฐ๊ฒฝ์ง์๋ค์ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ๋ค.
- ๋ฒ๋ค๋ง
- ์ปดํฌ๋ํธ๋ก ๋ชจ๋ํ๋ ์์ค์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ ํ๋์ ํ์ผ๋ก ๋ฌถ์ด ์ฐ๊ฒฐํด์ฃผ๋ ์์
- ๋ํ์ ์ธ ๋ฒ๋ค๋ง ํด: webpack, rollup, parcel
- HMR(Hot Module Replacement)
- ์ฑ์ ์ข ๋ฃํ์ง ์๊ณ ๊ฐฑ์ ๋ ํ์ผ๋ง ๊ต์ฒดํ๋ ๋ฐฉ์
- ์ฝ๋์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ๋ชจ๋ ํ์ผ์ ๋ค์ ๋ฒ๋ค๋งํ์ง ๋ง๊ณ ๊ฐฑ์ ๋ ํ์ผ๋ง ๊ต์ฒดํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋กํ๋ค.
- webpack
- create-react-app(CRA)์์ ์ฌ์ฉํ๋ ๋ฒ๋ค๋ง ํด
- ํน์ง
- ์ ์ฒด ์ฝ๋๋ฅผ ํ๋์ ํ์ผ๋ก ๋ฌถ๋๋ค. ๊ทธ๋์ ์ฝ๋์์ด ๋ง์์ง์๋ก ๋ฒ๋ค๋ง์ด ์ค๋๊ฑธ๋ ค ์ด๊ธฐ ๊ตฌ๋ ์๊ฐ์ด ๋๋ ค์ง๋ค.
- ๋ชจ๋ ์ฝ๋๊ฐ ๋ฒ๋ค๋ง ๋์ด์ผ ์๋ฒ๊ฐ ์ค๋น๋๋ค. ๊ทธ๋์ ์์ค ์ฝ๋์ ์์ฃผ ์ฌ์ํ ๋ณ๊ฒฝ์ฌํญ์ด๋ผ๋ ๋ฐ์ํ๋ฉด ๋ฒ๋ค๋ง์ ๋ค์ ํด์ผ ํ๋ค.
- HMR(Hot Module Replacement)๋ฅผ ์ง์ํ์ง๋ง ์ฑ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ฐฑ์ ์๊ฐ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ฌธ์ ๋ ์ฌ์ ํ๋ค
- esbuild
- ์์ฃผ ๋น ๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ฌ
- go์ธ์ด๋ก ๋ง๋ค์ด์ก๋ค.
- ์ฝ๋ ํ์ฑ, ์ถ๋ ฅ, ์์ค๋งต ์์ฑ์ ๋ชจ๋ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ค.
- ๋ถํ์ํ ๋ฐ์ดํฐ ๋ณํ ๋ฐ ํ ๋น์ด ์๋ค.
- javascript modules
- 1๊ฐ ์ด์์ ๊ฐ์ฒด/ํจ์/๋ณ์ ๋ฑ์ exportํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ชจ๋์ด๋ผ๊ณ ํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๋์ ๋ชจ๋๋ก ๋ถํ ํ๋ ๋งค์ปค๋์ฆ์ด ํ์ํด์ง์ ๋ฐ๋ผ ๋ฑ์ฅํ ๊ฐ๋ ์ด๋ค.
- ๊ธฐ๋ฅ๊ณผ ๊ด์ฌ์ฌ์ ๋ฐ๋ผ ๋ชจ๋์ ํตํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ถ๋ฆฌ๊ฐ ๋ชฉ์ !
- ์ต์ ๋ธ๋ผ์ฐ์ ๋ค์ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
- ESM (ECMAScript Module)
- ์น ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ์ฌ์์ผ๋ก ๋ชจ๋ import, export๋ฅผ ๋ณ๋์ ๋๊ตฌ ์์ด ์ฌ์ฉํ ์ ์๋ค.
- ๋์์๋ฆฌ
-
๋๋ณด๊ธฐ
- ๊ตฌ์ฑ construction (fetch → parse)
- module resolution: ์ต์ด ์คํ ํ์ผ (์ํธ๋ฆฌ ํ์ผ)์ ๊ธฐ์ค์ผ๋ก import๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ ์ข ์์ฑ ํธ๋ฆฌ๋ฅผ ์์ฑํด์ ํ์ํ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ ์์น๋ฅผ ์์๋ธ๋ค.
- fetch: ํ์ผ์ ๋ค์ด๋ก๋ ํ๋ค.
- parse: ํ์ผ์ ํ์ฑํ์ฌ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๋ชจ๋ ๋ ์ฝ๋ : import์ export ์ ๋ณด๋ฅผ ํฌํจํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ์ธ์คํด์คํ instantiation
- ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ด๋ค.
- export๋ ๋ชจ๋ ๊ฐ๋ค์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค.
- import์ export ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํจ๋ค ==linking
- ํ๊ฐ evaluation
- ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ํ ๋นํ๋ค.
- ์ด๋ Import๋ก ์ ๊ทผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค. read-only
- ๊ตฌ์ฑ construction (fetch → parse)
-
2. Vite
Vite๊ฐ ๋น ๋ฅธ ์ด์
- esbuild๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๊ฒ ์์ฃผ ๋น ๋ฅด๋ค.
- ์ดํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋์ ๋๊ฐ์ง ์นดํ
๊ณ ๋ฆฌ๋ก ๋๋๋ค.
- dependencies : ๊ฐ๋ฐํ๋ ๋์ ๋ณ๊ฒฝ๋์ง ์๋ ํ๋ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค ์ฝ๋
- source code : JSX, CSS ๋ฑ์ด ์ฌ์ฉ๋๊ธฐ๋ ํ์์ผ๋ฉฐ ๊ฐ๋ฐํ๋ ๋์ ๊ณ์ ํธ์ง๋๋ ์์ญ
- Dependencies๋ค์ ์์ฒญ ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ผ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ฒ๋ค๋งํ๋ ๊ณผ์ ์ด ๋งค์ฐ ๋นํจ์จ์ ์ด๊ณ ๋ง์ด ์๊ฐ์ด ๋ ๋ค.
๋์ ๋ฐฉ์
- HTTP request์ ๋ฐ๋ผ์ ์์ค์ฝ๋๋ฅผ ๋ณํํ๊ณ ์ ๋ฌํ๋ค.
- ๋ธ๋ผ์ฐ์ ์ ํ์ฌ ํ๋ฉด์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ์ฝ๋๋ค๋ง ์ฒ๋ฆฌ๋๋ค.
- ์ด๋ค ๋ชจ๋์ด ์์ ๋๋ฉด ์์ ๋ ๋ชจ๋๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ง ๊ต์ฒดํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ํด๋น ๋ชจ๋์ ์์ฒญํ๋ฉด ๊ต์ฒด๋ ๋ชจ๋์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ค.
- ESM์ ์ด์ฉํด์ HMR์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ฑ ๊ท๋ชจ๊ฐ ๊ฐฑ์ ์๊ฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- HTTP ํค๋๋ฅผ ์ด์ฉํ๋ค.
- ํ์์ ๋ฐ๋ผ 304 Not Modified, Cache-Control: max-age=31536000, immutable์ ์ด์ฉํด์ ์บ์๋๋๋ก ํ๋ค. ์ด๋ ๊ฒ ํ๋ฒ์ด๋ผ๋ ์์ฒญ์ ๋ ๋ณด๋ผ ์ ์๊ฒ ํ๋ค.
๊ธฐ๋ฅ
- ESM์ผ๋ก ์ฌ์ ๋ฒ๋ค๋ง์ ์ํํ๊ณ , HTTP ํค๋๋ฅผ ์ด์ฉํด ์์ฒญํ ๋ํ๋์๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์บ์ฑํ๋๋ก ํ๋ค.
- ESM์ ํตํด HMR API๋ฅผ ์ ๊ณตํ์ฌ ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ์ด ์์ฃผ ๋น ๋ฅด๋ค.
- TypeScript, Vue, JSX, CSS, CSS Pre-processor, ์ ์ ์์, JSON, WebAssembly, Web Worker๋ฅผ import ํ ์ ์๋ค.
- Typescript ์ฐธ๊ณ ์ฌํญ
-
๋๋ณด๊ธฐํ์ ์ ์ฉ Import, Export๋ฅผ ์ฌ์ฉํด์ผ ์ ํํ๊ฒ ๋ฒ๋ค๋งํ ์ ์๋ค
import type { T } from 'only/types' export type { T }
tsconfig.json > compilerOptions > isolatedModules : true ์ค์ ํ์
-
- Typescript ์ฐธ๊ณ ์ฌํญ
- import.meta.glob๋ฅผ ์ด์ฉํด์ ์ฌ๋ฌ ๋ชจ๋์ ํ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- importํ๋ ํ์ผ๋ช ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋น๋ ์ต์ ํ
- CSS ์ฝ๋๋ฅผ ์ถ์ถํด์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ <link> ํ๊ทธ๋ฅผ ์ด์ฉํด์ CSS ์ฝ๋๋ฅผ ๋ถ๋ฌ์์ ๋ชจ๋ ๊ณ์ฐํ ์ดํ์ ๋ ๋ํ๋๋ก ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด FOUC ํ์์ ํผํ ์ ์๋ค.
- FOUC ํ์ : CSS ๊ณ์ฐ ์ ์ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ํ์ด์ง๊ฐ ์ ๊น ๋จ๋ ํ์
- build.cssCodeSplit: false ๋ก ๋นํ์ฑํ
- Preload directives generation
- <link rel="modulepreload">
- ๋ชจ๋์ ๋ฏธ๋ฆฌ ์บ์ฑํ๋๋ก ์๋ ๋ณํ → ํ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
- depth๊ฐ ๊น์ ํ์ผ๋ค์ ๋ก๋ํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ด์ฉํด ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค.
- Async Chunk Loading Optimization
- ๋ ๊ฐ ์ด์์ ์ฒญํฌ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๊ณตํต ์ฒญํฌ๋ ๋ณ๋ ฌ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋๋ก dynamic import ๊ตฌ๋ฌธ์ผ๋ก ์ฌ์์ฑํ๋ค.
- ์ด๋ฌํ direct ๊ตฌ๋ฌธ์ preloadํ์ฌ ์ธ๋ฐ ์๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ค์ธ๋ค.
์์ ๊ฐ์ ธ์ค๊ธฐ
- URL๋ก ์ด๋ฏธ์ง, ๋ฏธ๋์ด, ํฐํธ ํ์ผ ๋ฑ์ ๊ฐ์ ธ์ค๊ณ , assetInclude ์ต์ ์ ์ด์ฉํด ํน์ ํ์ผ ํ์ ์ ์ถ๊ฐํ ์ ์๋ค.
- public ๋๋ ํฐ๋ฆฌ
- robot.txt์ ๊ฐ์ด ์์ค ์ฝ๋์์ ์ฐธ์กฐ๋์ง ์๋ ๊ฒ , ํด์ฑ ์์ด ํญ์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ๋ ์์ , importํ ํ์ ์๋ ์์ ์ ์ฌ๊ธฐ์ธ ํฌํจ์ํจ๋ค.
- import.meta.url : ํ์ฌ ๋ชจ๋์ URL์ ์๋ ค์ฃผ๋ ESM api
const imgUrl = new URL('./img.png', import.meta.url).href
// ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ ์ฌ์ฉ ๊ฐ๋ฅ
ํ๊ฒฝ ๋ณ์
- import.meta.env ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ๊ฒฝ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
- MODE: string - ํ์ฌ ์ฑ์ด ๋์ํ๊ณ ์๋ ๋ชจ๋
- BASE_URL: string - ์ฑ์ด ์ ๊ณต๋๋ ๋ฒ ์ด์ค URL
- PROD/DEV/SSR: boolean - ์ฑ ์คํ ํ๊ฒฝ ํ์ธ (PROD ↔ DEV)
- ํ๋ก๋์ ์์๋ ํ๊ฒฝ ๋ณ์๊ฐ ๋ชจ๋ ์ ์ ์ผ๋ก ๊ต์ฒด๋๋ค.
- .env ํ์ผ๋ค
.env # ๋ชจ๋ ์ํฉ์์ ์ฌ์ฉ๋ ํ๊ฒฝ ๋ณ์
.env.local # ๋ชจ๋ ์ํฉ์์ ์ฌ์ฉ๋๋, ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉ๋ (Git์ ์ํด ๋ฌด์๋ ) ํ๊ฒฝ ๋ณ์
.env.[mode] # ํน์ ๋ชจ๋์์๋ง ์ฌ์ฉ๋ ํ๊ฒฝ ๋ณ์
.env.[mode].local # ํน์ ๋ชจ๋์์๋ง ์ฌ์ฉ๋๋, ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉ๋ (Git์ ์ํด ๋ฌด์๋ ) ํ๊ฒฝ ๋ณ์
CRA vs Vite
์ง์ ๋ ๋ฒ๋ค๋ฌ๋ฅผ ๋น๊ตํด๋ณด์๋ค.
๊ฐ๋ฐ ์๋ฒ ๊ตฌ๋ ์๊ฐ | ๋น๋ ์๊ฐ | |
CRA | 12s | 16.66s |
vite | 298ms | 9.11s |
๊ฒฐ๋ก
๊ฐ๋ฐ ์๋ ํฅ์์ ์ํด vite๋ฅผ ์จ์ผ๋๋ค!