Skip to content

Webpack

sang-gyeong lee edited this page Oct 27, 2020 · 1 revision

Webpack ๊ฐœ๋…์„ค๋ช… & ํ•„์š”์„ฑ

์›นํŒฉ์ด๋ž€?

๐Ÿ“• ์›นํŒฉ ํ•ธ๋“œ๋ถ - https://joshua1988.github.io/webpack-guide/ https://webpack.js.org/

Webpack is a module bundler. 
It allows you to write your code in as many separate files as you need
and creates a single output file for you to import into your html file.

์›นํŒฉ์ด๋ž€ ์ตœ์‹  ํ”„๋ŸฐํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š”ย ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ(Module Bundler)์ด๋‹ค.

๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ž€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž์›(HTML, CSS, Javscript, Images ๋“ฑ)์„ ๋ชจ๋‘ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ 

์ด๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿผย ๋ชจ๋“ˆ๊ณผย ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณด์ž.

๋ชจ๋“ˆ์ด๋ž€?

๋ชจ๋“ˆ์ด๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€์ ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ์ž‘์€ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์น˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“ˆ์ด๋‹ค.

// math.js
function sum(a, b) { return a + b;}
function substract(a, b) { return a - b;}
const pi = 3.14;
export { sum, substract, pi }

์ดย math.jsย ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ์ด๋‹ค.

  1. ๋‘ ์ˆซ์ž์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š”ย sum()ย ํ•จ์ˆ˜
  2. ๋‘ ์ˆซ์ž์˜ ์ฐจ๋ฅผ ๊ตฌํ•˜๋Š”ย substract()ย ํ•จ์ˆ˜
  3. ์›์ฃผ์œจ ๊ฐ’์„ ๊ฐ–๋Š”ย piย ์ƒ์ˆ˜

์ด์ฒ˜๋Ÿผ ์„ฑ๊ฒฉ์ด ๋น„์Šทํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋ชจ๋“ˆ์ด ๋œ๋‹ค.

์›นํŒฉ์—์„œ์˜ ๋ชจ๋“ˆ

์›นํŒฉ์—์„œ ์ง€์นญํ•˜๋Š” ๋ชจ๋“ˆ์ด๋ผ๋Š” ๊ฐœ๋…์€ ์œ„์™€ ๊ฐ™์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ž์›์„ ์˜๋ฏธํ•œ๋‹ค.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์ž‘ํ•˜๋ ค๋ฉด HTML, CSS, Javascript, Images, Font ๋“ฑ ๋งŽ์€ ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•˜๋‹ค. ์ด ํŒŒ์ผ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋ชจ๋‘ ๋ชจ๋“ˆ์ด๋‹ค.

๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์ด๋ž€?

์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช‡์‹ญ, ๋ช‡๋ฐฑ๊ฐœ์˜ ์ž์›๋“ค์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ณ‘ํ•ฉ ๋ฐ ์••์ถ• ํ•ด์ฃผ๋Š” ๋™์ž‘์„ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋นŒ๋“œ, ๋ฒˆ๋“ค๋ง, ๋ณ€ํ™˜ ์ด ์„ธ ๋‹จ์–ด ๋ชจ๋‘ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.

https://joshua1988.github.io/webpack-guide/assets/img/webpack-bundling.e79747a1.png

์ฆ‰, Webpack์€ ์˜์กด ๊ด€๊ณ„์— ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ด๋‹ค.

Webpack์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด ๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง๋˜๋ฏ€๋กœ ๋ณ„๋„์˜ ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ํ•„์š”์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์ˆ˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋ฏ€๋กœ html ํŒŒ์ผ์—์„œ script ํƒœ๊ทธ๋กœ ๋‹ค์ˆ˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๋„ ์‚ฌ๋ผ์ง„๋‹ค.

webpack์€ ํฌ๊ฒŒ module loader์™€ plugin์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

module loader

  • ๋ชจ๋“ˆ(image, js, jsx, css, sass..)์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ›„์— JavaScript๋กœ ๋ณ€ํ™˜
  • ex) jsx -> js๋กœ, ES6๋ฌธ๋ฒ•์ฝ”๋“œ -> ES5๋ฌธ๋ฒ•์ฝ”๋“œ๋กœ

plugin

  • ์ฃผ๋กœ ๋ฒˆ๋“ค๋œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹น
  • ํ•˜์ง€๋งŒ, loader์ฒ˜๋Ÿผ ๋ชจ๋“ˆ์˜ ๋‚ด์šฉ ์ˆ˜์ • ๊ฐ€๋Šฅ
  • Ex) html์— bundle.js๋ฅผ ์ถ”๊ฐ€, /dist ๋””๋ ‰ํ† ๋ฆฌ clear, bundleํŒŒ์ผ ์••์ถ•

์›นํŒฉ์ด ํ•„์š”ํ•œ ์ด์œ 

https://medium.com/js-imaginea/webpack-why-and-what-4948433cc2d3

๋งŽ์€ javascript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๊ฐ๊ฐ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์—†์• ์ฃผ๊ณ , entry point๋ถ€ํ„ฐ ๋ถ„์„ํ•ด์„œ, ์˜์กด๋˜๋Š” ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Webpack์€ ๊ฐ ํŒŒ์ผ์˜ ์ข…์†์„ฑ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ณ  ์ˆœํšŒ๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ ํ”„๋กœ๊ทธ๋žจ์€ ๋จผ์ € ๋ชจ๋“  ์ข…์†์„ฑ์— ๋Œ€ํ•œ ๊ฐ ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ชจ๋“  ๋ชจ๋“ˆ์˜ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค (๊ตฌ์„ฑ์—์„œ '์ถœ๋ ฅ'ํŒŒ์ผ๋กœ ์ง€์ •๋จ).
๋ชจ๋“  ๋ชจ๋“ˆ์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ˜ธ์ถœ / ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›นํŒฉ ๋’ค์—์žˆ๋Š” ๋™๊ธฐ๋Š” ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ž์‚ฐ๋„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฒˆ ๋“ค๋Ÿฌ๋Š” JS ํŒŒ์ผ ๋งŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์›นํŒฉ์€ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์ž์‚ฐ์„ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 
์ด๊ฒƒ์ด ๋กœ๋”๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. Webpack์€ ๋กœ๋”๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋กœ๋”๋Š” ๋ชจ๋“ˆ์˜ ์†Œ์Šค ์ฝ”๋“œ์— ์ ์šฉ๋˜๋Š” ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์„ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ธ๋ผ์ธ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ์ดํ„ฐ URL๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋“ฑ 
์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ๋ชจ๋“ˆ์—์„œ ์ง์ ‘ CSS ํŒŒ์ผ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

**์š”์•ฝํ•˜์ž๋ฉด, Webpack์€ ์„ค์ • ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜์—ฌ
JS ์™ธ์—๋„ CSS ๋ฐ ๊ธฐํƒ€ ํŒŒ์ผ ๋ฐ ์ž์‚ฐ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ๋ฒˆ๋“ค๋งํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
๋™์‹œ์— ๋ฐฉ๋Œ€ํ•œ ๊ตฌ์„ฑ ์˜ต์…˜ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์ž์œ ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.**

์›นํŒฉ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

์›นํŒฉ์ด ๋“ฑ์žฅํ•œ ์ด์œ ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ํŒŒ์ผ ๋‹จ์œ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ
  2. ์›น ๊ฐœ๋ฐœ ์ž‘์—… ์ž๋™ํ™” ๋„๊ตฌ (Web Task Manager)
  3. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ

#ํŒŒ์ผ ๋‹จ์œ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๊ด€๋ฆฌ

์ž…๋ฌธ์ž ๊ด€์ ์—์„œ ๊ณ ์•ˆ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํŽธ๋ฆฌํ•œ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

var a = 10;
console.log(a); // 10
function logText() { console.log(a); // 10
}

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๋ฒ”์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋„“์€ ๋ณ€์ˆ˜ ๋ฒ”์œ„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋””์—์„œ๋„ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•˜์ฃ .

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ์žฅ์ ์ด ์‹ค์ œ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

<!-- index.html -->
<html><head><!-- ... --> </head><body><!-- ... --> <script src="./app.js"></script><script src="./main.js"></script></body></html>
// app.js
var num = 10;
function getNum() { console.log(num);
}
// main.js
var num = 20;
function getNum() { console.log(num);
}

์œ„์™€ ๊ฐ™์ดย index.html์—์„œ ๋‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”?

<!-- index.html -->
<html>
	<head><!-- ... --> </head>
<body><!-- ... --> 
		<script src="./app.js"></script>

		<script src="./main.js"></script>

		<script> getNum(); // 20
		</script>
		
		</body>
</html>

๊ฒฐ๊ณผ๋Š” 20์ž…๋‹ˆ๋‹ค.ย app.js์—์„œ ์„ ์–ธํ•œย numย ๋ณ€์ˆ˜๋Š”ย main.js์—์„œ ๋‹ค์‹œ ์„ ์–ธํ•˜๊ณ  20์„ ํ• ๋‹นํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์€ ์‹ค์ œ๋กœ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ชจ๋‘ ๊ธฐ์–ตํ•˜์ง€ ์•Š์€ ์ด์ƒ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์˜๋„์น˜ ์•Š์€ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ฃ .

์ด์ฒ˜๋Ÿผ ํŒŒ์ผ ๋‹จ์œ„๋กœ ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ์š•๊ตฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆํ™”์— ๋Œ€ํ•œ ์š•๊ตฌ๋ฅผ ์˜ˆ์ „๊นŒ์ง„ย AMD,ย **Common.js**์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ’€์–ด์™”์Šต๋‹ˆ๋‹ค.

์›น ๊ฐœ๋ฐœ ์ž‘์—… ์ž๋™ํ™” ๋„๊ตฌ

์ด์ „๋ถ€ํ„ฐ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ˜๋ณตํ•˜๋Š” ์ž‘์—…์€ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์—์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ ๊ณ ์นจ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์•ผ ํ™”๋ฉด์— ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์ฃ .

์ด์™ธ์—๋„ ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์›น ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…๋“ค์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • HTML, CSS, JS ์••์ถ•
  • ์ด๋ฏธ์ง€ ์••์ถ•
  • CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ๋ณ€ํ™˜

์ด๋Ÿฌํ•œ ์ผ๋“ค์„ ์ž๋™ํ™” ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋“ค์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Grunt์™€ Gulp ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ

์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ 5์ดˆ ์ด๋‚ด๋กœ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋“ค์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ง‘์ค‘๋ ฅ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›น ์‚ฌ์ดํŠธ์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๋…ธ๋ ฅ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋Š” ํŒŒ์ผ ์ˆซ์ž๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์•ž์—์„œ ์‚ดํŽด๋ณธ ์›น ํƒœ์Šคํฌ ๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ๋“ค์„ ์••์ถ•ํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๋Š” ์ž‘์—…๋“ค์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‚˜์ค‘์— ํ•„์š”ํ•œ ์ž์›๋“ค์€ ๋‚˜์ค‘์— ์š”์ฒญํ•˜๋Š” ๋ ˆ์ด์ง€ ๋กœ๋”ฉ(Lazy Loading)์ด ๋“ฑ์žฅํ–ˆ์ฃ .

์›นํŒฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ž์›์€ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋•Œ ๊ทธ ๋•Œ ์š”์ฒญํ•˜์ž๋Š” ์ฒ ํ•™์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›นํŒฉ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ?

**์›นํŒฉ์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ**์—์„œ๋„ ์‚ดํŽด๋ดค์ง€๋งŒ ์›นํŒฉ์—์„œ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ์กด์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ 4๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„
  • ๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž์˜ ์ œ์•ฝ
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์˜ ๊ด€๋ฆฌ
  • Dynamic Loading & Lazy Loading ๋ฏธ์ง€์›

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„ ๋ฌธ์ œ

์›นํŒฉ์€ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„์˜ ๋ฌธ์ œ์ ์„ย ES6์˜ Modulesย ๋ฌธ๋ฒ•๊ณผ ์›นํŒฉ์˜ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž์˜ ์ œ์•ฝ

TCP ์ŠคํŽ™์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•œ ๋ฒˆ์— ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” HTTP ์š”์ฒญ ์ˆซ์ž๋Š” ์ œ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ํ‘œ๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ๋ณ„ ์ตœ๋Œ€ HTTP ์š”์ฒญ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, HTTP ์š”์ฒญ ์ˆซ์ž๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ค„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์„ ์•ž๋‹น๊ฒจ ์ค„ ์ˆ˜ ์žˆ์ฃ .

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5e4e6f5d-1db9-421a-b375-dce5d21b4154/_2020-09-22__5.28.59.png

โš ๏ธ ์•Œ์•„๋‘๋ฉด ์ข‹์•„์š”!

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € TCP/IP๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›นํŒฉ์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €๋ณ„ HTTP ์š”์ฒญ ์ˆซ์ž ์ œ์•ฝ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dynamic Loading & Lazy Loading ๋ฏธ์ง€์›

**Require.js**์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋™์ ์œผ๋กœ ์›ํ•˜๋Š” ์ˆœ๊ฐ„์— ๋ชจ๋“ˆ์„ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์   ์›นํŒฉ์˜ย Code Splittingย ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์›ํ•˜๋Š” ํƒ€์ด๋ฐ์— ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

webpack ์„ค์ •ํ•˜๊ธฐ

webpack์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ํŒŒ์ผ ์ƒ์„ฑ

npm init -y
npm i -D webpack webpack-cli

npm scripts์— ๋นŒ๋“œ ์ถ”๊ฐ€ ( build : webpack) -> npm run build ์‹œ ์›นํŒฉ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์›นํŒฉ์€ ์ตœ์†Œํ•œ์˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. webpack.config.js ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค์ž.

const path = require('path')
module.exports = { 
 mode: 'development',
 entry: {
			main: './src/app.js' 
	},
	output: {
			path: path.resolve('./dist'),
			filename: '[name].js' 
	}
}
  • mode - ๊ฐœ๋ฐœ์šฉ์ด๋ƒ ํ”„๋กœ๋•์…˜ ์šฉ์ด๋ƒ. ์šฐ๋ฆฌ๋Š” development๋กœ ํ•˜์ž.
  • entry -์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์‹œ์ž‘์ . ์›นํŒฉ์—์„œ ์•Œ๋ ค์ฃผ๋ฉด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”๊ฑธ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์—”ํŠธ๋ฆฌ์— ์‹œ์ž‘์ ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.
  • output์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด์„œ ์ €์žฅ์‹œํ‚ฌ ์œ„์น˜. ๋‘๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š”๋ฐ ํด๋” ์ด๋ฆ„๊ณผ ํŒŒ์ผ๋ช…์„ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
  • filename : [name].js => ์ด ๋ณ€์ˆ˜๋Š” ์—”ํŠธ๋ฆฌ์— ์„ค์ •ํ•œ ํ‚ค๊ฐ’์ด ๋“ค์–ด์˜ฌ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ main.js๊ฐ€ ๋งŒ๋“ค์–ด์งˆ๊ฒƒ

srcํด๋”์— app.js ๋งŒ๋“ค์–ด๋ณด์ž. ๋”์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ.

import { sum } from './math.js';
import './app.css'

window.addEventListener('DOMContentLoaded', () => {
    sum(1, 2);
    const el = document.querySelector('#app')
    el.innerHTML = `<h1>1+2 = ${sum(1,2)}</h1>`
})
export function sum(a, b) { 
	return a + b;
}

math.js์— sum์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ๋’ค, app.js์—์„œ math.js ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€๋ณด์ž.

์ดํ›„ npm run build ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด

distํŒŒ์ผ์— ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
    <script src="../dist/main.js"></script>
</body>

</html>

.open src/index.html์„ ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

https://blogfiles.pstatic.net/MjAyMDA5MjJfMjIg/MDAxNjAwNzQ3MzQ3NDUy.L7dyOUM4g6IeEMsl7sfq02ZDbtZDv6_cDD1L1rt-4j8g.g7kv_GIV09fMMboutApnB_SYZojpZtf4hlo9iLwr2B4g.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_1.02.17.png?type=w1


CSS ๋‹ค๋ฃจ๊ธฐ (css-loader, style-loader)

https://blogfiles.pstatic.net/MjAyMDA5MjJfMjY4/MDAxNjAwNzQ3MDU1NDE2.Kmcphorx_A7-GVHk5qAtpTQcu9p5B9kWADuPNlwnaY8g.DueCPeANPcNKkaQ5MDTRJKBZuvX448jCk1dU7NFcGoUg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_12.56.38.png?type=w1

์›นํŒฉ์€ CSSํŒŒ์ผ๋„ ๋ชจ๋“ˆ๋กœ ์ธ์‹ํ•œ๋‹ค. CSSํŒŒ์ผ๋„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋จธ์ง€๊ฐ€ ๋  ๊ฒƒ.

๊ทธ๋Ÿฌ๋ ค๋ฉด css๊ด€๋ จ๋œ ์›นํŒฉ ์„ค์ •์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด css-loader.

npm i -D css-loader ์œผ๋กœ ์„ค์น˜ํ•ด์ฃผ์ž.

๊ทธ๋‹ค์Œ์— ์›นํŒฉ ์„ค์ •์— ๋ชจ๋“ˆ์— ์„ค์ •์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

const path = require('path')

module.exports = {
    mode: 'development',
    entry: {
        main: './src/app.js'
    },
    output: {
        path: path.resolve('./dist'),
        filename: '[name].js'
    },
    module: {
        rules: [{
            test: /\.css$/,
            use: ['css-loader']
        }]
    }
}

app.css๋ฅผ ๋งŒ๋“ค์–ด body color ์ ์šฉ ๋’ค,

app.js์—์„œ ๊ฐ€์ ธ์™€๋ณด์ž import './app.css'

body { 
	background-color: pink;
}

๊ทธ๋’ค์— ๋นŒ๋“œ๋ฅผ ํ•ด๋ณด์ž.

ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธํ•˜๋ฉด ์—ฌ์ „ํžˆ ์ƒ‰์ƒ ์ ์šฉ์ด ์•ˆ๋๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„์ง ์ธ์‹์„ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—!

**์ด๋ฅผ ์œ„ํ•ด style-loader๋ฅผ ์„ค์น˜ํ•ด์ค˜์•ผํ•œ๋‹ค. (**npm i -D style-loader)

๊ทธ ๋’ค์— ์›นํŒฉ config module์— ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

module: { rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] }] }

๋‹ค์‹œ npm run build๋ฅผ ํ•˜๋ฉด ์ƒ‰์ƒ์ด ์ ์šฉ๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

https://blogfiles.pstatic.net/MjAyMDA5MjJfMzcg/MDAxNjAwNzQ5MjgzMTMy.H7FgA_rFSLNs3p8MtnWikG0bEgfW6E4qIW-9Luu1aOMg.Kp9c-EKn5_pgegYwvzyucpxnK1BNF9KfW4e2wJpAo0gg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_1.34.32.png?type=w1


์ด๋ฏธ์ง€ ํŒŒ์ผ ๋‹ค๋ฃจ๊ธฐ file-loader

์ด๋ฏธ์ง€๋ฅผ src๋กœ ๊ฐ€์ ธ์˜จ ๋’ค, app.js์—์„œ importํ•ด์ฃผ์ž.

๊ทธ ๋’ค์— ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•ด innerHTML์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

import { sum } from './math.js';
import './app.css'
import webpackImage from './webpack.png'

window.addEventListener('DOMContentLoaded', () => {
    const el = document.querySelector('#app')
    el.innerHTML = `
        <h1>1+2 = ${sum(1,2)}</h1>
        <img src="${webpackImage}" alt="webpack"/>`
})

์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋„๋ก ์›นํŒฉ ์„ค์ •์„ ํ•ด์ฃผ์ž (file-loader)

npm i -D file-loader

๋กœ ํŒŒ์ผ๋กœ๋”๋ฅผ ์„ค์น˜ํ•ด์ฃผ์ž.

๊ทธ ๋’ค์— ์›นํŒฉ์„ค์ •์—์„œ pngํ™•์žฅ์ž์— ๋Œ€ํ•ด ๋ชจ๋“ˆ ์„ค์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

const path = require('path')
module.exports = { mode: 'development', entry: { main: './src/app.js' }, output: { path: path.resolve('./dist'), filename: '[name].js' }, module: { rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.png$/, use: [{ loader: 'file-loader', options: { publicPath: '../dist' } }] } ] }
}

options :

publicPath : '../distโ€™ํ•˜๋ฉด

์ด๋ฏธ์ง€๋กœ ํ˜ธ์ถœํ• ๋–„ ๊ฒฝ๋กœ๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

npm run build๋ฅผ ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

https://blogfiles.pstatic.net/MjAyMDA5MjJfMTEz/MDAxNjAwNzUwMzk3NDUx.RTFbLsv_dqjUyFf5SIPR-e8J3uerqF8PXfs-Wtw4nyQg.10J624m128DIF0lQTVCamV2LnV4T0B9wwGdVtsGBNkQg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_1.53.00.png?type=w1


HTML ๋‹ค๋ฃจ๊ธฐ (html-webpack-plugin)

https://blogfiles.pstatic.net/MjAyMDA5MjJfMjY1/MDAxNjAwNzUwNDM3NDg0.5aPFt3Z-Kqsi0b9CwwEYpta38811E9FFnJE4FYVYE20g.rFB2EbQBPZLD-bGef3vPf4-OBMYisCc8vNdvyN2ONcwg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_1.53.43.png?type=w1

์ด ๋•Œ๋Š” ๋กœ๋”๊ฐ€ ์•„๋‹ˆ๋ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

npm i html-webpack-plugin -D

ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•จ์ˆ˜๋ผ์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ํ•„์š”.

webpack.config.js์— ์ƒ์„ฑ์ž ์ถ”๊ฐ€ํ•œ ๋’ค์— ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆ ์•„๋ž˜์— plugins๋ผ๋Š” ๋ฐฐ์—ด์„ ์ถ”๊ฐ€.

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
    mode: 'development',
    entry: {
        main: './src/app.js'
    },
    output: {
        path: path.resolve('./dist'),
        filename: '[name].js'
    },
    module: {
        rules: [{
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.png$/,
                use: [{
                    loader: 'file-loader',
                    options: {
                        name: '[name].[ext]?[hash]'
                    }
                }]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html'
        }),
        new CleanWebpackPlugin(),
    ]
}

์ธ์ž๋กœ ํ…œํ”Œ๋ฆฟํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

index.html์„ ๋ณด๋ฉด ๋กœ๋”ฉํ–ˆ๋˜ ์•„์›ƒํ’‹์˜ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์คฌ์—ˆ๋Š”๋ฐ

์ด์ œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ๋„ฃ์–ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•ด๋„ ๊ดœ์ฐฎ์Œ.

npm run buildํ•ด์ฃผ๋ฉด dist ํด๋”์— index.html์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ์ง€ ํ˜ธ์ถœํ• ๋•Œ path๋กœ dist๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ–ˆ์—ˆ๋Š”๋ฐ

์ด์ œ๋Š” index.html๋„ ์›นํŒฉ์ด ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

so options : publicPath๋ฅผ ์ œ๊ฑฐ ํ•ด์ฃผ์ž. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฏธ์ง€๋„ dist์— ์žˆ๋Š”๊ฑธ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๋‹ˆ๊นŒ ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•œ๋‹ค.

  • options: ๊ฒฐ๊ณผ๋ฌผ์˜ ์ด๋ฆ„์„ ํ•ด์‹œ๊ฐ’๋ณด๋‹ค๋Š” ์‹ค์ œ ํŒŒ์ผ๊ฐ’์œผ๋กœ ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
								test: /\.png$/,
                use: [{
                    loader: 'file-loader',
                    options: {
                        name: '[name].[ext]?[hash]'
                    }
                }]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ณธํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ํ™•์žฅ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ํŒŒ์ผ์„ ํ˜ธ์ถœํ• ๋•Œ ์ตœ์‹  ํŒŒ์ผ์„ ํ˜ธ์ถœ.

๊ทธ๋Ÿฌ๋ฉด dist ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„์ด ์›๋ณธ ํŒŒ์ผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ํ™•์ธ๊ฐ€๋Šฅ.

+ clean-webpack-plugin

https://blogfiles.pstatic.net/MjAyMDA5MjJfMTkz/MDAxNjAwNzUyMjY2NTg5.Aoh5IcCpDuGTEChlWKe-gU76qeuMorzucVpQ7Wf1diwg.5n-kGw70DttL_c4rZEIlIP1jGtVRZx6jjlM_h7w6ZGAg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_2.04.03.png?type=w1

์›นํŒฉ์œผ๋กœ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ•ด์‹œ ํŒŒ์ผ๋ช…์˜ ํŒŒ์ผ๋“ค์„ ์‚ญ์ œ๊ฐ€๋Šฅํ•˜๋‹ค.

npm i -D clean-webpack-plugin

์ƒ์„ฑํ›„({}๊ฐ์‹ธ์•ผํ•จ), plugins์ธ ์•„๋ž˜์— new CleanWebpackPlugin()

ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์•„์›ƒํ’‹์œผ๋กœ ์„ค์ •๋œ distํด๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์›นํŒฉ์„ ๋Œ๋ฆด ๊ฒƒ.

https://blogfiles.pstatic.net/MjAyMDA5MjJfOTIg/MDAxNjAwNzUyMzcyNTMz.sX8blboXLX8-AamceDSM77KXFsY542tqRm3xqn5NAcAg.VmlzUFG1QzQw-48C7vspR3iQCkuJVRs2D_4JUxQUhQsg.PNG.sknglee22/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7_2020-09-22_%EC%98%A4%ED%9B%84_2.26.06.png?type=w1

ํ•ด์‹œ๊ฐ€ ํŒŒ์ผ๋ช…์ธ ํŒŒ์ผ์ด ์‚ฌ๋ผ์ง€๊ณ  ๊น”๋”ํ•˜๊ฒŒ ํŒŒ์ผ ์ƒ์„ฑ๋œ๋‹ค!

(+) React ์›นํŒฉ ์„ค์ • ๋ฐฉ๋ฒ• (CRA X)

CRA์—†์ด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

Clone this wiki locally