-
Notifications
You must be signed in to change notification settings - Fork 5
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๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ๋ชจ๋์ด๋ค.
- ๋ ์ซ์์ ํฉ์ ๊ตฌํ๋ย
sum()
ย ํจ์ - ๋ ์ซ์์ ์ฐจ๋ฅผ ๊ตฌํ๋ย
substract()
ย ํจ์ - ์์ฃผ์จ ๊ฐ์ ๊ฐ๋ย
pi
ย ์์
์ด์ฒ๋ผ ์ฑ๊ฒฉ์ด ๋น์ทํ ๊ธฐ๋ฅ๋ค์ ํ๋์ ์๋ฏธ ์๋ ํ์ผ๋ก ๊ด๋ฆฌํ๋ฉด ๋ชจ๋์ด ๋๋ค.
์นํฉ์์ ์ง์นญํ๋ ๋ชจ๋์ด๋ผ๋ ๊ฐ๋ ์ ์์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์๋ง ๊ตญํ๋์ง ์๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์์์ ์๋ฏธํ๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๋ ค๋ฉด HTML, CSS, Javascript, Images, Font ๋ฑ ๋ง์ ํ์ผ๋ค์ด ํ์ํ๋ค. ์ด ํ์ผ ํ๋ํ๋๊ฐ ๋ชจ๋ ๋ชจ๋์ด๋ค.
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ช์ญ, ๋ช๋ฐฑ๊ฐ์ ์์๋ค์ ํ๋์ ํ์ผ๋ก ๋ณํฉ ๋ฐ ์์ถ ํด์ฃผ๋ ๋์์ ๋ชจ๋ ๋ฒ๋ค๋ง์ด๋ผ๊ณ ํ๋ค.
๋น๋, ๋ฒ๋ค๋ง, ๋ณํ ์ด ์ธ ๋จ์ด ๋ชจ๋ ๊ฐ์ ์๋ฏธ์ด๋ค.
์ฆ, Webpack์ ์์กด ๊ด๊ณ์ ์๋ ๋ชจ๋๋ค์ ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ด๋ค.
Webpack์ ์ฌ์ฉํ๋ฉด ์์กด ๋ชจ๋์ด ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋ง๋๋ฏ๋ก ๋ณ๋์ ๋ชจ๋ ๋ก๋๊ฐ ํ์์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ฏ๋ก html ํ์ผ์์ script ํ๊ทธ๋ก ๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์๋ ์ฌ๋ผ์ง๋ค.
webpack์ ํฌ๊ฒ module loader์ plugin์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ๋ชจ๋(image, js, jsx, css, sass..)์ ์ ๋ ฅ๋ฐ์์ ๋ค๋ฅธ ํํ๋ก ์์ ํ์ JavaScript๋ก ๋ณํ
- ex) jsx -> js๋ก, ES6๋ฌธ๋ฒ์ฝ๋ -> ES5๋ฌธ๋ฒ์ฝ๋๋ก
- ์ฃผ๋ก ๋ฒ๋ค๋ ๊ฒฐ๊ณผ์ ๋ํ ํ์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋น
- ํ์ง๋ง, 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๊ฐ์ง์ ๋๋ค.
- ํ์ผ ๋จ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๊ด๋ฆฌ์ ํ์์ฑ
- ์น ๊ฐ๋ฐ ์์ ์๋ํ ๋๊ตฌ (Web Task Manager)
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅธ ๋ก๋ฉ ์๋์ ๋์ ์ฑ๋ฅ
#ํ์ผ ๋จ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๊ด๋ฆฌ
์ ๋ฌธ์ ๊ด์ ์์ ๊ณ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋์ ๊ฐ์ด ํธ๋ฆฌํ ์ ํจ ๋ฒ์๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
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ย ๋ฌธ๋ฒ๊ณผ ์นํฉ์ ๋ชจ๋ ๋ฒ๋ค๋ง์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
TCP ์คํ์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ์์ ํ ๋ฒ์ ์๋ฒ๋ก ๋ณด๋ผ ์ ์๋ HTTP ์์ฒญ ์ซ์๋ ์ ์ฝ๋์ด ์์ต๋๋ค. ์๋์ ํ๋ ์ต์ ๋ธ๋ผ์ฐ์ ๋ณ ์ต๋ HTTP ์์ฒญ ํ์์ ๋๋ค.
๋ฐ๋ผ์, HTTP ์์ฒญ ์ซ์๋ฅผ ์ค์ด๋ ๊ฒ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋์ฌ์ค ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ๋ฅผ ์กฐ์ํ๋ ์๊ฐ์ ์๋น๊ฒจ ์ค ์ ์์ฃ .
ํด๋ผ์ด์ธํธ์์ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด์๋ ๋จผ์ TCP/IP๊ฐ ์ฐ๊ฒฐ๋์ด์ผ ํฉ๋๋ค.
์นํฉ์ ์ด์ฉํด ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋๋ก ํฉ์น๋ฉด ์์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ณ HTTP ์์ฒญ ์ซ์ ์ ์ฝ์ ํผํ ์ ์์ต๋๋ค.
**Require.js**์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์์ผ๋ฉด ๋์ ์ผ๋ก ์ํ๋ ์๊ฐ์ ๋ชจ๋์ ๋ก๋ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์นํฉ์ย Code Splittingย ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ์ํ๋ ๋ชจ๋์ ์ํ๋ ํ์ด๋ฐ์ ๋ก๋ฉํ ์ ์์ต๋๋ค.
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์ ํ๋ฉด ์ ์์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์นํฉ์ 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๋ฅผ ํ๋ฉด ์์์ด ์ ์ฉ๋๊ฑธ ํ์ธํ ์ ์๋ค.
์ด๋ฏธ์ง๋ฅผ 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๋ฅผ ํ๋ฉด ์ ์์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด ๋๋ ๋ก๋๊ฐ ์๋๋ผ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ค.
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 ์์ ์๋ ํ์ผ๋ค์ ์ด๋ฆ์ด ์๋ณธ ํ์ผ๋ก ๋ฐ๋๋ ๊ฒ์ ํ์ธ๊ฐ๋ฅ.
์นํฉ์ผ๋ก ์ด๋ฏธ ๋ง๋ค์ด์ง ํด์ ํ์ผ๋ช ์ ํ์ผ๋ค์ ์ญ์ ๊ฐ๋ฅํ๋ค.
npm i -D clean-webpack-plugin
์์ฑํ({}๊ฐ์ธ์ผํจ), plugins์ธ ์๋์ new CleanWebpackPlugin()
ํ๋ฉด ์๋์ผ๋ก ์์ํ์ผ๋ก ์ค์ ๋ distํด๋๋ฅผ ์ญ์ ํ๊ณ ์นํฉ์ ๋๋ฆด ๊ฒ.
ํด์๊ฐ ํ์ผ๋ช ์ธ ํ์ผ์ด ์ฌ๋ผ์ง๊ณ ๊น๋ํ๊ฒ ํ์ผ ์์ฑ๋๋ค!