Vue Study

ํšŒ์‚ฌ vue ํ”„๋กœ์ ํŠธ vite ์ ์šฉํ•˜๊ธฐ

eddie0329 2022. 1. 1. 19:26
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ชฉ์ฐจ

  • ์š”์•ฝ
  • ์„œ๋ก 
  • vite๋ž€?
  • vite ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ ์ ์šฉํ•˜๊ธฐ
  • ๊ฒฐ๋ก 

๐Ÿ“Œ ์š”์•ฝ

  ๊ธฐ์กด vite ์ ์šฉํ›„
build time 34897ms 548ms
re-build time 3310ms 100ms ์ดํ•˜

๐Ÿ“Œ ์„œ๋ก 

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ vite๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋А๊ผˆ๋˜ ์žฅ์ ๋“ค์„ ํ† ๋Œ€๋กœ ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ vite๋ฅผ ์ ์šฉ ํ•˜๋ฉด์„œ ํž˜๋“ค์—ˆ๋˜ ์ ๋“ค๊ณผ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ์„ ํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์žฌ๋ฐŒ๊ฒŒ ์ฝ์–ด์ฃผ์„ธ์š”! ๐Ÿ˜Ž

๐Ÿ“Œ vite ๋ž€?

๋จผ์ € ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— vite๊ฐ€ ์ƒ์†Œํ•˜์‹ค๊ฑฐ ๊ฐ™์•„ ๊ฐ„๋žตํ•˜๊ฒŒ vite์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

vite๋Š” ๋ฐ”์ดํŠธ ๋ผ๊ณ  ์ฝ์ง€ ์•Š๊ณ  ๋น„์ž๋ผ๊ณ  ์ฝ์–ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค. (๋น ๋ฅด๋‹ค๋Š” ๋œป์˜ ๋ถˆ์–ด๋ผ์„œ ์ด๋ ‡๊ฒŒ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.)
๊ทธ๋ฆฌ๊ณ  vite๋Š” ๊ธฐ์กด webpack, rollup, parcel ๊ณผ ๊ฐ™์€ bundler ๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ํˆด๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ server๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  hot-module-replacement๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์™œ๊ทธ๋Ÿด๊นŒ์š”?

vite๊ฐ€ ์—ฌํƒ€ ๋‹ค๋ฅธ ํˆด๋ณด๋‹ค ๋น ๋ฅธ ์ด์œ 

vite๊ฐ€ ๋น ๋ฅธ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ES modules๋ฅผ ์ง€์›ํ•จ์— ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๋ฒˆ๋“ค๋ง ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ฒŒ ๋˜์–ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด:

ES module๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•:

๊ทธ๋ฆผ์„ ๋ณด์‹œ๋ฉด ๊ธฐ์กด์—๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋ง์„ ํ•œ ํ›„์—๋‚˜ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘์ด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ๋œ ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„๋งŒ ์‹œ์ž‘ํ•œ ๋’ค์—๋‚˜ ํŒŒ์ผ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ›จ์”ฌ ๋น ๋ฅธ dev-server๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ vite ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ ์ ์šฉํ•˜๊ธฐ

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ์— ์•ž์„œ ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์„ค๋ช…์„ ํ•˜์ž๋ฉด ์ผ๋ฐ˜์ ์ธ vue framework ๋‚˜ mono-repo์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ํ™˜๊ฒฝ์ด ์„ค์ •์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

  1. vue๋ฅผ ์‚ฌ์šฉํ•˜๊ธด ํ•˜์ง€๋งŒ vue๋ฅผ ํ†ตํ•˜์—ฌ ssr์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. mono-repo์˜ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ถ„๋ฆฌ ๋˜์–ด์žˆ๋Š” shared ํด๋”๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ ธ์˜จ ๋’ค ํ˜น์€ alias๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์— ๋”ฐ๋ผ ์–ด๋ ค์› ๋˜ ์ ๋“ค๊ณผ ์ ์šฉ ๋ฐฉํ–ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. build๋Š” webpack์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ dev-server๋Š” vite๋ฅผ ์‚ฌ์šฉํ• ๊ฒƒ
  2. env.local ํŒŒ์ผ ๊ด€๋ฆฌ
  3. dynamic import
  4. .vue ์ต์Šคํ…์…˜ ์ฒ˜๋ฆฌ
  5. import.meta ์ฒ˜๋ฆฌ
  6. hmr ์ฒ˜๋ฆฌ

๊ทธ๋Ÿผ ์ด์ œ ๊ฐ ํ•ญ๋ชฉ์„ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณผ๊นŒ์š”?

1. build๋Š” webpack์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ dev-server๋Š” vite๋ฅผ ์‚ฌ์šฉํ• ๊ฒƒ

์™œ ๊ตณ์ด ๋‘๊ฐœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ฌผ์œผ์‹ ๋‹ค๋ฉด ์œ„์— ๋ง์”€ ๋“œ๋ ธ๋˜ ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์˜ ํŠน์ˆ˜์„ฑ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ssr๋ฅผ ์ง€์›ํ•ด์•ผํ•˜๋Š”๋ฐ vite์˜ ssr์ง€์›์ด ์•„์ง experimetal ๋‹จ๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— vue.confie.js๋ฅผ ๊ทธ๋ƒฅ ๋‚˜๋‘” ์ƒํƒœ์—์„œ vite.config.js๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ์กด vue.config.js๊ฐ€ ํ•˜๋Š” ๋ฐฉํ–ฅ๊ณผ ๋™์ผํ•˜๊ฒŒ vite.config.js๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ์ง€๋งŒ ๋ช‡๊ฐ€์ง€ ์„ธํŒ…์„ ๋”ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

export default defineConfig(({ mode, command }) => {
  return {
    define: {
      // ๋กœ์ปฌ์—์„œ๋งŒ vite๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ssr์„ ํ• ํ•„์š”๊ฐ€ ์—†์Œ์— ๋”ฐ๋ผ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ false๋กœ ํ•ด์คŒ
      'TARGET_NODE': false,
      // webpack์˜ hot-reloaded๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋นˆ object๋กœ ์„ค์ •
      'module': {}
    },
  };
});

2. env.local ํŒŒ์ผ ๊ด€๋ฆฌ

vite์˜ default mode๋Š” development ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  local์€ ๋ง‰ํ˜€์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.(+ ์ž๋™์ ์œผ๋กœ .env.local ํŒŒ์ผ์ด ์ถ”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.)
.env.local์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น mode๋ฅผ local๋กœ ํ•ด์ฃผ์–ด์•ผํ•˜์ง€๋งŒ ๋ง‰ํ˜€์ ธ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ ํ•ด๊ฒฐํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. vite ์ „์šฉ .env.local ๊ฐ™์€ ํŒŒ์ผ์„ ๋งŒ๋“ฌ(ex> .env.viteLocal, --mode=viteLocal)
  2. mode๋ฅผ ์ด์ƒํ•˜๊ฒŒ ์ฃผ์–ด์„œ .env.local ํŒŒ์ผ๋งŒ ์ž๋™ ์ž„ํฌํŠธ๋ฅผ ํ•˜๊ฒŒ ํ•จ

1๋ฒˆ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ .env ํŒŒ์ผ์ด 5๊ฐœ(.env, .env.local, .env.development, .env.stage, .env.production)๋‚˜ ์žˆ๋Š” ์ƒํ™ฉ ์ด์—ˆ๊ณ  .env.local์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด .env.viteLocal๋„ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์–ด์„œ 2๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์œผ๋กœ ์ด๋Ÿฐ ๋ช…๋ น์–ด๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

vite --mode eddie_is_the_best

3. router dynamic import

๋ณดํ†ต router์— dynamic import๋ฅผ ํ• ๋•Œ ์ด๋Ÿฐ์‹์˜ factory ํ•จ์ˆ˜๋กœ ๋งŽ์ด ์”๋‹ˆ๋‹ค.

const view = path => () => import(/* webpackChunkName: "arena" */ `@/views/pages/arena/${path}`);

ํ•˜์ง€๋งŒ ์ด๊ฒฝ์šฐ alias๊ฐ€ ์ด๋ฏธ ๋ถ™์–ด ์žˆ๊ธฐ ์ „์ด๋ผ @๋ฅผ ์ฝ์„์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

const view = path => () => import(/* webpackChunkName: "arena" */ `../views/pages/arena/${path}.vue`);

4. .vue ์ต์Šคํ…์…˜ ์ฒ˜๋ฆฌ

์ด๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๊ฑธ๋ ธ๋˜๊ฑฐ ๊ฐ™์•„์š”. vite์—์„œ๋Š” ์ด์ œ extension์„ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋ฉ๋‹ˆ๋‹ค. .js์™ธ์˜ ๋ชจ๋“  ํŒŒ์ผ๋“ค์„ import ํ• ๋•Œ ์ด์ œ extension์„ ๋ถ™์—ฌ ์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. (ex> .vue)

์•ˆ๋ถ™์—ฌ ์ฃผ๋ฉด ์ด๋ ‡๊ฒŒ ๋ชป์ฐพ๋Š” ๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ ์ž๋™์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋‚ด ์ด๋Ÿฐ๊ธ€์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ extension์„ ๋ถ™์—ฌ์ฃผ๋Š”๊ฒŒ legacy๋กœ ๋‚จ๊ฒŒ ๋ ๊ฒƒ์ด๊ณ  ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด legacy๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค๊ณ  ํŒ๋‹จ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ค ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋…ธ๊ฐ€๋‹ค๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.(์•ฝ 2000๊ฐœ์˜ ํŒŒ์ผ๋“ค ๋ชจ๋‘ ์ฐพ์•„๋‹ค๋‹ˆ๋ฉด์„œ ๋ถ™์—ฌ์คฌ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ญ) ์ฒ˜์Œ์—” ์ธํ…”๋ฆฌ์ œ์ด์˜ ํž˜์œผ๋กœ ์ •๊ทœ์‹์œผ๋กœ ํ•œ๋ฒˆ์— ๋ถ™์—ฌ๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ .js ์ธ์ง€ ๋‹ค๋ฅธ extension์ธ์ง€ ํŒ๋‹จ์„ ํ• ์ˆ˜๊ฐ€ ์—†์–ด ์ง์ ‘ ๋ถ™์—ฌ์คฌ์Šต๋‹ˆ๋‹ค.

5. import.meta ์ฒ˜๋ฆฌ

vite๋Š” import.meta์— ๊ด€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ webpack์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— webpack loader๋ฅผ ์ถ”๊ฐ€ ์‹œ์ผœ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

import.meta ์ฒ˜๋ฆฌ๊ฐ€ production ๋ชจ๋“œ ์ผ ๋•Œ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html lang="">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="/favicon.ico">
</head>
<body>
<div id="app"></div>
  <!-- built files will be auto injected -->
  <script type="module" src="/src/vite-hmr.js"></script> // ์‚ฝ์ž…!
</body>
</html>

๐Ÿšง ํ•ด๋‹น htmlํŒŒ์ผ์€ vite ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— webpack ์ผ๋•Œ๋Š” ์ ‘๊ทผ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

vite-hmr.js๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ˜Ž

6. hmr ์ฒ˜๋ฆฌ

๊ธฐ์กด์— asyncData๋Š” webpack.module.hot์—์„œ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

if (process.env.NODE_ENV === 'development' && module && module['hot']) {
    /** @type {{ addStatusHandler: (callback) => void }} */
    const hot = module['hot'];
    hot.addStatusHandler(status => {
      if (status === 'idle') {
        Vue.nextTick(async () => {
         // ... ์—ฌ๊ธฐ์„œ asyncData ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ์Œ
          }
        });
      }
    });
  }

๋™์ผํ•˜๊ฒŒ vite์˜ hmr๋„ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•ด๋‹น ์ฒ˜๋ฆฌ๋Š” vite:beforeUpdate ์ดํ›„์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— plugin์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

import { HmrContext } from 'vite';

const customHmrHandler = () => ({
  name: 'customHmrHandler',
  /**
   * @param {HmrContext} obj
   */
  handleHotUpdate({ server }) {
    setTimeout(() => {
      server.ws.send({
        type: 'custom',
        event: 'deferred-updated',
        data: {}
      });
    }, 250);
  },
});

export default customHmrHandler;

์ด์ œ ์ด๊ฑธ vite.config.js์— ์—ฐ๊ฒฐ ์‹œ์ผœ๋†“์•˜์Šต๋‹ˆ๋‹ค.

import customHmrHandler from '../../shared/vitePlugins/customHmrHandler';

export default defineConfig(({ mode, command }) => {
  return {
    plugins: [customHmrHandler()]
  }
}

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์‹ ํ˜ธ๋งŒ ๋ฐ›์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

// vite-hmr.js
if (import.meta.hot) {
    import.meta.hot.on('deferred-updated', () => {
        Vue.nextTick(async () => {
          // ... ์—ฌ๊ธฐ์„œ asyncData ์ฒ˜๋ฆฌ
          }
        });
    });
  }

์ด๋ถ€๋ถ„์„ ์ถ”ํ›„์— ๋‹ค์‹œ ๊ณ ๋ฏผ์„ ํ•ด๋ด์•ผ ํ• ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ณ„์† ์ฐพ์•„๋ณด๊ณ  ์ฝ”๋“œ๋„ ์—ด์‹ฌํžˆ ์ฐพ์•„๋ดค๋Š”๋ฐ after updated๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” event๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋‹จ vite.js์— issue๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„์š”์ฒญ์„ ํ•ด๋†“์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ISSUE ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“Œ ๊ฒฐ๋ก 

์ด์ œ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ์„ ํ• ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  ๊ธฐ์กด vite ์ ์šฉํ›„
build time 34897ms 548ms
re-build time 3310ms 100ms ์ดํ•˜

๊ธฐ์กด ์ฝ”๋“œ๋„ ๋ฆฌ๋‰ด์–ผ์„ ํ•œ๋ฒˆ ํ•ด์„œ ๋งŽ์ด ๋นŒ๋“œ ํƒ€์ž„์„ ๋‚ฎ์ถ˜ ์ƒํƒœ์˜€์ง€๋งŒ ์ด๊ฒƒ์œผ๋กœ ๋งŒ์กฑ์„ ํ• ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
์ €๋Š” ์กฐ๊ธˆ์˜ ๊ธฐ๋‹ค๋ฆผ์ด ์—†๋Š” ๊ทธ๋Ÿฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ์ƒ์‚ฐ์„ฑ๊ณผ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์žˆ๋Š” ๋ฌธ์ œ๋ผ ๊ผญ ํ•ด๊ฒฐ์„ ํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  vite๋กœ ํ•ด๊ฒฐ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๊ธด๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‡๐Ÿป‍โ™‚๏ธ

๋ฐ˜์‘ํ˜•