HMR(Hot Module Replacement): Vite vs Webpack ๋น๊ต ๐
HMR(Hot Module Replacement)์ ์น ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ด๊ธฐ ์ํ ๋๊ตฌ๋ก, ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ ๋ณ๊ฒฝ๋ ๋ชจ๋์ ์ฆ์ ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ , ์ํ๋ฅผ ์ ์งํ๋ฉด์ ์์ ์ ์ด์ด๊ฐ ์ ์์ฃ .
์ด๋ฒ ๊ธ์์๋ HMR์ด ๋ฌด์์ธ์ง, Vite์ Webpack์์์ HMR ๋์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ๋์ ์ฐจ์ด์ ๊ณผ ์ฅ๋จ์ ์ ๋น๊ตํด ๋ณผ๊ฒ์!
HMR์ด๋ ๋ฌด์์ธ๊ฐ์? ๐ค
HMR์ ๋ชจ๋ ์ ๋ฐ์ดํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฐ๋ฐ ๋๊ตฌ์ ๊ธฐ๋ฅ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ๊ณผ ๋ค๋ฅด๊ฒ, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๊ฐฑ์ ํ์ฌ ์ ์ฒด ์ํ๋ฅผ ์ด๊ธฐํํ์ง ์์ต๋๋ค.
HMR์ ํต์ฌ ๋ชฉํ
- ๋น ๋ฅธ ํผ๋๋ฐฑ: ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ํ์ธ ๊ฐ๋ฅ
- ์ํ ์ ์ง: ๋ธ๋ผ์ฐ์ ์์ ์ ์ง ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ํ(์: ์ ๋ ฅ ํผ ๊ฐ, ์คํฌ๋กค ์์น ๋ฑ)๋ฅผ ์ด๊ธฐํํ์ง ์์
- ๊ฐ๋ฐ ์๋ ํฅ์: ๋ถํ์ํ ์ฌ์์ ๊ณผ์ ์ ์ค์ฌ ์์ฐ์ฑ ์ฆ๊ฐ
Webpack์์์ HMR ๐ง
Webpack์ HMR์ ์ํ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ฒ๋ค๋ง ํ๋ก์ธ์ค ์ค ๋ณ๊ฒฝ๋ ๋ชจ๋์ ๊ฐ์งํ๊ณ , ์ด๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค.
Webpack HMR์ ์๋ ๋ฐฉ์
- ๋ณ๊ฒฝ ๊ฐ์ง: ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด Webpack Dev Server๊ฐ ์ด๋ฅผ ๊ฐ์ง
- ๋ฒ๋ค ๊ฐฑ์ : ๋ณ๊ฒฝ๋ ๋ชจ๋๋ง ๋ค์ ๋ฒ๋ค๋ง
- ๋ชจ๋ ์ ๋ฐ์ดํธ: ๋ณ๊ฒฝ๋ ๋ชจ๋๋ง ๋ธ๋ผ์ฐ์ ์ ํธ์. ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด UI ๊ฐฑ์
npm install webpack webpack-cli webpack-dev-server --save-dev
// webpack.config.js
module.exports = {
devServer: {
hot: true, // HMR ํ์ฑํ
},
};
์ฅ์
- ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์์ ์ ์ผ๋ก ๋์
- ๋ค์ํ ํ๋ฌ๊ทธ์ธ๊ณผ ๋ก๋๋ก ์ ์ฐ์ฑ ์ ๊ณต
๋จ์
- ๋ฒ๋ค๋ง ์๊ฐ์ด ๊ธธ์ด์ง์๋ก HMR ์๋๊ฐ ๋๋ ค์ง ์ ์์
- ํฐ ํ๋ก์ ํธ์์ ์ด๊ธฐ ๋ก๋๊ฐ ๋๋ฆด ๊ฐ๋ฅ์ฑ
Vite์์์ HMR โก๏ธ
Vite๋ HMR์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅํ๋ฉฐ, Webpack๊ณผ ๋ฌ๋ฆฌ ES ๋ชจ๋ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
Vite๋ ๋ฒ๋ค๋ง ์์ด ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์ ๊ณตํ๋ฏ๋ก HMR ์ฑ๋ฅ์ด ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
Vite HMR์ ์๋ ๋ฐฉ์
- ๋ณ๊ฒฝ ๊ฐ์ง: Vite๋ ํ์ผ ์์คํ ๋ณํ๋ฅผ ๊ฐ์ง
- ๋ชจ๋ ๊ฐฑ์ : ๋ณ๊ฒฝ๋ ๋ชจ๋์ ์ฆ์ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌ
- ๋ธ๋ผ์ฐ์ ๋ ๋ณ๊ฒฝ๋ ES ๋ชจ๋๋ง ๋ค์ ๋ก๋
- ์ํ ์ ์ง: ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์ํ๋ ์ ์ง๋จ
npm create vite@latest my-app
cd my-app
npm install
npm run dev
์ฅ์
- ๋ฒ๋ค๋ง์ด ์๊ธฐ ๋๋ฌธ์ HMR ์๋๊ฐ ๋์ ๋๊ฒ ๋น ๋ฆ
- ์๊ท๋ชจ ํ๋ก์ ํธ๋ถํฐ ๋๊ท๋ชจ ํ๋ก์ ํธ๊น์ง ์ ํฉ
๋จ์
- HMR์ด ES ๋ชจ๋์ ์์กดํ๋ฏ๋ก ๊ตฌํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ด ๋จ์ด์ง ์ ์์
Vite vs Webpack: HMR ๋น๊ต ๐ฅ
๊ธฐ์ค | Vite | Webpack |
๊ธฐ์ ๊ธฐ๋ฐ | ES ๋ชจ๋ ๊ธฐ๋ฐ์ ๋ค์ดํฐ๋ธ HMR | ๋ฒ๋ค ๊ธฐ๋ฐ HMR |
์๋ | ๋ฒ๋ค๋ง ์์ด ๋ณ๊ฒฝ๋ ๋ชจ๋๋ง ๋ก๋ํ์ฌ ๋งค์ฐ ๋น ๋ฆ | ๋ฒ๋ค๋ง์ ํฌํจํ์ฌ ์๋๊ฐ ๋๋ฆด ์ ์์ |
์ํ ์ ์ง | ๋ณ๊ฒฝ๋ ๋ชจ๋๋ง ์ ๋ฐ์ดํธ, ์ํ ์ ์ง ํ์ | ๋ณ๊ฒฝ๋ ๋ชจ๋๋ง ์ ๋ฐ์ดํธ, ๊ทธ๋ฌ๋ ๋ฒ๋ค๋ง ์๊ฐ ์ํฅ |
์ค์ | ๋ณ๋์ ์ค์ ํ์ ์์ | HMR ์ค์ ์ด ํ์ |
ํ๋ฌ๊ทธ์ธ ์ง์ | Vite ์ ์ฉ ํ๋ฌ๊ทธ์ธ ํ์ | ํ๋ถํ ์ํ๊ณ์ ๋ค์ํ ํ๋ฌ๊ทธ์ธ ์ง์ |
๋๊ท๋ชจ ํ๋ก์ ํธ | ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ฐ์ํ ์ฑ๋ฅ ์ ๊ณต | ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ด ๋๋ ค์ง ์ ์์ |
์ธ์ Vite์ Webpack์ ์ฌ์ฉํ ๊น? ๐ค
- Vite๊ฐ ์ ํฉํ ๊ฒฝ์ฐ
- ๋น ๋ฅธ HMR์ด ์ค์ํ ์๊ท๋ชจ ๋๋ ์ค์๊ท๋ชจ ํ๋ก์ ํธ
- ์ต์ ๋ธ๋ผ์ฐ์ ๋ง ํ๊ฒ์ผ๋ก ํ๋ ํ๋ก์ ํธ
- ๊ฐ๋ฐ ์ค ๋น ๋ฅธ ํผ๋๋ฐฑ์ด ํ์ํ ๊ฒฝ์ฐ
- Webpack์ด ์ ํฉํ ๊ฒฝ์ฐ
- ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ณต์กํ ์์กด์ฑ
- ์ค๋๋ ๋ธ๋ผ์ฐ์ ๊น์ง ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ
- ํ๋ฌ๊ทธ์ธ๊ณผ ๋ก๋๊ฐ ํ๋ถํ ์ํ๊ณ ํ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ
HMR ์ฌ์ฉ ์์ : React ๊ธฐ๋ฐ ํ๋ก์ ํธ
Webpack๊ณผ React
// webpack.config.js
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
},
plugins: [new ReactRefreshWebpackPlugin()],
};
Vite์ React
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
});
๊ฒฐ๋ก : Vite vs Webpack, HMR ์ต์ข ์ ๋ฆฌ
- ์๋ ์ค์ฌ์ด๋ผ๋ฉด Vite๊ฐ ํ์ํ ์ ํ
- ํ๋ฌ๊ทธ์ธ ํ์ฉ ๋ฐ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ง์์ด ์ค์ํ๋ค๋ฉด Webpack์ด ์ ํฉ
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น!๐ท