[Web] Webpack

hyeondoongeยท2023๋…„ 8์›” 24์ผ
0
post-thumbnail

๊ฐœ์š”

์‚ฌ์šฉ์ž๋“ค์˜ ์œ„์น˜์—์„œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฐฐํฌ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ  ์ด ๊ณผ์ •์„ ๋นŒ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋•Œ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ํ•˜๋‚˜๋กœ ์••์ถ•๋˜๊ฑฐ๋‚˜, ์ฝ”๋“œ ๋‚œ๋…ํ™”, ๋ชจ๋“ˆ์ด ๋ฐ”๋ฒจ์— ์˜ํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ์ผ์–ด๋‚œ๋‹ค.

Webpack์™ธ์—๋„ Vite, Rollup ๋“ฑ์˜ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ์š”์ฆ˜์—๋Š” ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„๋กœ ์œ ๋ช…ํ•œ vite๊ฐ€ ์‚ฌ์šฉ๋ฅ ์ด ์ ์  ๋†’์•„์ง€๋Š” ์ถ”์„ธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋ฅ ์€ webpack์ด ๋†’์€ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

vite๋ณด๋‹ค ๋” ์ผ์ฐ ๋“ฑ์žฅํ•œ webpack์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ๋Œ€ํ•ด์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ ๋‚˜๋ฉด vite๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์žํ•˜๋Š”์ง€ ๋˜ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋๋Š”์ง€, ์ฃผ์š”๊ธฐ๋Šฅ์€ ๋ฌด์—‡์ธ์ง€ ์–ด๋ ค์›€์—†์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์™œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

webpack๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ํฌ๊ฒŒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ 2๊ฐ€์ง€ ๊ด€์ ์—์„œ ์ด์ ์ด ์žˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
    • ๋ฒˆ๋“ค ์ƒ์„ฑ(์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์••์ถ•)์„ ํ†ตํ•ด HTTP ํ†ต์‹  ๋น„์šฉ์„ ๊ฐ์†Œ์‹œ์ผœ ๋น ๋ฅธ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ ์†๋„ ์ œ๊ณต
    • ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„ ํ–ฅ์ƒ
    • ๋น„๋™๊ธฐ ์ฒญํฌ ๋กœ๋”ฉ, Pre-fetching๋“ฑ์˜ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ
  • ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ
    • ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ
    • CSS, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋„ ๋ชจ๋“ˆ๋กœ์„œ ๊ด€๋ฆฌํ•˜์—ฌ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ
    • ECMAScript Modules, CommonJS ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ง€์›
      • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ESM๋งŒ ์ง€์›๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์™ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•˜์ง€๋งŒ webpack ์‚ฌ์šฉ ์‹œ ๋นŒ๋“œํƒ€์ž„์— ๊ฐ ๋ชจ๋“ˆ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์–ด๋Š ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•ด์„œ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘๋œ๋‹ค.

Entry, Output, Loader, Plugin

Entry

๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ. default๋Š” src/index.js๋กœ ์„ค์ •๋œ๋‹ค.

module.exports = {
	entry: "src/main.js"
}

Output

์ƒ์„ฑ๋œ ๋ฒˆ๋“ค(๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ)์„ ์„ค์ •ํ•˜๋Š” ๋ชจ๋“ˆ. ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ webpack์— ์„ค๋ช…ํ•œ๋‹ค. default๋Š” ./dist/main.js๋กœ ์„ค์ •๋œ๋‹ค.

const path = require('path');

module.exports = {
	output: {
		path: path.resolve(__dirname, 'dist');
		filename: 'webpack-bundle.js',
	}
}

Loader

webpack์€ javascript, JSONํŒŒ์ผ๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ๋“ค์— loader๋ฅผ ์ ์šฉ ํ•จ์œผ๋กœ์„œ webpack์ด ๊ฐ ๋ชจ๋“ˆ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•œ ํ›„์— ๋ฒˆ๋“ค์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ts๋ฅผ js๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๊ฑฐ๋‚˜, ์ƒ์œ„ ๋ฒ„์ „์˜ ๋ฌธ๋ฒ•์„ ํ•˜์œ„ ๋ฒ„์ „์˜ ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ๋Œ€์ƒ ๋ชจ๋“ˆ์— ์ ์šฉํ•œ๋‹ค.
ex) babel-loader, ts-loader, css-loader

  • babel-loader ์ ์šฉ ์˜ˆ์‹œ
module.exports = {
	module: { // ์‚ฌ์šฉํ•  loader๋“ค์„ ์„ ์–ธ
		rules: [
      {
        test: /\.(ts|tsx|js|jsx)$/, // ๋ณ€ํ™˜์„ ์ ์šฉํ•  ๋Œ€์ƒ
        use: 'babel-loader' // ์‚ฌ์šฉ๋  ๋กœ๋”
      }
    ]
	}
}

Plugin

ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ปดํŒŒ์ผ ๋™์•ˆ ์„œ๋กœ ๋‹ค๋ฅธ ์ง€์ ์—์„œ ์‹คํ–‰๋˜๋Š” ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํ›…์ด ์‹คํ–‰๋  ๋•Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ˜„์žฌ ์ปดํŒŒ์ผ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ชจ๋“  ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–๋Š”๋‹ค. Loader์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ค์ •ํŒŒ์ผ์— ์ ์šฉํ•  plugin์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” plugin ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•ด๋ณด์ž.

  • HTMLWebpackPlugin ์ ์šฉ ์˜ˆ์‹œ

template์„ ์ „๋‹ฌํ•˜๋ฉด, ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ž๋™์œผ๋กœ template์— ์‚ฝ์ž…ํ•ด์ฃผ์–ด์„œ ์•„์ฃผ ํŽธํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ด๋‹ค.

module.exports = {
	plugins: [new HtmlWebpackPlugin({ template: 'public/index.html' })]
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
	<!-- ์•„๋ž˜์™€ ๊ฐ™์ด index.html์— ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(/main.bundle.js)์„ ์ฃผ์ž… -->
  <script defer src="/main.bundle.js"></script>
	</head> 
  <body>
    <div id="root"></div>
  </body>
</html>
  • ProvidePlugin

๋ชจ๋“ˆ์„ import / require ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•œ๋‹ค.

์•„๋ž˜์˜ ๊ฒฝ์šฐ React identifier๋ฅผ ๋งŒ๋‚  ๋•Œ ๋งˆ๋‹ค react ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•œ๋‹ค. CRA ์‚ฌ์šฉ ์‹œ React๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ importํ•˜์ง€ ์•Š์•„๋„ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ, ์•„๋งˆ ProvidePlugin์ด ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •๋˜์–ด์žˆ์–ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค.

new webpack.ProvidePlugin({
	React: 'react'
});
function Page () {
  return <div>MyPage</div>
}

์ด์™ธ์—๋„ DefinePlugin(ํ™˜๊ฒฝ๋ณ€์ˆ˜์„ค์ •), BannerPlugin(๋ฒˆ๋“ค ์ƒ๋‹จ์— ์ง€์ •๋œ ๋ฌธ์ž์—ด ์‚ฝ์ž…) ๋“ฑ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ œ๊ณต๋œ๋‹ค.

Mode

webpack ์„ค์ • ์‹œ, mode ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์€ development | none | production ์ด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ตœ์ ํ™”ํ•ด์ค€๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด development์™€ production ๋ชจ๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉด, ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

  • production (default) ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋‚œ๋…ํ™”ํ•œ๋‹ค.
  • development ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œ๋œ๋‹ค.
  • none ์˜ต์…˜์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
$ webpack --config webpack.config.js --mode=production

์ถ”๊ฐ€์ ์œผ๋กœ mode์— ๋”ฐ๋ผ ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ์˜ต์…˜์˜ ๋‚ด์šฉ์ด ๋‹ค๋ฅผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด 2๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ argv๋ฅผ ํ†ตํ•ด mode์— ์ ‘๊ทผํ•˜๊ณ , ์ด ๊ฐ’์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

const config = {
  entry: './index.js',
  //...
};

module.exports = (env, argv) => {
  if (argv.mode === 'development') {
    config.devtool = 'source-map';
  }

  if (argv.mode === 'production') {
    //...
  }

  return config;
};

Advanced

Webpack-dev-server

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ œ๊ณตํ•œ๋‹ค.

์‚ฌ์šฉ์„ ์œ„ํ•ด ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ , server๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ npm install --save-dev webpack webpack-dev-server
$ webpack serve
  • ์„ค์ •์„ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” webpack ์„ค์ •ํŒŒ์ผ์˜ devServer ์†์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. static, historyApiFallback, proxy ๋“ฑ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€ ์„ค์ •์—†์ด ๊ฐ„๋‹จํ•œ ์•ฑ์„ ๊ตฌ๋™ํ•˜๋Š”๋ฐ ๋ฌธ์ œ ์—†์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ SPA๋ฅผ ์„œ๋น„์Šคํ•˜๋Š” ๊ฒฝ์šฐ historyApiFallback ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•ด์„œ ์–ด๋Š URL์ด๋“  index.html์„ ์‘๋‹ตํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ํŽ˜์ด์ง€์˜ route๊ฐ€ ๋™์ž‘๋˜๊ฒŒํ•ด์•ผํ•œ๋‹ค.
  • TIPโœจย dev-server ์‹คํ–‰์‹œ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธด ํ•˜๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜์ง€๋ชปํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ http://[devServer.host]/webpack-dev-server ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ํŒŒ์ผ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Devtool

  • source map ์ƒ์„ฑ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ด๋‹ค. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ์›๋ณธ ํŒŒ์ผ์„ ๋งคํ•‘ํ•ด ๋””๋ฒ„๊น… ์‹œ ๋ชจ๋“ˆ ์ •๋ณด ๋ฐ ๋ผ์ธ ์ •๋ณด๋ฅผ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์–ด, ๊ฐœ๋ฐœ ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.
  • ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋นŒ๋“œ ๋ฐ ๋ฆฌ๋นŒ๋“œ ์†๋„, ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ๋งคํ•‘ ์ •ํ™•๋„๋„ ๊ฐ source mapping ์Šคํƒ€์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

source map์˜ ์ข…๋ฅ˜
์ข…๋ฅ˜๊ฐ€ ๋งŽ์•„ ์–ด๋–ค source map์„ ๊ณจ๋ผ์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. Webpack ๊ณต์‹๋ฌธ์„œ์—์„œ ์ถ”์ฒœํ•˜๋Š” ๊ฑด, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ณด๋‹ค ์†๋„๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ๋ฐฐํฌ ๋ชจ๋“œ์—์„œ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋” ์ค‘์š”์‹œ ํ•˜๋ฏ€๋กœ ๊ฐ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ mapping ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • eval-*: ๋ชจ๋“ˆ๋ณ„๋กœ ์†Œ์Šค๋งต์„ ์ƒ์„ฑํ•˜์—ฌ eval์„ ํ˜ธ์ถœํ•ด bundle์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • eval ์†๋„๋Š” ๋น ๋ฅด๋‹ค. ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ์— ๋งคํ•‘๋˜์–ด ์ค„ ๋ฒˆํ˜ธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • eval-source-map ์ฒ˜์Œ ๋นŒ๋“œ๋Š” ๋Š๋ฆฌ์ง€๋งŒ, ์žฌ๋นŒ๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•œ๋‹ค. ์ค„ ๋ฒˆํ˜ธ๊ฐ€ ์›๋ณธ ์ฝ”๋“œ์— ๋งคํ•‘๋œ๋‹ค.
  • source-map ์ „์ฒด ์†Œ์Šค๋งต์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค. build, rebuild ์†๋„๊ฐ€ ๋Š๋ฆฌ์ง€๋งŒ ๊ณ ํ’ˆ์งˆ์ด๋‹ค. ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋ฐฐํฌ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์†Œ์Šค๋งต์„ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.
  • inline-*: ์†Œ์Šค๋งต์„ ๋ณ„๋„์˜ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์›๋ณธ ํŒŒ์ผ์— ์ธ๋ผ์ธ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

์—ฌ๋Ÿฌ devtools ์ค‘ eval-source-map ์œผ๋กœ ์„ค์ •ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋‹ค. (์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด ๋งŽ์ด ์ƒ๋žตํ–ˆ๋‹ค)

// bundle ์ฝ”๋“œ ์ผ๋ถ€

    /***/
            "./src/App.tsx": /*!*********************!*\\
      !*** ./src/App.tsx ***!
      \\*********************/
            /***/
            ((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{
                "use strict";
                eval(/* ์ƒ๋žต */ "//*#__PURE__*/React.createElement(\\"div\\", null, ms);\\n  }))\\n},
                     {\\n  path: _constants__WEBPACK_IMPORTED_MODULE_1__.ROUTE_LOGIN_URL,\\n
                     element: /*#__PURE__*/React.createElement(pages_LoginPage__WEBPACK_IMPORTED_MODULE_0__
                     [\\"default\\"], null)\\n}, {\\n path: '/',\\n  element: /*#__PURE__*/
                     /* ์ƒ๋žต */
                  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJn
                  //# sourceURL=webpack-internal:///./src/App.tsx\\n");
                /***/
            }
            ),

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด #sourceMappingURL์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ƒ์„ฑ๋œ source map์„ ์ฐธ์กฐํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ํฌํ•จ๋ผ์žˆ๋‹ค.

// ๊ฐ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ source map
{ "version":3,
  "file":"./src/App.tsx.js",
  "mappings":";;;;;;;;;;;;;;;AAAwC;AAC0C;AACH;AACxB;AACH;AACV;AACJ;AACQ;AACAAA.. // ...์ดํ•˜ ์ƒ๋žต
  "sources":["webpack:///./src/App.tsx?1c6d"],
  "sourcesContent":["import LoginPage from 'pages/LoginPage';\\nimport { ROUTE_FORM_URL, ROUTE_REQUESTS_URL, ROUT // ...์ดํ•˜ ์ƒ๋žต
  "names": ["LoginPage","ROUTE_FORM_URL","ROUTE_REQUESTS_URL","ROUTE_LOGIN_URL","RouterProvider","createBrowserRouter","AuthContextProvider","Reque // ...์ดํ•˜ ์ƒ๋žต
  "sourceRoot":""
}

์ฐธ๊ณ 

Webpack ๊ณต์‹๋ฌธ์„œ
introduction-source-maps

0๊ฐœ์˜ ๋Œ“๊ธ€