webpack

๐Ÿ“ฆ ์›นํŒฉ(Webpack) 1 | ์›นํŒฉ์˜ ๊ฐœ๋…, ๋ฒˆ๋“ค๋Ÿฌ(Bundler), ์›นํŒฉ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

grasinnong 2020. 12. 27. 18:54

 

 

 

 

์›น ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•  ๋•Œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด '์›นํŒฉ', ์›นํŒฉ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ํ•˜๋‚˜์˜ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” .sassํŒŒ์ผ(css), .jsํŒŒ์ผ, .htmlํŒŒ์ผ, .jpg ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ ์ˆ˜๋งŽ์€ ํŒŒ์ผ์ด ์ƒ๊ฒจ๋‚œ๋‹ค.

 

 

naver.com ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋”๋ผ๋„ ๊ต‰์žฅํžˆ ๋งŽ์€ JS,CSS, Img ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ํŒŒ์ผ์„ ์„œ๋ฒ„์™€ ๊ณ„์† ํ†ต์‹ ํ•˜๋ฉฐ ๋ฐ›์•„์˜ฌ ๊ฒฝ์šฐ, ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋А๋ ค์งˆ ๊ฒƒ์ด๋‹ค. 

 

 

๋˜ํ•œ, ๊ฐ™์€ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด, ๋ฎ์–ด์”Œ์›Œ์ง€๋Š” ๋“ฑ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค. 

 

๋ Œ๋”๋ง๋œ ํ™”๋ฉด

 

๋ฐ”๋กœ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„์ž…๋œ ๊ฐœ๋…์€ ๋ชจ๋“ˆ(module)์ด๋‹ค.  ์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์„ ๋ชจ๋“ˆ๋กœ ๋ฐ”๊พผ ํ›„, export, import๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. export๋œ word์˜ ๊ฐ’์€ ์˜ค์ง word๊ฐ€ ์ •์˜๋œ ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 

<script type="module">
  import hello_word from "./source/hello.js";
  import wolrd_word from "./source/world.js";
  
  document.querySelector("#root").innerHTML = hello_word;
</script>

let hello_word = "hello";

export default hello_word;

 

ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค. ์ผ๋‹จ import, export๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” ES6์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํ‚ค์›Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  index.html ํŒŒ์ผ์„ ์—ด๋ฉด ํŒŒ์ผ๋“ค์ด ๋ฐ›์•„์™€์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ๊ฐœ์˜ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋ฉด ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ ค์งˆ ๊ฒƒ์ด๋‹ค. 

 

์ด ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๋„๊ตฌ๋“ค์„ ๋ฒˆ๋“ค๋Ÿฌ(Bundler)๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

Bundle

* Bundle, ๋ฒˆ๋“ค์€ ์˜์–ด๋กœ ๋ฌถ์Œ์ด๋ผ๋Š” ๋œป์ด๋ฉฐ ๋ณดํ†ต ์ƒํ’ˆ์„ ๊ตฌ๋งคํ–ˆ์„ ๋•Œ ๋ผ์›Œ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. (ex ์Šค๋งˆํŠธํฐ์„ ์‚ฌ๋ฉด ์ฃผ๋Š” ์ด์–ดํฐ์ด๋‚˜ ์ถฉ์ „๊ธฐ ๋“ฑ์ด๋‹ค)

 

์›น ๊ฐœ๋ฐœ์—์„œ ๋งํ•˜๋Š” ๋ฒˆ๋“ค์€ ์ •์˜๋œ ๊ตฌ์กฐ์™€ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ฐ–๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ, ๊ฐœ๋…์ƒ ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. (Webpack, Broserify, Parcel, etc.)

 

 

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ ์›นํŒฉ์€ ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. 

 

 

 

 

์›นํŒฉ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์ด์ œ ์›นํŒฉ์„ ์‚ฌ์šฉํ•ด์„œ word ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž. 

 

1. node.js ํ”„๋กœ์ ํŠธ ์„ ์–ธํ•˜๊ธฐ 

npm init

package name๋งŒ ์ž…๋ ฅํ•ด์ฃผ๊ณ , ๋‚˜๋จธ์ง€๋Š” enter๋กœ ๊ธฐ๋ณธ์„ค์ •์„ ํ•ด์ฃผ๋ฉด package.jsonํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. 

* package.json : ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์„œ

* npm : ๋ชจ๋“ˆ ์Šคํ† ์–ด

 

 

 

2. webpack, webpack-cli ์„ค์น˜ํ•˜๊ธฐ 

npm install -D webpack webpack-cli 

 

 

package.json ํŒŒ์ผ์— ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

3. ์›นํŒฉ ์‹คํ–‰์‹œํ‚ค๊ธฐ

npx webpack --entry ./source/index.js --output-path ./public/index_bundle.js

์ด ๋ช…๋ น์–ด์˜ ๋œป์€ ์—”ํŠธ๋ฆฌ ํŒŒ์ผ(์ฒ˜์Œ ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜๋Š” ํŒŒ์ผ)์€ index.js์ด๊ณ , ๋ฒˆ๋“ค๋ง ํ•œ ํ›„(๋ชจ๋“  ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ) ๊ฒฐ๊ณผ๋ฌผ์„ ./public/index_bundle.js ์— ์ƒ์„ฑํ•˜๋ผ๋Š” ๋ช…๋ ์–ด์ด๋‹ค. (๋‚˜์ค‘์— ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค)

 

 

๋ฒˆ๋“ค๋ง์ด ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ด์ œ ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ์„ index.html ์—์„œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‹จ ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค๋ง๋œ ํŒŒ์ผ๋งŒ์„ ๋‹ค์šด๋ฐ›๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ์•„๋ฌด๋ฆฌ ํŒŒ์ผ์ด ๋งŽ๋”๋ผ๋„ ๋น„์Šทํ•œ ํŒŒ์ผ๋ผ๋ฆฌ(.js, .css, etc.)  ํ•ฉ์ณ์ ธ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋งŒ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ด๋‹ค. (์›นํŒฉ์˜ ๊ธฐ๋Šฅ)

 

 

 

 

 

 

 

create-react-app์˜ ๊ฒฝ์šฐ

CRA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•  ๊ฒฝ์šฐ, ๊ธฐ๋ณธ Webpack ์„ค์ •๋“ค์ด ๋˜์–ด์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์„ค์ •๋“ค์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ejectํ•ด์•„ํ•œ๋‹ค. 

npx run eject

 

์ƒˆ๋กœ ์ƒ์„ฑ๋œ config์™€ scripts ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ webpack ์„ค์ •์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

https://webpack.js.org/

 

์ฆ‰,  ์›นํŒฉ์€ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์— ๋‚˜์˜จ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ INPUT์œผ๋กœ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋“ค์ด ๋“ค์–ด์™”์„ ๋•Œ, ๊ฐ€๊ณต์„ ํ•ด์„œ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ OUTPUT์„ ๋‚ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

 

 

 

 

 

 

[์ฐธ๊ณ  ์ž๋ฃŒ]

 

 

Webpack์˜ ํ•ต์‹ฌ

Webpack์€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. React ์•ฑ์„ ๋นŒ๋“œํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ ์ƒ๊ฐํ•˜๊ณ  CRA์˜ Webpack ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ํ•ต์‹ฌ ์›๋ฆฌ๋Š”

velog.io

 

 

Concepts | webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

 

 

 

์›นํŒฉ ์ด์ „์˜ ์„ธ๊ณ„์™€ ๋ชจ๋“ˆ ์†Œ๊ฐœ - Webpack

๊ฐ•์˜์†Œ๊ฐœ ์ด ์ˆ˜์—…์—์„œ๋Š” ์›นํŒฉ์„ ๋„์ž…ํ•˜๊ธฐ ์ด์ „์˜ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ดํ›„ ์ˆ˜์—…์—์„œ ํ˜„์žฌ์˜ ํ™˜๊ฒฝ์„ ๊ฐœ์„ ์‹œ์ผœ ๋‚˜๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.  ๊ฐ•์˜

opentutorials.org