
1. ๐ ๋ค์ด๊ฐ๋ฉฐ
์ต๊ทผ ํ์ฌ์์ ๋ด๋นํ๋ ์๋น์ค์ ๋ํด์ CRA์์ Vite๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๋ฉด์ ์ฝ๊ฐ์ ์ฝ๋ ๊ฐ์ ๊น์ง ์งํ์ ํ๋ ๊ฒฝํ์ ๊ฐ๊ฒ ๋์์ต๋๋ค.
ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์์ ํธ์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๋ฉด์ webpack์ ์์กดํ๊ณ ์๋ ๋ฑ์ ์ฌ์ด๋์ดํํธ๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์์ ์ ์ผ ๊ฑฑ์ ์ ๋ง์ด ํ๋๋ฐ์.
์ด๋ฒ ๊ธ์์๋ ํฌ๊ฒ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋์ง, CRA์ Vite๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์ด๋ป๊ฒ ์งํํ๋์ง, ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ์์๋์ง ๊ธฐ๋กํ๋ ค ํฉ๋๋ค.
2. โ๏ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ์์ฑ
ํ์ฌ ๋ด๋นํ ์๋น์ค๋ webpack ๊ธฐ๋ฐ์ CRA๋ก ๊ตฌ์ฑ๋ ํ๋ก์ ํธ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ, ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฐ๋ฐ ์๋ฒ ๊ตฌ๋์๊ฐ์ด์์ต๋๋ค.
๊ตฌ๋๋๋ ์๊ฐ๊น์ง ํ๊ท ์ฝ 20์ด๊ฐ ์์๋๊ณ ์ต๋ ์ฝ 30์ด๊น์ง ์์๋๋ ์ํฉ์ด์์ต๋๋ค.
๋ ๋ฒ์งธ, ์ค๋ ๊ฑธ๋ฆฌ๋ ๋น๋ ์๊ฐ์ด์์ต๋๋ค.
๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํด ๋น๋๋๋ ์๊ฐ์ ํ๊ท ์ฝ 26์ด๊ฐ ์์๋์์ต๋๋ค.
์ธ ๋ฒ์งธ, ์์ ๊ฐ์ ์ด์ ๋ก ์ธํด์ React ํ์์ ๋ ์ด์ ๊ถ์ฅํ์ง ์๋ ๋ถ์๊ธฐ์ ๋๋ค.


3. CRA(webpack) vs Vite(rollup, esbuild)
๋จผ์ webpack, rollup, esbuild์ ์ญํ ์ ๋ฒ๋ค๋ฌ์ ๋๋ค.
๋ฒ๋ค๋ฌ์ ์ญํ ์ ๋ํด์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ค์ ํ๋์ ํ์ผ๋ก ๋ฌถ์ด์ฃผ๋ ๋๊ตฌ
- ๋ ์์ ์ฉ๋, ๋ ์ต์ ํ๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ณต
- ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ๋ถ์ํด์ ์ ๊ฑฐ
๊ทธ๋์, CRA๋ webpack์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ์ด ๋์๊ณ , Vite๋ rollup๊ณผ esbuild๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ์ด ๋์์ต๋๋ค.

3.1. CRA(webpack)

CRA์ ํน์ง์ ๊ฐ๋จํ๊ฒ ์๋์ ๊ฐ์ต๋๋ค.
- Facebook์์ ๋ง๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ boilerplate
- webpack ๊ธฐ๋ฐ: ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๋น๋ ๋๊ตฌ ์ฌ์ฉ
- ์ ๋ก ์ค์ : ๋ณต์กํ ์ค์ ์์ด ๋ฐ๋ก ๊ฐ๋ฐ ์์ ๊ฐ๋ฅ
- ํฐ ์ํ๊ณ: ๋ง์ ์ฌ์ฉ์์ ํ๋ถํ ๋ฆฌ์์ค
์์ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค.
์ญ์ฌ๊ฐ ์๋์ ์ผ๋ก ์ค๋๋์๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ํ ๋งํ ์๋ฃ๊ฐ ํ๋ถํ๊ณ , ๋๋ถ๋ถ์ ์ค์ ์ด ๋์ด์์ด ํธํ๋ค๋ฉด ํธํ์ง๋ง ๋ฐ๋๋ก ์ปค์คํฐ๋ง์ด์ง์ ํ๊ธฐ ์ํด์๋ eject๊ฐ ํ์ํ๋ฉฐ ๋ณต์กํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ CRA(webpack)์ ๋ฒ๋ค ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ ์๋ฒ๊ฐ ๊ตฌ๋์ด ๋ฉ๋๋ค.

์ง์ ์ ์์ ๊ฐ ๊ฒฝ๋ก๋ค์ ํ์ํ๊ณ ๊ฒฝ๋ก๋ค์ ๋ํ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ณ ๋ฒ๋ค๋ง์ด ๋ ๊ฒฐ๊ณผ๋ฌผ์ ํตํด ๊ฐ๋ฐ ์๋ฒ๊ฐ ์์์ด ๋ฉ๋๋ค.
3.2. Vite(rollup, esbuild)

Vite์ ํน์ง์ ๊ฐ๋จํ๊ฒ ์๋์ ๊ฐ์ต๋๋ค.
- Vue.js์ ์ฐฝ์์์ธ Evan You๊ฐ ๋ง๋ Frontend build tool
- native ES moules ๊ธฐ๋ฐ์ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ์๋ฒ
- esbuild๋ก ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ๋์ด์ค๊ณ , rollup์ ํตํ ๋ฒ๋ค๋ง์ ์ ์ฐ์ฑ์ ์ฑ๊น
Vite๋ CRA์ ๋ค๋ฅด๊ฒ ES module์ ํตํ ๊ฐ๋ฐ์๋ฒ๋ฅผ ์์ํ๊ณ , ์ด๋ก ์ธํด์ ๊ฐ๋ฐ ์๋ฒ ์์ ์๋๊ฐ ์๋์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
์ด๊ธฐ ์ค์ ๋ํ CRA์ ๋ค๋ฅด๊ฒ ์ต์ํ์ ์ค์ ์ด ๋์ด ์๊ณ ์ปค์คํฐ๋ง์ด์ง๋ ์ ์ฐํ์ง๋ง ์ถ๊ฐ ์ค์ ์ ํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ฉ์ด์ 5 ๋ฒ์ ๊น์ง ๋์ฌ ์ ๋๋ก ๋งค์ฐ ํ๋ฐํ๊ฒ ์ ์ง๋ณด์๊ฐ ๋๊ณ ์์ต๋๋ค.
Vite๋ ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ESM ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๊ตฌ๋ํฉ๋๋ค.

๋จผ์ ์๋ฒ๊ฐ ์์๋ฉ๋๋ค.
์๋ฒ๊ฐ ์์๋๋ฉด HTTP ์์ฒญ์ ๋ณด๋ด ์ง์ ์ ์ผ๋ก ๋ค์ด๊ฐ๊ณ , ํ์ํ ๊ฒฝ๋ก์ ๋ํ ๋ชจ๋๋ค๋ง ๋ถ๋ฌ์์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
๋ฒ๋ค ๊ธฐ๋ฐ์ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด์ ๋ฒ๋ค์ ํ๊ณ ๋ณด์ฌ์ฃผ๋ ๊ฒ,
ESM ๊ธฐ๋ฐ์ ํ์ํ ๊ฒฝ๋ก๋ค์ ๋ํด์๋ง HTTP ์์ฒญ์ ํ๊ฒ ๋ฉ๋๋ค.
ํ๋ก ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
ํน์ง | CRA | Vite |
๋น๋ ๋๊ตฌ | webpack | Rollup(ํ๋ก๋์ ) |
๊ฐ๋ฐ ์๋ฒ | webpack Dev Server | Native ESM + esbuild |
์ด๊ธฐ ์ค์ | ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋จ | ์ต์ํ์ ์ค์ |
๊ฐ๋ฐ ์๋ฒ ์์ ์๋ | ๋๋ฆผ | ๋งค์ฐ ๋น ๋ฆ |
์ปค์คํฐ๋ง์ด์ง | eject ํ์ ๋๋ ๋ณต์ก | ๊ฐ๋จํ๊ณ ์ ์ฐํจ |
SSR | ์ถ๊ฐ ์ค์ ํ์ | ๊ธฐ๋ณธ ์ง์ |
๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ์ง์ | ์ข์ | ์ ํ์ (์ถ๊ฐ ์ค์ ํ์) |
4. ๐ค ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์
4.1. Vite ์ค์น
ํ๋ก์ ํธ์ Vite๋ฅผ ์ค์นํฉ๋๋ค.
<shell />yarn add -D vite @vitejs/plugin-react
4.2. package.json ์์
์ด์ ๋ vite๋ก ๊ตฌ๋๋ ์ ์๊ฒ๋ ๋ง๊ฒ ์์ ํด ์ฃผ์์ต๋๋ค.


4.3. vite.config.ts ์ถ๊ฐ
์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ํ ์ฝ๋๋ค์ ์ถ๊ฐํ์ต๋๋ค.
์ค์ ๋ก๋ ๋ ๋ง์ ์ค์ ์ด ์ถ๊ฐ๋์์ต๋๋ค. (svg, md, ๋น๋ ํ์ผ ํด์, ํด๋ฆฌํ ๋ฑ)
<javascript />
import react from '@vitejs/plugin-react';
import fs from 'fs';
import path from 'path';
import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
return {
plugins: [
react(),
],
...
});
4.4. tsconfig.json ์ถ๊ฐ
ํ์ ์คํฌ๋ฆฝํธ๊ฐ vite์ ๋ํด์ ์ธ์ํ ์ ์๋๋ก ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.

4.5. index.html ์์ ๋ฐ %PUBLIC_URL% ์ ๊ฑฐ




์ถ๊ฐ์ ์ธ ๋ฒ๋ค๋ง ๊ณผ์ ์์ด index.html ํ์ผ์ด ์ฑ์ ์ง์ ์ ์ด ๋๊ฒ๋ ํ๊ธฐ ์ํ ์์ ์ ๋๋ค.
4.6. EVN ํ๊ฒฝ ๋ณ์ ์ค์
vite-env.d.ts ํ์ผ์ ํ์ํ ํ๊ฒฝ ๋ณ์ํ์ ์ ์ถ๊ฐํ์ต๋๋ค.
<typescript />
/// <reference types="vite/client" />
/// <referencetypes="vite-plugin-svgr/client" />
interface ImportMetaEnv {
readonly VITE_SKIP_PREFLIGHT_CHECK: string;
readonly VITE_REACT_APP_VERSION: string;
readonly VITE_ALPHA_PUBLIC_KEY: string;
readonly VITE_PROD_PUBLIC_KEY: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}


4.7. CommonJS -> ES Module
๊ธฐ์กด ์ฝ๋์์ CJS ๋ฌธ๋ฒ์ผ๋ก ๋์ด์๋ ๋ถ๋ถ๋ค์ ์ฐพ์์ ESM ๋ฌธ๋ฒ์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ์์ต๋๋ค.



5. ๐ก ํธ๋ฌ๋ธ์ํ
Vite์ ํ์ํ ์ค์น ๋ฐ ์ค์ ์ ํด์ค ๋ค์ CRA ํ๊ฒฝ์์๋ ๋ฐ์ํ์ง ์์์ง๋ง Vite ํ๊ฒฝ์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ๋ค์ด์์ต๋๋ค.
์ฃผ์ ์ํฉ๋ค์ ๋ํด์ ์ํฉ, ์์ธ, ํด๊ฒฐ 3๊ฐ์ง ์น์ ์ผ๋ก ์ ๋ฆฌํด ๋ดค์ต๋๋ค.
5.1. ๋งํฌ๋ค์ด(.md)ํ์ผ import ์ด์ ๋ฐ์
5.1.1. ์ํฉ

.mdํ์ผ์ ๋ํด์ import ํ๋๋ฐ ์ฒ๋ฆฌํ์ง ๋ชปํ์ฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด์์ต๋๋ค.
5.1.2. ์์ธ
Vite๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ํ์ ํ์ผ๋ง ์ฒ๋ฆฌํฉ๋๋ค.
CRA์์๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๋ณ๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์์ต๋๋ค.
5.1.3. ํด๊ฒฐ
vite.config.ts ํ์ผ์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.

.md ํ์ฅ์๋ฅผ ๊ฐ์ง ๋ชจ๋ ํ์ผ์ ์ ์ ์์ฐ(static asset)์ผ๋ก ์ฒ๋ฆฌ ํ๋ ค๊ณ ์ง์ํ๋ ๋ฌธ๋ฒ์ ๋๋ค.
.md ํ์ผ์ import ํ ๋ Vite๊ฐ ์ด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ ๊ณตํฉ๋๋ค.
https://stackoverflow.com/questions/73459654/import-markdown-files-dynamically-with-vite
Import markdown files dynamically with Vite
I'm looking for a solution that lets me render markdown dynamically, based on the query string. At the moment I render markdown like this, in React + Vite: import some other stuff... import { usePa...
stackoverflow.com
5.2. pdfjs-dist ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ จ ์ด์ ๋ฐ์
5.2.1. ์ํฉ

์ ํฌ ์๋น์ค์๋ ์๋๋ฐฉ์๊ฒ ๋ฌธ์์ ๋ํ ํ๋ฉด ๊ณต์ ํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
ํ์ง๋ง Vite๋ก ์ ํํ ๋ค PDF ๋ฌธ์์ ๋ํด์ ํ๋ฉด์ ๊ณต์ ๋ฅผ ์์ํ ์ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
5.2.2. ์์ธ
CRA๋ ์นํฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์นํฉ์ PDF.js์ worker ํ์ผ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฒ๋ค๋ง ํฉ๋๋ค.
Vite๋ ESM์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ํ๋ก์ธ์ค๊ฐ CRA/webpack๊ณผ๋ ๋ค๋ฆ ๋๋ค.
5.2.3. ํด๊ฒฐ

GlobalWorkerOption์ ๋ํด ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ์ต๋๋ค.
https://github.com/mozilla/pdf.js/issues/10478
No "GlobalWorkerOptions.workerSrc" specified. ยท Issue #10478 ยท mozilla/pdf.js
if (!fallbackWorkerSrc && typeof document !== 'undefined') { var pdfjsFilePath = document.currentScript && document.currentScript.src; if (pdfjsFilePath) { fallbackWorkerSrc = pdfjsFilePath.replace...
github.com
5.3. mediapipe ํธํ ์ด์
5.3.1. ์ํฉ

๊ธฐ๋ฅ ์ค์ ์นด๋ฉ๋ผ ํ๋ฉด์ ๋ํด์ ์ฌ์ฉ์ ์ผ๊ตด ์ค์ ๋ง์ถ๊ธฐ ๊ธฐ๋ฅ์ด ์กด์ฌํ์ต๋๋ค.
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ ๊ธฐํ๊ฒ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋์์ ๋์์ผ๋, ๋ฐฐํฌ ํ๊ฒฝ(preview)์์๋ง ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด์์ต๋๋ค.
5.3.2. ์์ธ
์ ํฌ ์ฌ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ mediapipe ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
mediapipe ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋์ด CJS ๋์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ESM์ ์ ์ ๋ถ์๊ณผ ํธํ์ด ๋์ง ์๋ ๊ฒ์ผ๋ก ํ์ ํ์ต๋๋ค.
mediapipe ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ ๋ด๋ณด๋ด๊ธฐ ๋ฐฉ์์ด esbuild์์๋ ๋ฌธ์ ์์ด ์ฒ๋ฆฌ๋์์ง๋ง, rollup์ ๋ ์๊ฒฉํ ์ฒ๋ฆฌ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ๋ถ์ํ์ต๋๋ค.
5.3.3. ํด๊ฒฐ
vite-plugin-mediapipe.ts ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด ์คฌ์ต๋๋ค.
<typescript />
// vite-plugin-mediapipe.ts
import { PluginOption } from 'vite';
import path from 'path';
import fs from 'fs';
/**
* MediaPipe ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ESM ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ Vite ํ๋ฌ๊ทธ์ธ
*/
export const mediapipe = (config?: Record<string, string[]>): PluginOption => ({
name: 'mediapipe',
load(id) {
const MEDIAPIPE_EXPORT_NAMES: Record<string, string[]> = {
'camera_utils.js': ['Camera'],
'drawing_utils.js': ['clamp', 'drawLandmarks', 'drawConnectors', 'drawRectangle', 'lerp'],
'holistic.js': [
'Holistic',
'FACE_GEOMETRY',
'FACEMESH_LIPS',
'FACEMESH_LEFT_EYE',
'FACEMESH_LEFT_EYEBROW',
'FACEMESH_LEFT_IRIS',
'FACEMESH_RIGHT_EYE',
'FACEMESH_RIGHT_EYEBROW',
'FACEMESH_RIGHT_IRIS',
'FACEMESH_FACE_OVAL',
'FACEMESH_CONTOURS',
'FACEMESH_TESSELATION',
'HAND_CONNECTIONS',
'POSE_CONNECTIONS',
'POSE_LANDMARKS',
'POSE_LANDMARKS_LEFT',
'POSE_LANDMARKS_RIGHT',
'POSE_LANDMARKS_NEUTRAL',
'matrixDataToMatrix',
'VERSION',
],
'face_detection.js': ['VERSION', 'FaceDetection'],
...config,
};
const fileName = path.basename(id);
if (!(fileName in MEDIAPIPE_EXPORT_NAMES)) return null;
let code = fs.readFileSync(id, 'utf-8');
for (const name of MEDIAPIPE_EXPORT_NAMES[fileName]) {
code += `exports.${name} = ${name};`;
}
return { code };
},
});
MediaPipe ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ Vite ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
1. MediaPipe ํ์ผ์ ์ฝ์ต๋๋ค.
2. ํ์ํ ๊ฐ์ฒด์ ํจ์๋ฅผ ๋ช
์์ ์ผ๋ก ๋ด๋ณด๋ด๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
3. ์์ ๋ ์ฝ๋๋ฅผ Vite์ ์ ๋ฌํฉ๋๋ค.
์ด๋ฅผ ํตํด ํ๋ก๋์
๋น๋ ์์๋ MediaPipe ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ก๋๋๊ณ ์ฌ์ฉ๋ ์ ์๊ฒ ๋์์ต๋๋ค.
<typescript />
// vite.config.ts
import { mediapipe } from './config/vite-plugin-mediapipe';
export default defineConfig(({ mode }) => {
return {
plugins: [
react(),
...
mediapipe(),
...
https://github.com/google/mediapipe/issues/4120
Vite build is prepending undefined variables to @mediapipe deps in production /dist/index.js file ยท Issue #4120 ยท google-ai-ed
OS Platform and Distribution node:16.18-alpine official docker image Compiler version No response Programming Language and version JavaScript Installed using virtualenv? pip? Conda?(if python) No r...
github.com
6. โจ ์ถ๊ฐ ์ฝ๋ ๊ฐ์
๋ง์ด๊ทธ๋ ์ด์ ์ธ์ ์ด ์ฐธ์ ์ถ๊ฐ๋ก ๊ฐ์ ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์์ ์ฝ๋๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
6.1. ์๋๊ฒฝ๋ก โก๏ธ ์ ๋ ๊ฒฝ๋ก
6.1.1. ๊ธฐ์กด ๋ฌธ์ ์

์์ ๊ฐ์ด depth๊ฐ ๋ง์์ง์๋ก ๊ฐ๋ ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๋ ์ํฉ์ด์์ต๋๋ค.
6.1.2. ๊ฐ์
<typescript />
// vite.config.ts
resolve: {
alias: {
'@apis': path.resolve(__dirname, 'src/apis'),
'@assets': path.resolve(__dirname, 'src/assets'),
'@components': path.resolve(__dirname, 'src/components'),
'@constants': path.resolve(__dirname, 'src/constants'),
'@hooks': path.resolve(__dirname, 'src/hooks'),
'@libs': path.resolve(__dirname, 'src/libs'),
'@modules': path.resolve(__dirname, 'src/modules'),
'@pages': path.resolve(__dirname, 'src/pages'),
'@services': path.resolve(__dirname, 'src/services'),
'@styles': path.resolve(__dirname, 'src/styles'),
'@templates': path.resolve(__dirname, 'src/templates'),
'@utils': path.resolve(__dirname, 'src/utils'),
...
},
},
<typescript />
// tsconfig.json
...
"baseUrl": ".",
"paths": {
"react": ["./node_modules/@types/react"],
// "@/*": ["src/*"],
"@apis/*": ["src/apis/*"],
"@assets/*": ["src/assets/*"],
"@components/*": ["src/components/*"],
"@constants/*": ["src/constants/*"],
"@hooks/*": ["src/hooks/*"],
"@libs/*": ["src/libs/*"],
"@modules/*": ["src/modules/*"],
"@pages/*": ["src/pages/*"],
"@services/*": ["src/services/*"],
"@styles/*": ["src/styles/*"],
"@templates/*": ["src/templates/*"],
"@utils/*": ["src/utils/*"]
}
์์ ๊ฐ์ด ์ ๋๊ฒฝ๋ก ๊ด๋ จ ์ฝ๋๋ฅผ ์ค์ ํด ์ฃผ์์ต๋๋ค.

์ด์ depth์ ์๊ด์์ด src ํด๋ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊น๋ํด์ง ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๋ชจ๋ ์ฝ๋๋ค์ ๋ํด์ ๋ณ๊ฒฝํด ์ฃผ์์ต๋๋ค.
6.2. ๋ถํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ฑฐ

ํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉ๋์ง ์๊ณ , ๋์ฒด ๊ฐ๋ฅํ ๊ฒ๋ค์ ๋ํด์ ๋ฆฌ์คํธ์ ์ ํ๊ณ ์ ๊ฑฐ๋ฅผ ์งํํ์ต๋๋ค.
์ด์ ๊ด๋ จํด์๋ ํน์๋ ์ ์ฌ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๊ฑฐ๋, ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์์ฒ๋ผ ๋ฆฌ์คํธ์ ์ ํ๊ณ ํ์๋ถ๋ค๊ป ํ ๋ฒ ๋ ํ์ธ์ ๋ฐ๊ณ ์ ๊ฑฐ๋ฅผ ์งํํ์ต๋๋ค.
์ด 27๊ฐ์ ๋ถํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
7. โ ์ฑ๋ฅ ๋น๊ต ๋ฐ ๊ฐ์ ๊ฒฐ๊ณผ
์ด๋ ํ ์์ ์ ํ๋์ง ๋์ดํด๋ณด์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- Vite ์ ํ, config ์ค์
- ๋ถํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ 27๊ฐ ์ ๊ฑฐ ๋ฐ ๋์ฒด
- CRA ์์กด์ฑ ์ ๊ฑฐ
- ๋ ๋๋ง ๋ฌธ์ ์ฝ๋ ์์
- ์๋ ๊ฒฝ๋ก โก๏ธ ์ ๋๊ฒฝ๋ก ๋ณ๊ฒฝ
- ๊ฐ๋ฐ ํ๊ฒฝ ์คํ ์ ํฐ๋ฏธ๋์์ proxy ์๋ฒ ์ ํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ ์ถ๊ฐ
- defaultProps โก๏ธ defaultParameter ๋์ฒด
- react-query ๋ด๋ถ์ ๋ถํ์ํ useState ์ ๊ฑฐ ๋ฐ ๋์ฒด
ํ์ฌ ๊ธ์ ์์ฑ๋ ๊ฒ ์ธ์ ๋ ์ถ๊ฐ์ ์ธ ์์ ์ด ์กด์ฌํ์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ธก์ ํญ๋ชฉ | CRA(webpack) | Vite(rollup, esbuild) | ๊ฐ์ ์จ |
๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ๋ ์๊ฐ | ์ฝ 20์ด | ์ฝ 200ms | ์ฝ 99.0% |
๋น๋ ์์ ์๊ฐ | ์ฝ 26์ด | ์ฝ 16์ด | ์ฝ 38.5% |
๋น๋๋ ํฌ๊ธฐ | ์ฝ 317MB | ์ฝ 222MB | ์ฝ 30.0% |
์ธก์ ํ๊ฒฝ์ m1 pro 16G์ด๋ฉฐ, ํ๊ท ๊ฐ์ ๋๋ค.
8. ๐ ๋ง์น๋ฉฐ
CRA์์ Vite๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํด๋ ๋๋์ง์ ๋ํด์ ํ์๋ถ๋ค์๊ฒ ๋จผ์ ์ ์์ ํ๋ ์ํฉ์ด์์ต๋๋ค.
๋คํํ ๋ชจ๋ ์ฐฌ์ฑ์ ํด์ฃผ์ จ๊ณ , ์ด์๊ฐ ํฐ์ก์ ๋ ๊ณต์ ๋ฅผ ํ๋ฉด ์ ๊ทน์ ์ผ๋ก ๋์์ฃผ์ ์ ์ฝ๊ฒ ํด๊ฒฐ์ ํ ์ ์์์ต๋๋ค.
์ด์ ๋ ๋ ์พ์ ํ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ํ ์ ์๊ฒ ๋์์ต๋๋ค!
์์ผ๋ก react-query ๋ฒ์ ์ , FSD ์ํคํ ์ฒ, recoil์์ jotai๋ก ๋ณํํ๋ ๋ฑ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ ํ๋ฉด ์ข๊ฒ ๋ค ํ๋ ๋ถ๋ถ๋ค์ด ์๋นํ ๋ง์๋ฐ ์๊ฐ์ด ๋ ๋๋ง๋ค ์กฐ๊ธ์ฉ ์งํ์ ํ ์ ์๋๋ก ํ๋ ค๊ณ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.