๐Ÿ“– Webpack ๊ณต๋ถ€ํ•˜๊ธฐ

์˜ค๋ฏผ์ค€ยท2023๋…„ 4์›” 27์ผ
1

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
9/9

๐Ÿ“˜ ์„œ๋ก 

๐Ÿ’ฌ Module์ด๋ž€?

๋ถ„๋ฆฌ๋œ ์ฝ”๋“œ์˜ ์กฐ๊ฐ, ์‹œ์Šคํ…œ์„ ์ด๋ฃจ๋Š” ๋…ผ๋ฆฌ์ ์ธ ์ผ๋ถ€๋ถ„

  • Javascript๋Š” ์›น ํŽ˜์ด์ง€์— ๋ณด์กฐ์ ์ธ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
  • ์›นํŽ˜์ด์ง€์—์„œ Javascript๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด Javascript ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค.
<script type="text/javascript" src="index.js></script>
  • ๋งŒ์•ฝ ํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด 2๊ฐœ์ด๊ณ  ๋‘ ํŒŒ์ผ์— ๊ฐ๊ฐ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๋ฉด?
<script type="text/javascript" src="index.js></script>
<script type="text/javascript" src="todo.js></script>

// index.js
var todo = "์„ธ์…˜ ์ค€๋น„ํ•˜๊ธฐ"

// todo.js
var todo = "๊ฟ€์ž ์ž๊ธฐ"
  • ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ javascript ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅผ๊ฒŒ ์—†๋‹ค.

  • ๋˜ํ•œ todo๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ์ „์—ญ ์Šค์ฝ”ํ”„๋ฅผ ์˜ค์—ผ์‹œํ‚ค๊ณ  ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Closure์˜ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฆ‰์‹œ์‹คํ–‰ ํ•จ์ˆ˜ ๋“ฑ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ ๋ชจ๋“ˆ ํŒจํ„ด์œผ๋กœ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ธ ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉฐ ์–ด๋Š ์ •๋„ ๊ทน๋ณต ๊ฐ€๋Šฅํ–ˆ๋‹ค.

var todoApp = (function () {
	var todo = "๊ฟ€์ž ์ž๊ธฐ"
    
    return {
    	getTodo: function() {
        return todo;
        }
    }
})();

console.log(todoApp.getTodo()); // "๊ฟ€์ž ์ž๊ธฐ"
console.log(todo); // ReferenceError: todo is not defined

๐Ÿ“— Modularization

๐Ÿ’ฌ ๋ชจ๋“ˆํ™”์˜ ํ•„์š”์„ฑ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‚ฌ์šฉํ• ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฒ”์šฉ์ ์ธ ์„œ๋ฒ„์‚ฌ์ด๋“œ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์›€์ง์ž„
  • ์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋“ˆํ™”๋ฅผ ํ•˜๊ณ  ์„œ๋กœ ํ˜ธํ™˜๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ๋‹ค.
  • ๋ชจ๋“ˆํ™”์˜ ๊ตฌ์„ฑ์š”์†Œ์—๋Š” ์Šค์ฝ”ํ”„, ์ •์˜, ์‚ฌ์šฉ์ด ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์€ ๋…๋ฆฝ์ ์ธ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ณ ,
๋ชจ๋“ˆ์„ ์ •์˜ํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ ,
์ •์˜๋œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ฌ commonJS

  • module.exports๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๊ณ , require๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ •์˜๋œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  •   module.exports
       require('./files.js')
  • ๋ชจ๋“  ํŒŒ์ผ์ด ๋กœ์ปฌ์— ์กด์žฌํ•˜๊ณ  ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•จ์„ ์ „์ œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” node.js๊ฐ€ commonJS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์—ฌ๋‹ด์œผ๋กœ,

  • ๋น„๋™๊ธฐ๋กœ๋„ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์›€์ง์ž„์œผ๋กœ ๋“ฑ์žฅํ•œ AMD(Asynchronous Module Definition)๊ณผ
  • AMD๊ธฐ๋ฐ˜์œผ๋กœ CommonJS ๋ฐฉ์‹๊นŒ์ง€ ์ง€์›ํ•˜๋Š” ํ†ตํ•ฉ ํ˜•ํƒœ์ธ UMD(Universal Module Definition)๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๐Ÿ“™ Webpack

  • commonJS์˜ ๋“ฑ์žฅ์œผ๋กœ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‚˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ†ตํ•ด ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Module Bundler๊ฐ€ ๋“ฑ์žฅํ•˜์˜€๋‹ค.

๐Ÿ’ฌ Module Bundler

  • ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งํ•œ๋‹ค.

๐Ÿ’ฌ Webpack

  • ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ธ ์›นํŒฉ์—์„œ๋Š” ๋ชจ๋“  ํŒŒ์ผ(HTML, CSS, ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ)์„ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒˆ๋“ค(bundle)๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

๐Ÿ’ฌ Webpack์˜ ๋™์ž‘ ๋ฐฉ์‹

  • Webpack์€ entry๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์˜์กด์„ฑ์„ ๋ถ„์„ํ•œ๋‹ค.
  • entry์—์„œ ์ •์˜ํ•œ ํŒŒ์ผ์„ ์‹œ์ž‘์œผ๋กœ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ , ์ด๋ฅผ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๋ฌถ์–ด ๋ฒˆ๋“ค๋งํ•œ๋‹ค.
  • ์ด๋•Œ, ๋กœ๋”(loader)์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin)์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํ˜•์‹(CSS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ๋ชจ๋“ˆ๋กœ ์ธ์‹ํ•˜๊ณ , ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ฌ Webpack์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  • entry : ์•ฑ์ด ๋ฒˆ๋“ค์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ง€์ ์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ index.js์—์„œ ์‹œ์ž‘ํ•ด import๋ฌธ์„ ๋”ฐ๋ผ ๋นŒ๋“œ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.
  • output : ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ์œ„์น˜ ๋ฐ ํŒŒ์ผ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ dist๋‚˜ build๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋”๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • module: ์›นํŒฉ์ด ๋ชจ๋“ˆ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™(rule)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • loader
    • ๊ธฐ๋ณธ์ ์œผ๋กœ javascript ๋ฐ JSON ํŒŒ์ผ๋งŒ ํ•ด์„์ด ๊ฐ€๋Šฅํ•œ Webpack์„ ๋‹ค๋ฅธ ํฌ๋ฉง์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
    • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” loader์—๋Š” css-loader, style-loader, file-loader๋“ฑ์ด ์žˆ๋‹ค.
  • plugin
    • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฒˆ๋“ค๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.
    • ๋‚œ๋…ํ™”๋‚˜ ํŠน์ • ๋ฌธ์ž์—ด ์น˜ํ™˜๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐœ๋ฐœ์šฉ api์™€ ๋ฐฐํฌ์šฉ api์ฃผ์†Œ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ์˜์กด์ ์ธ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” definePlugin์ด ์žˆ๋‹ค.
  • mode : production, development, none๋“ฑ ์›นํŒฉ์˜ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

๐Ÿ“• Webpack ์ตœ์ ํ™”

๐Ÿ’ฌ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ค„์ด๊ธฐ

๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๋Š” ์ด์œ 

  • ๋„คํŠธ์›Œํฌ ๋น„์šฉ : ํŒŒ์ผ์ด ๋ฌด๊ฑฐ์šธ์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.
  • ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ ๋น„์šฉ ์ค„์ด๊ธฐ
  • ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•„๋„ RAM์— ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ผ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•œ๋‹ค.

๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

  • Webpack mode
  • source map
  • code splitting
  • tree shaking
  • html, css ์ตœ์ ํ™”

๐Ÿ’ฌ ๋นŒ๋“œ ์†๋„ ์ค„์ด๊ธฐ

  • persistant cache ์‚ฌ์šฉํ•˜๊ธฐ
profile
ChatGPT-Driven Development๋ฅผ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค.

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