๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

typescript

TypeScript / Webpack

๋ฒˆ๋“ค๋Ÿฌ

์›น์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” asset(์Šคํฌ๋ฆฝํŠธ, ์Šคํƒ€์ผ์‹œํŠธ, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ๋ชจ๋‘ ๋ฌถ์–ด ์ตœ์ ํ™”๋œ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ๋กœ,

์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ด์ฃผ๋ฉฐ, ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ์œ ์šฉํ•˜๊ณ , ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ์˜์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

 

Webpack

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฐ€์ด๋“œ : https://webpack.kr/guides/typescript/

  • JS ์•ฑ์„ ์œ„ํ•œ ์ •์  ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ
  • ์—ฌ๋Ÿฌ ํŒŒ์ผ(js, css, html, ์ด๋ฏธ์ง€) ๋“ฑ์„ ๋ฒˆ๋“คํ•ด ํ•˜๋‚˜ ํ˜น์€ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๋„๊ตฌ
  • ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง / ๋กœ๋” / ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•จ

 


 

์‹ค์Šต

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์„ฑ

 

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "es6",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "outDir": "./dist",
    "noUncheckedIndexedAccess": true
  },
  "include": ["src"]
}

 

 

ํ„ฐ๋ฏธ๋„์—์„œ package.json ์ดˆ๊ธฐํŒŒ์ผ ์ƒ์„ฑ ํ›„ ts ๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ ์„ค์น˜

npm init -y
npm i --save-dev typescript

 

 

index.html์€ emmet ์•ฝ์–ด๋กœ html ๊ธฐ๋ณธ ํ‹€์„ ์ƒ์„ฑํ•œ๋‹ค.

 

dice.ts

export default class Dice {
  constructor(private sides: number) {}
  roll(): number {
    let number = Math.floor(Math.random() * this.sides) + 1;
    return number;
  }
}

 

index.ts

import Dice from './util/dice';

const labels = {
  button: '์ฃผ์‚ฌ์œ„ ๋˜์ง€๊ธฐ',
  div: '๊ฒฐ๊ณผ : ',
};

function main() {
  const button = document.createElement('button');
  const resultDiv = document.createElement('div');
  button.innerText = labels.button;
  document.body.append(button, resultDiv);

  const dice = new Dice(6);

  button.addEventListener('click', () => {
    resultDiv.innerText = `${labels.div}${dice.roll()}`;
  });
}

main();

 

 

์ด์ œ ์ง€๊ธˆ๊นŒ์ง€์˜ ์ฝ”๋“œ๋ฅผ webpack์œผ๋กœ ๋ฒˆ๋“ค๋ง์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•œ๋‹ค.

 

- webpack-cli : ํ„ฐ๋ฏธ๋„์—์„œ webpack์„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

- webpack-dev-server : ๊ฐœ๋ฐœ ์ค‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„ (์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ๋ฆฌํ”„๋ ˆ์‹œ๋จ)

- html-webpack-plugin : ๋ฒˆ๋“ค๋ง๋œ JsํŒŒ์ผ์„ ์ž๋™์œผ๋กœ html์— ์‚ฝ์ž…ํ•ด์คŒ

- ts-loader : tsํŒŒ์ผ์„ Webpack์—์„œ js๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋กœ๋”๋กœ tsconfig.json์„ ์ฐธ๊ณ ํ•ด ์ปดํŒŒ์ผํ•จ

npm i --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin ts-loader

 

 

๊ทธ๋ฆฌ๊ณ  https://webpack.kr/guides/typescript/ ์—์„œ webpack.config.js ์„ค์ •์„ ์•ˆ๋‚ดํ•ด์ฃผ๋Š”๋ฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

 

webpack.config.js (ํ”„๋กœ์ ํŠธ ํด๋” ์ตœ์ƒ๋‹จ์— ์œ„์น˜)

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: './src/index.ts',
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: 'src/index.html',
    }),
  ],
};

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ webpack-dev-server๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด package.json์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด

  "scripts": {
    "start": "webpack-dev-server --open --mode development",
    "build": "webpack --mode production"
  },

์ž˜ ์‹คํ–‰๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐฐํฌ์šฉ ๋นŒ๋“œํ•˜๊ธฐ๋Š” ์œ„์—์„œ ์ถ”๊ฐ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

npm run build

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ dist ํŒŒ์ผ ๋‚ด์— ์••์ถ•๋œ bundle.js์™€ index.html์ด ์ƒ์„ฑ๋œ๋‹ค.

 

 

'typescript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TypeScript / ํƒ€์ž… ์„ ์–ธ ํŒŒ์ผ  (4) 2025.06.10
TypeScript / ์ œ๋„ค๋ฆญ  (2) 2025.06.05
TypeScript / ํด๋ž˜์Šค  (0) 2025.06.05
TypeScript / ํƒ€์ž… ์ถ”๋ก , ํƒ€์ž… ๋‹จ์–ธ  (0) 2025.06.05
TypeScript / ํƒ€์ž…(2)  (0) 2025.06.04