๐ Webpack 5 ์๋ฒฝ ๊ฐ์ด๋: ๋ชจ๋ ๋ฒ๋ค๋ง์ ๋ชจ๋ ๊ฒ ๐

์๋ , ์น๊ตฌ๋ค! ์ค๋์ ์ฐ๋ฆฌ๊ฐ ์น ๊ฐ๋ฐ์ ํ ๋ ์ ๋ง ์ ์ฉํ ๋๊ตฌ์ธ Webpack 5์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ๋ณผ ๊ฑฐ์ผ. ํนํ ๋ชจ๋ ๋ฒ๋ค๋ง์ด๋ผ๋ ๊ฐ๋ ์ ์ค์ฌ์ผ๋ก, Webpack์ A๋ถํฐ Z๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ค๋ณผ ๊ฑฐ๋๊น ํธํ๊ฒ ๋ฐ๋ผ์! ๐
์ฐ๋ฆฌ๊ฐ ์ด ๊ธด ์ฌ์ ์ ํจ๊ป ๋ ๋๊ธฐ ์ ์, ์ ๊น! ํน์ ์ฌ๋ฅ๋ท์ด๋ผ๋ ์ฌ์ดํธ ๋ค์ด๋ดค์ด? ์ฌ๊ธฐ๋ ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ชจ์ฌ์ ์๋ก์ ์ง์๊ณผ ๊ธฐ์ ์ ๊ณต์ ํ๊ณ ๊ฑฐ๋ํ๋ ๊ณณ์ด์ผ. ์ฐ๋ฆฌ๊ฐ ์ค๋ ๋ฐฐ์ธ Webpack ๊ฐ์ ๊ธฐ์ ๋ ์ฌ๋ฅ๋ท์์ ๋๊ตฐ๊ฐ์๊ฒ ๋ฐฐ์ฐ๊ฑฐ๋ ๊ฐ๋ฅด์น ์ ์๊ฒ ์ง? ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณด์!
๐ ์ค๋์ ํ์ต ๋ชฉํ:
- Webpack์ด ๋ญ์ง, ์ ํ์ํ์ง ์ดํดํ๊ธฐ
- Webpack 5์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฌํญ ์์๋ณด๊ธฐ
- Webpack ์ค์ ํ์ผ ์์ฑํ๋ ๋ฐฉ๋ฒ ๋ง์คํฐํ๊ธฐ
- ๋ก๋์ ํ๋ฌ๊ทธ์ธ ํ์ฉํ๊ธฐ
- ์ต์ ํ ๊ธฐ๋ฒ ๋ฐฐ์ฐ๊ธฐ
์, ์ด์ ์ ๋ง ์์ํด๋ณผ๊น? ์ค๋น๋์ด? ๊ทธ๋ผ ๊ณ ๊ณ ! ๐๐จ
๐ฆ Webpack, ๋ ๋์ฒด ๋ญ๋?
์, ์น๊ตฌ์ผ. Webpack์ด ๋ญ์ง ๊ถ๊ธํ์ง? ๊ฐ๋จํ ๋งํ๋ฉด, Webpack์ ๋ชจ๋ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ผ. ์ด, ๋ญ ์๋ฆฌ๋๊ณ ? ๊ฑฑ์ ๋ง, ์ฒ์ฒํ ์ค๋ช ํด์ค๊ฒ!
์๋ ์์ ์ ์น ๊ฐ๋ฐ์๋ค์ ์์ฃผ ํ๋ ์๊ธฐ๋ฅผ ๋ณด๋์ด. JavaScript ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ผ ๋๋ง๋ค HTML์ ์ผ์ผ์ด <script>
ํ๊ทธ๋ฅผ ๋ฃ์ด์ผ ํ๊ณ , ํ์ผ ์์๋ ์ ๊ฒฝ ์จ์ผ ํ์ง. CSS๋ ๋ง์ฐฌ๊ฐ์ง์๊ณ . ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง, ํฐํธ ๊ฐ์ ์์๋ค๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ ๋ง ๊ณจ์น ์ํ ์ด. ๐ซ
๊ทธ๋ฐ๋ฐ Webpack์ด ๋ฑ์ฅํ๋ฉด์ ์ด ๋ชจ๋ ๊ฒ ๋ฐ๋์์ด! Webpack์ ๋ง์น ๋ง๋ฒ ์์ ๊ฐ์. ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ ํ์ผ์ ์ด ์์์ ๋ฃ์ผ๋ฉด, Webpack์ด ์์์ ์ ๋ฆฌํ๊ณ ์ต์ ํํด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฑฐ์ง.
๐ก Webpack์ ์ฃผ์ ๊ธฐ๋ฅ:
- ์ฌ๋ฌ ํ์ผ์ ํ๋๋ก ๋ฌถ์ด์ค (๋ฒ๋ค๋ง)
- ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ์์ถํจ
- ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์ ๊ณตํด์ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ์ ์๊ฒ ํด์ค
- ๋ค์ํ ํ์์ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์์ (JS, CSS, ์ด๋ฏธ์ง, ํฐํธ ๋ฑ)
์ด์ ์ข ๊ฐ์ด ์ค๋? Webpack์ ์ฐ๋ฆฌ์ ๊ฐ๋ฐ ์ํ์ ์์ฒญ๋๊ฒ ํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ์ผ. ํนํ ํฐ ํ๋ก์ ํธ๋ฅผ ํ ๋ ์ง๊ฐ๋ฅผ ๋ฐํํ์ง. ์ฝ๋๋ฅผ ๋ชจ๋ํํ๊ณ , ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ํฐ ๋์์ ์ค.
๊ทธ๋ฐ๋ฐ ๋ง์ด์ผ, Webpack์ด ์ด๋ ๊ฒ ์ข๋ค๊ณ ํด์ ๋ชจ๋ ํ๋ก์ ํธ์ ๋ฌด์กฐ๊ฑด ์ฌ์ฉํด์ผ ํ๋ ๊ฑด ์๋์ผ. ์์ ํ๋ก์ ํธ๋ ๊ฐ๋จํ ์นํ์ด์ง๋ฅผ ๋ง๋ค ๋๋ ์คํ๋ ค ๋ถํ์ํ ์ ์์ด. ํ์ง๋ง ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ, ํนํ SPA(Single Page Application)๋ฅผ ๊ฐ๋ฐํ ๋๋ ๊ฑฐ์ ํ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ง.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด Webpack์ ์๋ ์๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์์ด. ๋ค์ํ ํ์์ ํ์ผ๋ค์ด Webpack์ด๋ผ๋ '๋ง๋ฒ ์์'๋ก ๋ค์ด๊ฐ์ ํ๋์ ์ต์ ํ๋ ๋ฒ๋ค๋ก ๋์ค๋ ๊ฑฐ์ง. ๋ฉ์ง์ง ์์?
์, ์ด์ Webpack์ด ๋ญ์ง ๋์ถฉ ๊ฐ์ด ์์ ๊ฑฐ์ผ. ๋ค์์ผ๋ก๋ Webpack 5์ ํน์ง์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. Webpack 5๋ ์ด์ ๋ฒ์ ๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ด๊ฑฐ๋ . ์ด๋ค ์ ์ด ์ข์์ก๋์ง ํจ๊ป ์ดํด๋ณด์!
๐ Webpack 5์ ์๋ก์ด ๊ธฐ๋ฅ๋ค
์, ์ด์ Webpack 5์ ๋ํด ์์ธํ ์์๋ณผ ์๊ฐ์ด์ผ! Webpack 5๋ 2020๋ 10์์ ์ถ์๋์ด. ์ด์ ๋ฒ์ ์ธ Webpack 4์ ๋นํด ๋ง์ ๊ฐ์ ์ฌํญ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋์ง. ํ๋์ฉ ์ดํด๋ณผ๊น?
๐ Webpack 5์ ์ฃผ์ ํน์ง:
- ๋ ๋น ๋ฅธ ๋น๋ ์๋
- ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ
- ์ฅ๊ธฐ์ ์ธ ์บ์ฑ ๊ฐ์
- Node.js ํด๋ฆฌํ ์๋ ์ ๊ฑฐ
- ์น ํ๋ซํผ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ง์ถ ์ฝ๋ ์์ฑ
1. ๋น๋ ์๋ ๊ฐ์
Webpack 5๋ ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ํํด์ ๋น๋ ์๋๋ฅผ ํฌ๊ฒ ํฅ์์์ผฐ์ด. ํนํ ํฐ ํ๋ก์ ํธ์์ ๊ทธ ํจ๊ณผ๊ฐ ๋๋๋ฌ์ง์ง. ์๋ฅผ ๋ค์ด, ํธ๋ฆฌ ์์ดํน(์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ์ )์ด ๋ ํจ์จ์ ์ผ๋ก ๋์ํ๊ฒ ๋์ด. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด, ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋ ์ค์์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ๋ง ๋ฒ๋ค์ ํฌํจ์ํค๊ณ ๋๋จธ์ง๋ ๊ณผ๊ฐํ ์ ๊ฑฐํ๋ค๋ ๊ฑฐ์ผ. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฒ๋ค ํฌ๊ธฐ๋ ์์์ง๊ณ ๋ก๋ฉ ์๋๋ ๋นจ๋ผ์ง๋ ๊ฑฐ์ง.
2. ์ฅ๊ธฐ์ ์ธ ์บ์ฑ ๊ฐ์
Webpack 5์์๋ ๋ ๋๋ํ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๋์ ํ์ด. ์ด๊ฒ ๋ฌด์จ ๋ป์ด๋๋ฉด, ํ ๋ฒ ๋น๋ํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ ์ค๋, ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ๊ฑฐ์ผ. ์๋ฅผ ๋ค์ด, ์ฝ๋์ ์ผ๋ถ๋ง ๋ณ๊ฒฝํ์ ๋ ์ ์ฒด๋ฅผ ๋ค์ ๋น๋ํ์ง ์๊ณ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋น๋ํ ์ ์๊ฒ ๋์ด. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฐ ๊ณผ์ ์์ ์๊ฐ์ ์์ฒญ๋๊ฒ ์ ์ฝํ ์ ์์ง!
3. Node.js ํด๋ฆฌํ ์๋ ์ ๊ฑฐ
์ด์ ๋ฒ์ ์ Webpack์ Node.js์ ํต์ฌ ๋ชจ๋์ ๋ํ ํด๋ฆฌํ์ ์๋์ผ๋ก ์ถ๊ฐํ์ด. ํด๋ฆฌํ์ด ๋ญ๋๊ณ ? ์ฝ๊ฒ ๋งํด์, ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ฝ๋ ์กฐ๊ฐ์ด์ผ. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ, ์ค์ ๋ก ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ถํ์ํ๊ฒ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํค์ ๊ฑฐ๋ . Webpack 5์์๋ ์ด๋ฐ ํด๋ฆฌํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ฑฐํ์ด. ํ์ํ ๊ฒฝ์ฐ์๋ง ์ง์ ์ถ๊ฐํ ์ ์๊ฒ ๋ง์ด์ผ. ์ด๋ ๊ฒ ํด์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋ ์๊ฒ ๋ง๋ค ์ ์๊ฒ ๋์ง.
4. ๋ชจ๋ ํ๋๋ ์ด์
์ด๊ฑด ์ ๋ง ํ์ ์ ์ธ ๊ธฐ๋ฅ์ด์ผ! ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ ์ผ๋ก ์๋ก ๊ณต์ ํ ์ ์์ด. ์๋ฅผ ๋ค์ด, A๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ B๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฑฐ์ผ. ์ด๊ฒ ์ ๋๋จํ๋๋ฉด, ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์์ฃผ ์ ์ฉํ๊ฑฐ๋ . ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋๋๊ณ , ์ด๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ง.
์์ ๊ทธ๋ฆผ์ Webpack 5์ ์ฃผ์ ํน์ง์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ์์ด. ์ด ๋ชจ๋ ํน์ง๋ค์ด ํฉ์ณ์ ธ์ ๋ ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ค์ด์ฃผ๋ ๊ฑฐ์ง.
5. ์น ํ๋ซํผ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ง์ถ ์ฝ๋ ์์ฑ
Webpack 5๋ ์ต์ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ฅ์ ๋ ์ ํ์ฉํ ์ ์๊ฒ ํด์ค. ์๋ฅผ ๋ค์ด, ECMAScript ๋ชจ๋์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๋ํผ ์ฝ๋๋ฅผ ์ค์ด๊ณ , ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ง.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Webpack 5์ ์ฃผ์ ํน์ง์ด์ผ. ์ด๋? ๊ฝค ๋๋จํ์ง? ์ด๋ฐ ๊ธฐ๋ฅ๋ค ๋๋ถ์ ์ฐ๋ฆฌ๋ ๋ ๋น ๋ฅด๊ณ , ๋ ์๊ณ , ๋ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๊ฒ ๋์ด. ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ด๋ฐ ๊ฐ์ ์ฌํญ๋ค์ ํจ๊ณผ๊ฐ ํฌ๊ฒ ๋ํ๋์ง.
๊ทธ๋ฐ๋ฐ ๋ง์ด์ผ, ์ด๋ฐ ๋ฉ์ง ๊ธฐ๋ฅ๋ค์ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด Webpack์ ์ ์ค์ ํด์ผ ํด. ๋ค์ ์น์ ์์๋ Webpack์ ์ค์ ํ์ผ์ ์ด๋ป๊ฒ ์์ฑํ๋์ง ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ์ค๋น๋์ด? ๊ทธ๋ผ ๊ณ ๊ณ ! ๐
โ๏ธ Webpack ์ค์ ํ์ผ ์์ฑํ๊ธฐ
์, ์ด์ Webpack์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์ฐจ๋ก์ผ. Webpack์ ์ฌ์ฅ์ด๋ผ๊ณ ํ ์ ์๋ ์ค์ ํ์ผ, webpack.config.js
๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋์ง ํจ๊ป ์ดํด๋ณด์!
๊ธฐ๋ณธ ๊ตฌ์กฐ
Webpack ์ค์ ํ์ผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
mode: 'development',
module: {
rules: [
// ๋ก๋ ์ค์
]
},
plugins: [
// ํ๋ฌ๊ทธ์ธ ์ค์
]
};
์ด์ ๊ฐ ๋ถ๋ถ์ ์์ธํ ์ดํด๋ณผ๊ฒ.
1. entry
entry๋ Webpack์ด ๋ฒ๋ค๋ง์ ์์ํ ์ง์ ์ ์ด์ผ. ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ JavaScript ํ์ผ์ ์ง์ ํด. ์ฌ๋ฌ ๊ฐ์ entry point๋ฅผ ์ค์ ํ ์๋ ์์ด:
entry: {
main: './src/index.js',
admin: './src/admin.js'
}
2. output
output์ Webpack์ด ๋ฒ๋ค๋งํ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋์, ์ด๋ค ์ด๋ฆ์ผ๋ก ์ ์ฅํ ์ง ์ง์ ํด. path
๋ ์ ๋ ๊ฒฝ๋ก์ฌ์ผ ํด:
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js'
}
์ฌ๊ธฐ์ [name]
์ entry์์ ์ง์ ํ ํค ๊ฐ์ด ๋ค์ด๊ฐ๊ณ , [contenthash]
๋ ํ์ผ ๋ด์ฉ์ ๋ฐ๋ผ ์์ฑ๋๋ ํด์ ๊ฐ์ด์ผ. ์ด๋ ๊ฒ ํ๋ฉด ํ์ผ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก์ด ํ์ผ ์ด๋ฆ์ด ์์ฑ๋์ด ๋ธ๋ผ์ฐ์ ์บ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง.
3. mode
mode๋ Webpack์ ์ต์ ํ ์์ค์ ๊ฒฐ์ ํด. 'development', 'production', 'none' ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ด:
mode: 'production'
'production' ๋ชจ๋์์๋ ์ฝ๋ ์ต์ํ, ํธ๋ฆฌ ์์ดํน ๋ฑ ๋ค์ํ ์ต์ ํ๊ฐ ์๋์ผ๋ก ์ ์ฉ๋ผ.
4. module
module ์น์
์์๋ ๋ค์ํ ์ ํ์ ๋ชจ๋์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํด. ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ rules
๋ฐฐ์ด์ด์ผ:
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
์ด ์ค์ ์ .js ํ์ผ์ Babel๋ก ํธ๋์คํ์ผํ๊ณ , .css ํ์ผ์ ์คํ์ผ๋ก ์ ์ฉํ๋ผ๋ ์๋ฏธ์ผ.
5. plugins
plugins๋ Webpack์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ผ. ๋ค์ํ ์์ ์ ์ํํ ์ ์์ด:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
// ...
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
}),
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
})
]
์ด ์ค์ ์ HTML ํ์ผ์ ์์ฑํ๊ณ CSS๋ฅผ ๋ณ๋ ํ์ผ๋ก ์ถ์ถํ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ์์ด.
6. devServer
๊ฐ๋ฐ ์ค์ ์ฌ์ฉํ ์๋ฒ ์ค์ ์ ํ ์ ์์ด:
devServer: {
contentBase: './dist',
open: true,
hot: true
}
์ด ์ค์ ์ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๊ณ , ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋์ผ๋ก ์ด๊ณ , ํซ ๋ชจ๋ ๋ฆฌํ๋ ์ด์ค๋จผํธ๋ฅผ ํ์ฑํํด.
๐ก Pro Tip:
์ค์ ํ์ผ์ด ๋๋ฌด ์ปค์ง๋ฉด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง ์ ์์ด. ์ด๋ด ๋๋ ์ค์ ์ ์ฌ๋ฌ ํ์ผ๋ก ๋๋๊ณ webpack-merge
๋ฅผ ์ฌ์ฉํด ํฉ์น๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ด:
// webpack.common.js
const common = { /* ๊ณตํต ์ค์ */ };
// webpack.dev.js
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'development',
// ๊ฐ๋ฐ ํ๊ฒฝ ํน์ ์ค์
});
// webpack.prod.js
module.exports = merge(common, {
mode: 'production',
// ํ๋ก๋์
ํ๊ฒฝ ํน์ ์ค์
});
์, ์ฌ๊ธฐ๊น์ง๊ฐ Webpack ์ค์ ํ์ผ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ผ. ์ด๋, ์๊ฐ๋ณด๋ค ๋ณต์กํ์ง ์์ง? ๋ฌผ๋ก ์ค์ ํ๋ก์ ํธ์์๋ ์ด๋ณด๋ค ๋ ๋ณต์กํ ์ค์ ์ด ํ์ํ ์ ์์ด. ํ์ง๋ง ์ด ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ง ์ดํดํ๊ณ ์์ผ๋ฉด, ๋๋จธ์ง๋ ํ์์ ๋ฐ๋ผ ํ๋์ฉ ์ถ๊ฐํด๋๊ฐ๋ฉด ๋ผ.
๊ทธ๋ฆฌ๊ณ ์์ง ๋ง, Webpack์ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์ผ. ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฅ๋ท๊ฐ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ Webpack์ ์ ๋ง ํฐ ๋์์ด ๋ ๊ฑฐ์ผ. ๋ชจ๋ ๋ฒ๋ค๋ง, ์ฝ๋ ์ต์ ํ, ์์ ๊ด๋ฆฌ ๋ฑ Webpack์ด ํด์ฃผ๋ ์ผ๋ค ๋๋ถ์ ์ฐ๋ฆฌ๋ ๋ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐ์ ์ง์คํ ์ ์๊ฑฐ๋ .
๋ค์ ์น์ ์์๋ Webpack์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ธ ๋ก๋(Loader)์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ๋ก๋๋ฅผ ์ด์ฉํ๋ฉด Webpack์ด JavaScript ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ํ์ ์ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๊ฑฐ๋ . ์ค๋น๋์ด? ๊ทธ๋ผ ๊ณ ๊ณ ! ๐
๐ง Webpack ๋ก๋(Loader) ๋ง์คํฐํ๊ธฐ
์๋ , ์น๊ตฌ๋ค! ์ด๋ฒ์๋ Webpack์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋์ธ ๋ก๋(Loader)์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ๋ก๋๊ฐ ๋ญ์ง, ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํจ๊ป ์ดํด๋ณด์!
๋ก๋(Loader)๋?
๊ฐ๋จํ ๋งํด์, ๋ก๋๋ Webpack์ด ๋ค์ํ ํ์ ์ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ผ. Webpack์ ๊ธฐ๋ณธ์ ์ผ๋ก JavaScript์ JSON ํ์ผ๋ง ์ดํดํ ์ ์์ด. ๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ CSS, ์ด๋ฏธ์ง, ํฐํธ ๋ฑ ๋ค์ํ ํ์ ์ ํ์ผ์ด ์ฌ์ฉ๋์์? ์ด๋ ๋ก๋๊ฐ ๋ฑ์ฅํ๋ ๊ฑฐ์ง. ๋ก๋๋ ์ด๋ฐ ํ์ผ๋ค์ Webpack์ด ์ดํดํ ์ ์๋ ๋ชจ๋๋ก ๋ณํํด์ค.
๐ญ ๋ก๋์ ์ญํ :
- ๋ค์ํ ๋ฆฌ์์ค๋ฅผ JavaScript ๋ชจ๋๋ก ๋ณํ
- ์ต์ JavaScript ๋ฌธ๋ฒ์ ๊ตฌ๋ฒ์ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ํ๋๋ก ๋ณํ
- CSS๋ฅผ JavaScript์ ์ฝ์
- ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ดํฐ URL๋ก ๋ณํ
์ฃผ์ ๋ก๋ ์๊ฐ
1. babel-loader: ์ต์ JavaScript ์ฝ๋๋ฅผ ๊ตฌ๋ฒ์ ์ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ํ ์ ์๊ฒ ๋ณํํด์ค.
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: { loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
2. css-loader์ style-loader: CSS ํ์ผ์ ์ฒ๋ฆฌํ๊ณ HTML์ ์คํ์ผ์ ์ฃผ์ ํด.
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
3. file-loader: ์ด๋ฏธ์ง๋ ํฐํธ ๊ฐ์ ํ์ผ์ ๋ชจ๋๋ก ๋ณํํด์ค.
{
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader',
},
],
}
4. url-loader: ์์ ํ์ผ๋ค์ ๋ฐ์ดํฐ URL๋ก ๋ณํํด ์ธ๋ผ์ธ์ผ๋ก ์ฝ์ ํ ์ ์๊ฒ ํด์ค.
{
test: /\.(png|jpg|gif)$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 8192,
},
},
],
}
๋ก๋ ์ฒด์ด๋
๋ก๋๋ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐํด์ ์ฌ์ฉํ ์ ์์ด. ์ด๋ ๋ก๋๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์์ผ๋ก ์ ์ฉ๋ผ. ์๋ฅผ ๋ค์ด, Sass ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์:
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}
์ด ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๋์ํด:
- sass-loader๊ฐ Sass๋ฅผ CSS๋ก ๋ณํ
- css-loader๊ฐ CSS๋ฅผ CommonJS๋ก ๋ณํ
- style-loader๊ฐ JS๋ก ๋ณํ๋ CSS๋ฅผ DOM์ ์ฃผ์
๋ก๋ ์ต์ ์ค์
๋ก๋์๋ ๋ค์ํ ์ต์ ์ ์ค์ ํ ์ ์์ด. ์๋ฅผ ๋ค์ด, babel-loader์ ์ต์ ์ ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ณด์:
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-proposal-class-properties']
}
}
}
์ธ๋ผ์ธ ๋ก๋
์ค์ ํ์ผ ๋์ import ๋ฌธ์ ์ง์ ๋ก๋๋ฅผ ์ง์ ํ ์๋ ์์ด. ์ด๋ฅผ ์ธ๋ผ์ธ ๋ก๋๋ผ๊ณ ํด:
import Styles from 'style-loader!css-loader?modules!./styles.css';
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํด์น๋ฏ๋ก ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ค์ ํ์ผ์์ ๋ก๋๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข์.
๐ก Pro Tip:
๋ก๋๋ฅผ ์ ํํ ๋๋ ํญ์ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ , ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ์ด ์ข์. ๋ํ, ํ๋ก์ ํธ์ needs์ ๋ง๋ ๋ก๋๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํด. ์๋ฅผ ๋ค์ด, ๋จ์ํ ํ๋ก์ ํธ๋ผ๋ฉด babel-loader๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ ์์ง๋ง, ๋ณต์กํ React ํ๋ก์ ํธ๋ผ๋ฉด babel-loader์ ํจ๊ป react-hot-loader๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ ์์ด.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Webpack ๋ก๋์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ผ. ์ด๋, ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ง? ๋ก๋๋ฅผ ์ ํ์ฉํ๋ฉด ์ ๋ง ๋ค์ํ ํ์ ์ ํ์ผ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด. ํนํ ์ฌ๋ฅ๋ท๊ฐ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋ก๋์ ํ์ ์ ๋๋ก ๋๋ ์ ์์ ๊ฑฐ์ผ.
๋ค์ ์น์ ์์๋ Webpack์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ ํ๋ฌ๊ทธ์ธ(Plugin)์ ๋ํด ์์๋ณผ ๊ฑฐ์ผ. ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ๋ฒ๋ค๋ง ํ๋ก์ธ์ค๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฑฐ๋ . ์ค๋น๋์ด? ๊ทธ๋ผ ๊ณ ๊ณ ! ๐
๐ Webpack ํ๋ฌ๊ทธ์ธ(Plugin) ์์ ์ ๋ณต
์๋ , ์น๊ตฌ๋ค! ์ด๋ฒ์๋ Webpack์ ๋ ๋ค๋ฅธ ํต์ฌ ๊ธฐ๋ฅ์ธ ํ๋ฌ๊ทธ์ธ(Plugin)์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ํ๋ฌ๊ทธ์ธ์ด ๋ญ์ง, ์ด๋ค ์ญํ ์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํจ๊ป ์ดํด๋ณด์!
ํ๋ฌ๊ทธ์ธ(Plugin)์ด๋?
ํ๋ฌ๊ทธ์ธ์ Webpack์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋๊ตฌ์ผ. ๋ก๋๊ฐ ํน์ ์ ํ์ ๋ชจ๋์ ์ฒ๋ฆฌํ๋ค๋ฉด, ํ๋ฌ๊ทธ์ธ์ ๋ฒ๋ค๋ง ํ๋ก์ธ์ค ์ ๋ฐ์ ๊ฑธ์ณ ๋ค์ํ ์์ ์ ์ํํ ์ ์์ด. ์๋ฅผ ๋ค์ด, ๋ฒ๋ค ์ต์ ํ, ์์ ๊ด๋ฆฌ, ํ๊ฒฝ ๋ณ์ ์ฃผ์ ๋ฑ์ ์์ ์ ํ ์ ์์ง.
๐ญ ํ๋ฌ๊ทธ์ธ์ ์ญํ :
- ๋ฒ๋ค ํ์ผ ์ต์ ํ
- ํ๊ฒฝ ๋ณ์ ์ฃผ์
- ์์ ๊ด๋ฆฌ
- ๋ฒ๋ค ๋ถ์ ๋ฆฌํฌํธ ์์ฑ
์ฃผ์ ํ๋ฌ๊ทธ์ธ ์๊ฐ
1. HtmlWebpackPlugin: HTML ํ์ผ์ ์์ฑํ๊ณ ๋ฒ๋ค๋ JavaScript ํ์ผ์ ์๋์ผ๋ก ์ฝ์ ํด์ค.
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
]
};
2. MiniCssExtractPlugin: CSS๋ฅผ ๋ณ๋์ ํ์ผ๋ก ์ถ์ถํด์ค. ํฐ ๊ท๋ชจ์ ์ฑ์์ ์คํ์ผ์ ๋ณ๋๋ก ์บ์ฑํ๊ณ ์ถ์ ๋ ์ ์ฉํด.
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
plugins: [
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
})
]
};
3. DefinePlugin: ์ปดํ์ผ ํ์์ ์ ์ญ ์์๋ฅผ ์ค์ ํ ์ ์์ด. ํ๊ฒฝ ๋ณ์๋ฅผ ์ฃผ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํด.
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
]
};
4. CleanWebpackPlugin: ๋น๋ ์ ์ output ํด๋๋ฅผ ์ ๋ฆฌํด์ค.
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
plugins: [
new CleanWebpackPlugin()
]
};
ํ๋ฌ๊ทธ์ธ ์ต์ ์ค์
๋๋ถ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์ต์ ์ ํตํด ์ธ๋ถ์ ์ธ ๋์์ ์ ์ดํ ์ ์์ด. ์๋ฅผ ๋ค์ด, HtmlWebpackPlugin์ ์ต์ ์ ์ดํด๋ณด์:
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
minify: {
collapseWhitespace: true,
removeComments: true
},
hash: true
})
์ด ์ค์ ์ HTML ํ ํ๋ฆฟ์ ์ฌ์ฉํ๊ณ , ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณ , ์ฃผ์์ ์ญ์ ํ๋ฉฐ, ํ์ผ ์ด๋ฆ์ ํด์๋ฅผ ์ถ๊ฐํด.
์ปค์คํ ํ๋ฌ๊ทธ์ธ ๋ง๋ค๊ธฐ
ํ์ํ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด ์ง์ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ์๋ ์์ด. ํ๋ฌ๊ทธ์ธ์ 'apply' ๋ฉ์๋๋ฅผ ๊ฐ์ง JavaScript ๊ฐ์ฒด์ผ. ์ด ๋ฉ์๋๋ Webpack compiler์ ์ํด ํธ์ถ๋ผ.
class MyPlugin {
apply(compiler) {
compiler.hooks.done.tap('MyPlugin', (stats) => {
console.log('Webpack build process is done!');
});
}
}
module.exports = {
plugins: [new MyPlugin()]
};
์ด ์์ ๋ Webpack ๋น๋ ํ๋ก์ธ์ค๊ฐ ์๋ฃ๋๋ฉด ์ฝ์์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ํ๋ฌ๊ทธ์ธ์ด์ผ.
๐ก Pro Tip:
ํ๋ฌ๊ทธ์ธ์ ์ ํํ ๋๋ ํญ์ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ , ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ์ด ์ข์. ๋ํ, ๋๋ฌด ๋ง์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ๋น๋ ์๋๊ฐ ๋๋ ค์ง ์ ์์ผ๋ ๊ผญ ํ์ํ ํ๋ฌ๊ทธ์ธ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์. ๊ทธ๋ฆฌ๊ณ ํ๋ฌ๊ทธ์ธ์ ์์๋ ์ค์ํ ์ ์์ด. ์ผ๋ฐ์ ์ผ๋ก ์ถ๋ ฅ๊ณผ ๊ด๋ จ๋ ํ๋ฌ๊ทธ์ธ(์: HtmlWebpackPlugin)์ ๋ง์ง๋ง์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์์ ํด.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Webpack ํ๋ฌ๊ทธ์ธ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ผ. ์ด๋, ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ ฅํจ์ด ๋๊ปด์ง์ง? ํ๋ฌ๊ทธ์ธ์ ์ ํ์ฉํ๋ฉด Webpack์ ๊ธฐ๋ฅ์ ๋ฌดํํ ํ์ฅํ ์ ์์ด. ํนํ ์ฌ๋ฅ๋ท๊ฐ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ํ๋ฌ๊ทธ์ธ์ ํ์ ์ ๋๋ก ๋๋ ์ ์์ ๊ฑฐ์ผ.
๋ก๋์ ํ๋ฌ๊ทธ์ธ์ ์ ์กฐํฉํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ด. ์๋ฅผ ๋ค์ด, babel-loader๋ก ์ต์ JavaScript๋ฅผ ๋ณํํ๊ณ , MiniCssExtractPlugin์ผ๋ก CSS๋ฅผ ์ต์ ํํ๊ณ , HtmlWebpackPlugin์ผ๋ก HTML์ ์๋ ์์ฑํ๋ ์์ด์ง. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฐ์ ๋ ํธํด์ง๊ณ , ๊ฒฐ๊ณผ๋ฌผ์ ๋ ์ต์ ํ๋๋ ๊ฑฐ์ผ.
๋ค์ ์น์ ์์๋ Webpack์ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์ผ. ์ด๋ป๊ฒ ํ๋ฉด ๋ ์๊ณ ๋น ๋ฅธ ๋ฒ๋ค์ ๋ง๋ค ์ ์๋์ง, ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์๋์ง ํจ๊ป ์ดํด๋ณด์. ์ค๋น๋์ด? ๊ทธ๋ผ ๊ณ ๊ณ ! ๐
๐ Webpack ์ต์ ํ ๊ธฐ๋ฒ ๋ง์คํฐํ๊ธฐ
์๋ , ์น๊ตฌ๋ค! ์ด๋ฒ์๋ Webpack์ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ์ด๋ป๊ฒ ํ๋ฉด ๋ ์๊ณ ๋น ๋ฅธ ๋ฒ๋ค์ ๋ง๋ค ์ ์๋์ง, ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์๋์ง ํจ๊ป ์ดํด๋ณด์!
์ ์ต์ ํ๊ฐ ํ์ํ ๊น?
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง์๋ก ๋ฒ๋ค ํฌ๊ธฐ๋ ์ปค์ง๊ณ , ๋ก๋ฉ ์๊ฐ๋ ๊ธธ์ด์ ธ. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฒ๋ค์ ์ต์ ํํด์ ๋ ์๊ณ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ผ ํด.
๐ฏ ์ต์ ํ์ ๋ชฉํ:
- ๋ฒ๋ค ํฌ๊ธฐ ์ค์ด๊ธฐ
- ๋ก๋ฉ ์๊ฐ ๋จ์ถ
- ์ด๊ธฐ ๋ ๋๋ง ์๋ ๊ฐ์
- ์ ์ฒด์ ์ธ ์ฑ๋ฅ ํฅ์
์ฃผ์ ์ต์ ํ ๊ธฐ๋ฒ
1. ์ฝ๋ ๋ถํ (Code Splitting)
์ฝ๋ ๋ถํ ์ ํฐ ๋ฒ๋ค์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ฒญํฌ๋ก ๋๋๋ ๊ธฐ๋ฒ์ด์ผ. ์ด๋ ๊ฒ ํ๋ฉด ํ์ํ ์ฝ๋๋ง ๋ก๋ํ ์ ์์ด ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ผ ์ ์์ง.
module.exports = {
entry: {
main: './src/index.js',
vendor: ['react', 'react-dom', 'redux']
},
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
2. ํธ๋ฆฌ ์์ดํน (Tree Shaking)
ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ๋ฒ์ด์ผ. ES6 ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ๊ณ production ๋ชจ๋์์ ๋น๋ํ๋ฉด ์๋์ผ๋ก ์ ์ฉ๋ผ.
module.exports = {
mode: 'production',
// ...
};
3. lazy loading
lazy loading์ ํ์ํ ์์ ์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฒ์ด์ผ. React.lazy()์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ด.
const OtherComponent = React.lazy(() => import('./OtherComponent'));
4. ์บ์ฑ
ํ์ผ ์ด๋ฆ์ ํด์๋ฅผ ์ถ๊ฐํด ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ์ต์ ํํ ์ ์์ด.
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist')
}
5. ๋ฏธ๋ํ์ด (Minify)
์ฝ๋๋ฅผ ์์ถํด์ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ธฐ๋ฒ์ด์ผ. production ๋ชจ๋์์ ์๋์ผ๋ก ์ ์ฉ๋์ง๋ง, ์ถ๊ฐ ์ค์ ์ผ๋ก ๋ ๊ฐํํ ์ ์์ด.
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserPlugin()]
}
};
์ฑ๋ฅ ๋ถ์ ๋๊ตฌ
์ต์ ํ ์์ ์ ํ ๋๋ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๋ถ์ํ๋ ๊ฒ์ด ์ค์ํด. Webpack์์ ์ ๊ณตํ๋ ๋ช ๊ฐ์ง ๋๊ตฌ๋ฅผ ์๊ฐํ ๊ฒ.
1. webpack-bundle-analyzer: ๋ฒ๋ค์ ๊ตฌ์ฑ์ ์๊ฐํํด์ ๋ณด์ฌ์ฃผ๋ ํ๋ฌ๊ทธ์ธ์ด์ผ.
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
};
2. speed-measure-webpack-plugin: ๊ฐ ๋ก๋์ ํ๋ฌ๊ทธ์ธ์ด ์์ํ๋ ์๊ฐ์ ์ธก์ ํด์ค.
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin();
module.exports = smp.wrap({
// ์นํฉ ์ค์
});
๐ก Pro Tip:
์ต์ ํ๋ ํญ์ ์ธก์ ๊ณผ ํจ๊ป ์ด๋ฃจ์ด์ ธ์ผ ํด. ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ๋๋ง๋ค ์ฑ๋ฅ์ ์ธก์ ํ๊ณ , ๊ฐ์ ๋์๋์ง ํ์ธํด์ผ ํด. ๋ํ, ๋ชจ๋ ์ต์ ํ ๊ธฐ๋ฒ์ ํ๊บผ๋ฒ์ ์ ์ฉํ๊ธฐ๋ณด๋ค๋ ํ๋์ฉ ์ ์ฉํ๋ฉด์ ํจ๊ณผ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์. ๊ทธ๋ฆฌ๊ณ ํญ์ ์ค์ ์ฌ์ฉ์ ํ๊ฒฝ์ ๊ณ ๋ คํด์ผ ํด. ์๋ฅผ ๋ค์ด, ๋คํธ์ํฌ ์๋๊ฐ ๋๋ฆฐ ํ๊ฒฝ์์๋ ์ ๋์ํ๋์ง ํ ์คํธํด๋ณด๋ ๊ฒ์ด ์ค์ํด.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Webpack ์ต์ ํ ๊ธฐ๋ฒ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ผ. ์ด๋, ์ต์ ํ์ ์ค์์ฑ์ด ๋๊ปด์ง์ง? ์ด๋ฐ ๊ธฐ๋ฒ๋ค์ ์ ํ์ฉํ๋ฉด ์ฌ๋ฅ๋ท๊ฐ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์ด.
์ต์ ํ๋ ๋์ด ์๋ ๊ณผ์ ์ด์ผ. ์๋ก์ด ๊ธฐ์ ์ด ๋์ค๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ์ ํ๋ฉด์ ์ต์ ํ ๊ธฐ๋ฒ๋ ๊ณ์ ๋ณํํ๊ณ ์์ด. ๊ทธ๋์ ํญ์ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ์ง์์ ์ผ๋ก ํ์ตํ๋ ๊ฒ์ด ์ค์ํด.
์ฌ๊ธฐ๊น์ง Webpack์ ๋ํ ๋ชจ๋ ๋ด์ฉ์ ๋ค๋ค์ด. Webpack์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ค์ , ๋ก๋, ํ๋ฌ๊ทธ์ธ, ๊ทธ๋ฆฌ๊ณ ์ต์ ํ ๊ธฐ๋ฒ๊น์ง. ์ด์ ๋ํฌ๋ค์ Webpack ๋ง์คํฐ๋ผ๊ณ ํ ์ ์์ ์ ๋์ผ! ๐
Webpack์ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์ผ. ์ฒ์์๋ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ์ด๋ ๊ฒ ํ๋์ฉ ๋ฐฐ์๋๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฑฐ์ผ. ์์ผ๋ก ์น ๊ฐ๋ฐ์ ํ๋ฉด์ Webpack์ ํ์ฉํ ๊ธฐํ๊ฐ ๋ง์ ๊ฑฐ์ผ. ๊ทธ๋๋ง๋ค ์ด ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ์กฐ๊ธ์ฉ ์ค๋ ฅ์ ์์๊ฐ๊ธธ ๋ฐ๋ผ!
์, ์ด์ ์ ๋ง ๋์ด์ผ. ๊ธด ์ฌ์ ์ด์์ง๋ง ํจ๊ป ํด์ค์ ๊ณ ๋ง์. ์ฌ๋ฌ๋ถ ๋ชจ๋ ํ๋ฅญํ ๊ฐ๋ฐ์๊ฐ ๋ ๊ฑฐ๋ผ ๋ฏฟ์ด! ํ์ดํ ! ๐๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ