Hot Reload (Webpack)

Hot Reload (Webpack)

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ ํ”„๋กœ์„ธ์Šค์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์€ TypeScript ์ปดํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ „ํ˜€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— webpack HMR (Hot-Module Replacement)์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค.

Installation

๋จผ์ € ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ž:

$ npm i --save-dev webpack webpack-cli webpack-node-externals ts-loader

Configuration

๊ทธ๋Ÿฐ ๋‹ค์Œ ์›นํŒฉ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ ์ธ webpack.config.js๋ฅผ ๋งŒ๋“ค์–ด ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

const webpack = require('webpack');
const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  entry: ['webpack/hot/poll?100', './src/main.ts'],
  watch: true,
  target: 'node',
  externals: [
    nodeExternals({
      whitelist: ['webpack/hot/poll?100'],
    }),
  ],
  module: {
    rules: [
      {
        test: /.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  mode: 'development',
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
  },
  plugins: [new webpack.HotModuleReplacementPlugin()],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'server.js',
  },
};

์ด ๊ตฌ์„ฑ์€ ์›นํŒฉ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋ช‡๊ฐ€์ง€ ํ•„์ˆ˜ ์‚ฌํ•ญ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์–ด๋””์— ์—”ํŠธ๋ฆฌ ํŒŒ์ผ์ด ์žˆ๊ณ , ์ปดํŒŒ์ผ ๋œ ํŒŒ์ผ์„ ๋ณด์œ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ์†Œ์Šค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•˜๋Š”์ง€. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ด ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ „ํ˜€ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Hot-Module Replacement

HMR์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด Nest ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ•ญ๋ชฉ ํŒŒ์ผ (main.ts)์„ ์—ด๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

declare const module: any;

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  await app.listen(3000);

  if (module.hot) {
    module.hot.accept();
    module.hot.dispose(() => app.close());
  }
}
bootstrap();

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด package.json ํŒŒ์ผ์˜ scripts์— ์ด ๋‘ ์ค„์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

"start": "node dist/server",
"webpack": "webpack --config webpack.config.js"

์ด์ œ ๋ช…๋ น ํ–‰์„ ์—ด๊ณ  ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค :

$ npm run webpack

์›นํŒฉ์ด ํŒŒ์ผ watch ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ช…๋ นํ–‰ ์ฐฝ์—์„œ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

$ npm run start

์‹ค์ œ ์‚ฌ๋ก€๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated

Was this helpful?