Webpack์—์„œ Vite๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ

zaetwo
  • #react
  • #vite
  • #esbuild
  • #swc

๊ธ€์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ

์›๋”์›” ์›น์€ Create React App(CRA)์˜ react-script 4๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ Webpack4๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค๋ง๋œ ํ”„๋กœ์ ํŠธ์—์„œ ์šด์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.(2022๋…„ 7์›”๋ถ€๋กœ NextJS๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.) ์ž…์‚ฌ ์ดˆ๊ธฐ์—๋Š” ๋ณ„๋‹ค๋ฅธ ๋ถˆํŽธํ•จ ์—†์ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ๋น ๋ฅด๊ฒŒ ํ™•๋Œ€๋˜๋ฉด์„œ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋„ ํ•จ๊ป˜ ์ปค์ง€๊ฒŒ ๋˜์—ˆ๊ณ  ์ด๋กœ ์ธํ•ด ๋Š๋ฆฐ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ถˆํŽธํ•จ์„ ๋Š๋ผ๋Š” ์ฃผ๋ณ€ ์ด์•ผ๊ธฐ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋“ค๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

state of js 2021 ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ ๋งŒ์กฑ๊ฐ ๋ถ€๋ฌธ 1์œ„๋ฅผ ์ฐจ์ง€ํ•œ Vite

Webpack์€ ์•„์ง๊นŒ์ง€ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์˜ ์ฃผ๋ฅ˜ ๋นŒ๋“œ ๋„๊ตฌ์ด๊ณ  ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์ง€๋งŒ, CRA์— ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ธ babel์€ Javascript๋ฅผ ์ด์šฉํ•œ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๋Š” ํƒœ์ƒ์˜ ํ•œ๊ณ„์ ์„ ๋„˜์ง€ ๋ชปํ•ด ์†๋„๋ฉด์—์„œ ๋’ค์ณ์งˆ ์ˆ˜ ๋ฐ–์— ์—†์œผ๋ฉฐ go๋ฅผ ์‚ฌ์šฉํ•œ esbuild, rust๋ฅผ ์‚ฌ์šฉํ•œ swc์™€ ๊ฐ™์ด ๋ณ‘๋ ฌ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์–ธ์–ด๋ฅผ ํ†ตํ•ด ๊ฐœ์„ ์„ ๊พ€ํ•˜๋Š” ๋„๊ตฌ๋“ค์ด ์ ์  ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด์— ์ €ํฌ ํ”„๋ก ํŠธ์—”๋“œํŒ€์€ Webpack์„ ๋ฉ”์ธ์œผ๋กœ esbuild ํ˜น์€ swc๋ฅผ ํ†ตํ•ด ๊ฐœ์„  ํ• ์ง€, Snowpack ํ˜น์€ Vite๋ฅผ ํ†ตํ•œ ๊ฐœ์„ ์„ ๊พ€ํ• ์ง€ ํšŒ์˜๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜์—ˆ๊ณ  Vite ๋„์ž…์„ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Vite๋กœ ๊ฐœ์„ ์„ ๊ฒฐ์ •ํ•˜๊ฒŒ๋œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • swc์™€ esbuild๊ฐ€ ์•„์ง ์•ˆ์ •์ ์ธ ๊ถค๋„์— ์˜ฌ๋ผ์˜ค์ง€ ์•Š์•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, babel ์˜์กด์„ฑ์„ ๊ฑท์–ด๋‚ด๊ธฐ ์–ด๋ ค์šด ๋ชจ๋“ˆ์ด ์กด์žฌ
  • Snowpack์˜ deprecated
  • Vite๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ „๋ฒˆ๋“ค๋ง์„ ํ†ตํ•œ ๋กœ์ปฌ ์Šคํƒ€ํŠธ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์ธ ๊ฐœ์„ ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ
  • Vite์˜ ๊ฐ„ํŽธํ•œ ์„ค์ •์„ ํ†ตํ•œ ๊ฐœ๋ฐœ ๋ฆฌ์†Œ์Šค ์ ˆ๊ฐ

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์ €ํฌ๋Š” Vite๋ฅผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ ๋นŒ๋“œ์‹œ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ‘์— ์ด์–ด์งˆ ๊ธ€์—์„œ๋Š” Vite์™€ react-script๋ฅผ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ๊ทธ ์ด์œ ๋Š” ๊ธ€์˜ ์ œ์ผ ํ•˜๋‹จ๋ถ€์— ์ ํžŒ ๊ฒฐ๋ก ์—์„œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.




Vite๋ž€?

์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ๋ผ๊ณ  ์ž์นญํ•˜๋Š” Vite๋Š” ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR์„ ๋‚ด์„ธ์šฐ๋ฉฐ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์—์„œ์˜ ์˜์—ญ์„ ํ™•์žฅํ•ด๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” Vue์˜ ์ฐฝ์‹œ์ž์ธ Evan You๊ฐ€ Vue ์ „์šฉ ๋นŒ๋“œ ๋„๊ตฌ๋กœ ๊ฐœ๋ฐœํ–ˆ์ง€๋งŒ, ํ˜„์žฌ๋Š” React, Svelte ๋“ฑ ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Vite๋Š” ESM ๊ธฐ๋ฐ˜์˜ ๋ฒˆ๋“ค๋ง๊ณผ, ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํ–ฅ์ƒ๋œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Webpack์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰์‹œ ์ „์ฒด ํŒŒ์ผ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ฐ˜๋ฉด, Vite๋Š” ์„ค์น˜์™€ ๋™์‹œ์— ์ˆ˜์ •์ด ์ž˜ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ESBuild๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•ด๋‘๊ณ , ์ˆ˜์ •์ด ์žฆ์€ ๋‚ด๋ถ€ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ esm์„ ์ด์šฉํ•˜์—ฌ ๋ฒˆ๋“ค๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒํ•˜์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ๊ณผ์ •์—์„œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋น ๋ฅธ ์†๋„๋ฅผ ๊ฐ€์ง„ esbuild๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ง€๋งŒ ๋นŒ๋“œ ๊ณผ์ •์—์„œ๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ CSS ๊ด€๋ จ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฏธ๋น„ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ์ž˜ ์ˆ˜ํ–‰ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” rollup์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.



๊ธฐ๋ณธ ์„ค์ •

yarn add -D vite @vitejs/plugin-react

Vite์™€ react ํ™˜๊ฒฝ์—์„œ Fast Refresh ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด react ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ๋‹จ์œ„์˜ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์•„๋งˆ ์ด ์ •๋„ ์„ค์น˜๋งŒ์œผ๋กœ๋„ Vite ์„ค์ •ํŒŒ์ผ์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


// <root>/vite.config.ts
import {defineConfig} from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
    plugins: [react()]
});

ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธํด๋”์— vite.config.ts์— react ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฃผ์ž…ํ•ด์ค€ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.


<!-- <root>/index.html -->
<html>
    <head>
        <link href="./public/manifest.json" rel="manifest" />
        <link href="./public/favicon.ico" rel="shortcut icon" />
    </head>
    <body>
        <!-- ... -->
        <div id="root"></div>
        <script type="module" src="/src/index.tsx"></script>
        <!-- ... -->
    </body>
</html>
// <root>/vite.config.ts
import {defineConfig} from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
    plugins: [react()],
    publicDir: false // vite์˜ public ํด๋” ์„ค์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
});

๋‹ค์Œ์€ Vite์—์„œ ์‚ฌ์šฉํ•  index.html ์ƒ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Vite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public์ด ์•„๋‹Œ root ํด๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ index.html์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, ESM ํ™œ์šฉ์„ ์œ„ํ•ด <script type=โ€moduleโ€></script> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž… ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ public ํด๋” ์„ค์ •์€ react-script์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ root/public ํด๋”์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ public ํด๋”์—๋Š” react-script์—์„œ ์‚ฌ์šฉํ•˜๋Š” index.html ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด Vite์˜ public ํด๋”์— ์กด์žฌํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ Vite config์—์„œ public ํด๋”๋ฅผ false ์ฒ˜๋ฆฌํ•˜๊ณ , public file๋“ค์˜ ๊ฒฝ๋กœ๋„ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.



ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

yarn add -D vite-plugin-env-compatible vite-plugin-checker

vite-plugin-env-compatible

  • Vite์—์„œ๋Š” process.env ๋Œ€์‹  import.meta.env ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • import.meta.env ๋Œ€์‹  ๊ธฐ์กด์ฒ˜๋Ÿผ process.env๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉํ•ด์„œ react-script์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.



vite-plugin-checker

  • Vite๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€ํ™˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ํƒ€์ž… ๊ฒ€์‚ฌ๋Š” ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. eslint ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ๊ณต์‹ ๋ฌธ์„œ์—๋Š” tsc โ€”noEmit์„ ํ†ตํ•ด build ํ”„๋กœ์„ธ์Šค์—์„œ์˜ ๊ฒ€์ฆ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ lint์™€ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.



config ํŒŒ์ผ์— plugin์ด ์ ์šฉ๋œ ๋ชจ์Šต

// <root>/vite.config.ts
import {defineConfig} from 'vite';
import react from '@vitejs/plugin-react';
import checker from 'vite-plugin-checker';
import envCompatible from 'vite-plugin-env-compatible';

export default defineConfig({
    publicDir: false,
    plugins: [react(), checker({typescript: true, eslint: {lintCommand: 'eslint ./src --ext .ts,.tsx'}}), envCompatible({prefix: 'REACT_APP'})]
});



์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋‚ด๋ถ€ ์ฝ”๋“œ alias ์ง€์ •

import path from 'path';

export default defineConfig({
    // ...
    resolve: {
        alias: {
            pages: path.resolve(__dirname, 'src/pages'),
            components: path.resolve(__dirname, 'src/components')
        }
    }
    // ...
});

์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค๋ฉด ์ง์ ‘ alias๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Webpack๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ๊ฐ’์—๋Š” alias ๋ช…์นญ, ๋ฐธ๋ฅ˜์—๋Š” resolve๋  ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.



Polyfill ์„ค์น˜

yarn add -D rollup-plugin-node-polyfills @esbuild-plugins/node-globals-polyfill

์ €ํฌ ํ”„๋กœ์ ํŠธ๋Š” Webpack4๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋˜ NodeJS ๋‚ด์žฅ ๋ชจ๋“ˆ ํด๋ฆฌํ•„์— ์˜์กดํ•˜๊ณ  ์žˆ๋˜ ์ฝ”๋“œ๋“ค์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. Vite์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํด๋ฆฌํ•„์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€ ์•Š์•˜๊ณ , ์ง์ ‘ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ์—๋„ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ , ์„ค์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” crypto๋ผ๋Š” NodeJS ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์ด๋ฅผ crypto-browserify๋ฅผ ์„ค์น˜ ํ›„ ๋Œ€์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ ์„ค์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ํด๋ฆฌํ•„์„ ์„ค์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ๋Š” stream๊ณผ buffer์— ๋Œ€ํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์œผ๋ฉฐ ์ด๋ฅผ rollup๊ณผ esbuild ํด๋ฆฌํ•„ ์„ค์ •์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์™ธ์˜ ํด๋ฆฌํ•„๋“ค๋„ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋“ค์–ด๊ฐ€ ์žˆ๊ธฐ ๋–„๋ฌธ์— ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import {NodeGlobalsPolyfillPlugin} from '@esbuild-plugins/node-globals-polyfill';
import rollupNodePolyFill from 'rollup-plugin-node-polyfills';

export default defineConfig({
    // ...
    build: {
        rollupOptions: {
            plugins: [rollupNodePolyFill()]
        }
    },
    resolve: {
        alias: {
            // ...
            stream: 'rollup-plugin-node-polyfills/polyfills/stream',
            buffer: 'rollup-plugin-node-polyfills/polyfills/buffer-es6'
        }
    },
    optimizeDeps: {
        esbuildOptions: {
            plugins: [
                NodeGlobalsPolyfillPlugin({
                    process: true,
                    buffer: true
                })
            ]
        }
    }
});



๊ฒฐ๋ก 

๊ฐ„๋‹จํ•œ ์„ค์ •

Vite๊ฐ€ ์ž์ฒด์ ์œผ๋กœ esbuild์™€ rollup ์„ค์ •์„ ์ œ๊ณตํ•ด์„œ ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ ๊ตฌ๋™์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ react-script์™€ ๋‹ฌ๋ฆฌ ์ž์ฒด์ ์œผ๋กœ config ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํƒ€์ž…๋„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด์„œ ์†์‰ฝ๊ฒŒ ์ปค์Šคํ…€ํ•œ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ์ž‘ ์†๋„ ๊ฐœ์„ 

๋ชฉํ‘œ๋กœ ํ–ˆ๋˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์€ ์•ฝ 40์ดˆ์—์„œ 1์ดˆ ๋‚ด์™ธ๋กœ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฉฐ ์†๋„ ๊ฐœ์„ ์— ์˜ํ–ฅ์„ ์ค€ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ๋“ค์€ node_modules/.vite/deps ํด๋”๋ฅผ ๋ณด๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋กœ์ปฌ์—์„œ๋งŒ Vite๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋œ ์ด์œ 

  • ๊ฐœ๋ฐœ ๋นŒ๋“œ์™€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vite์—์„œ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์„ค์ • ๊ฐ’์— ๋”ฐ๋ผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ๊ณผ์ •์—์„œ ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฒฝํ—˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ์‹œ๊ฐ„๊ณผ ๋ฒˆ๋“ค๋ง ๊ฒฐ๊ณผ์˜ ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๊ฐœ์„ ์ด ์˜๋ฏธ์žˆ์„ ์ •๋„๋กœ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์„ค์ •์„ ํ†ตํ•ด ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ๋‚จ์•„์žˆ์ง€๋งŒ ์ €ํฌ ํŒ€์€ ๊ณง์ด์–ด NextJS๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์‹œ๊ฐ„์„ ์Ÿ์„ ํ•„์š”๋ฅผ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๊ณ , ์ด๋ฏธ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ์ž‘ ์†๋„ ๊ฐœ์„ ์ด๋ผ๋Š” ์ตœ์šฐ์„  ๋ชฉํ‘œ๋ฅผ ๋น„๊ต์  ์†์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•˜์˜€๋‹ค๋Š” ์ ์—์„œ ๋งŒ์กฑํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.



๋งˆ๋ฌด๋ฆฌ

esbuild๋Š” ์•„์ง 0์ ๋Œ€ ๋ฒ„์ „์—์„œ๋„ ์ƒํƒœ๊ณ„๋ฅผ ๋œจ๊ฒ๊ฒŒ ๋‹ฌ๊ตฌ๊ณ  ์žˆ๊ณ , swc ๋˜ํ•œ vercel๊ณผ์˜ ํ˜‘๋ ฅ์„ ํ†ตํ•ด ํ•œ์ธต ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ฃผ๋ชฉ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋„๊ตฌ๋“ค์ด ๋‚˜์˜ฌ์ˆ˜๋ก ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์ด ๋งŽ์•„์ง€๊ธฐ๋„ ํ•˜์ง€๋งŒ ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ์ž๋ผ๋Š” ํƒ€์ดํ‹€์ด ๊ฐ€์ง„ ๋งค๋ ฅ์ด ์•„๋‹Œ๊ฐ€ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์˜ ๊ฒŒ์ž„ ์ฒด์ธ์ €๊ฐ€ ๋  ๋นŒ๋“œ ๋„๊ตฌ๋Š” esbuild๊ฐ€ ๋ ์ง€ swc๊ฐ€ ๋ ์ง€, ํ˜น์€ ์•„์ง ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋„๊ตฌ์ธ์ง€ ์•ž์œผ๋กœ์˜ ๊ณ„์† ๋ฐœ์ „ํ•ด๋‚˜๊ฐˆ ๋ฒˆ๋“ค๋ง ๋„๊ตฌ๋“ค์˜ ๊ท€์ถ”๊ฐ€ ์ฃผ๋ชฉ๋ฉ๋‹ˆ๋‹ค.



์ฐธ๊ณ ํ•ด๋ณด๋ฉด ์ข‹์„ ์ž๋ฃŒ

Vite: Rethinking Frontend Tooling
swc์™€ ์›น ๊ฐœ๋ฐœ์˜ ๋ฏธ๋ž˜

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ