[Web] Webpack
๐ webpack์ ๋ญ๊น?
webpack ๊ณต์ ๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์์๋ค.
At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph from one or more entry points and then combines every module your project needs into one or more bundles, which are static assets to serve your content from.
ํ๊ตญ์ด๋ก ๋ฒ์ญํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
webpack์ ๋ชจ๋ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ ์ ๋๋ค. webpack์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ๋ฆฌํ ๋, ๋ด๋ถ์ ์ผ๋ก๋ ํ๋ก์ ํธ์ ํ์ํ ๋ชจ๋ ๋ชจ๋์ ๋งคํํ๊ณ ํ๋ ์ด์์ ๋ฒ๋ค์ ์์ฑํ๋ ๋ํ๋์ ๊ทธ๋ํ๋ฅผ ๋ง๋ญ๋๋ค.
๊ฒฐ๊ตญ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ผ๋ ๊ฒ์ธ๋ฐ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ์์๋ค HTML, CSS, Javscript, ์ด๋ฏธ์ง ๋ฑ์ ์กฐํฉํด์ ๋ณํฉ๋ ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ๋๊ตฌ๋ฅผ ์๋ฏธํ๋ค.
๐ Webpack์ ์ ์ธ๊น?
1. bundling
๋ป ๊ทธ๋๋ก ์์ฑํ ์ฝ๋๋ค์ ๊ธฐ๋ฅ๋ณ๋ก ๋ฌถ์ด์ค๋ค!
๋ง์ฝ html์์ scriptํ๊ทธ๋ฅผ ์ด์ฉํด์ jsํ์ผ์ ์ ์ฉ์ํค๊ฑฐ๋ cdn์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒฝ์ฐ ๊ทธ ์๊ฐ ์ ์ ๋๋ ์ก์์ผ๋ก๋ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์๊ฐ ๋ง์์ง์๋ก ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ธ ์ ์๋ค. webpack์ ์ด์ฉํ๋ฉด ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ์ฌ๋ฌ๊ฐ์ jsํ์ผ์ ๋ฌถ์ด์ค ์ ์๋ค.
2. code spliting
์ฌ๋ฌ๊ฐ์ ํ์ผ๋ค์ ๋ฒ๋ค๋ง ํ์๋ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง ์ ์๋ค. ์ด ๋ ํ์ผ ํ๋๊ฐ ๋๋ฌด ๋ฌด๊ฑฐ์์ง๊ธฐ ๋๋ฌธ์ ์น ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น ์ ์๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ๋๋ ์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
๋์๊ฐ ๋ฆฌ์กํธ์ ๊ฒฝ์ฐ SPA ๋ฐฉ์์ธ๋ฐ ์ด๊ธฐ์ ๋ฆฌ์์ค๋ฅผ ๋ชจ๋ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ํ์ผ๋ค์ด ๋๋ฌด ๋ฌด๊ฒ๋ค๋ฉด ์ด๊ธฐ ๋ก๋ ์๋๊ฐ ๋๋ ค์ง๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฝ๋ ์คํ๋ฆฌํ ์ ํจ์ผ๋ก์จ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
chunk
๋ฒ๋ค๋๋ ํ์ผ์ ์ฌ๋ฌ๊ฐ์ chunk๋ผ๋ ๋จ์๋ก ๋๋ ์ ์๋ค.
3. tree shaking
tree shaking์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํด ์ค๋ค.
const sayHello = () => console.log('hello JongBin!');
sayHello();
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์นํฉ์ ์ด์ฉํด ๋ฒ๋ค๋งํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค.
console.log('hello JongBin!');
์ฒซ ๋ฒ์งธ ์ฝ๋๋ ํจ์๋ก ๊ฐ์ธ์ ํธ์ถํ์๋ console.log() ๋ฉ์๋๊ฐ ํธ์ถ์ด ๋๋๋ฐ ๋จ ํ๋ฒ๋ง ํธ์ถ์ด ๋๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ํจ์๋ก ๋ง๋ค์ด์ค ํ์๊ฐ ์๋ค. ์นํฉ์ ์ด๋ฅผ ์ธ์ํ๊ณ ํจ์๋ฅผ ์ ์ธํ๊ณ console.log() ๋ฉ์๋ ๋ง ํธ์ถ๋๋๋ก tree shaking ํด์ค๋ค.
(๋ง์ฝ ์ฒซ๋ฒ์งธ ์ฝ๋์์ sayHello ํจ์๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋์๋ค๋ฉด ํจ์๊ฐ ์ ๊ฑฐ๋์ง ์๋๋ค.)
4. source map
๋ฐฐํฌ์ฉ์ผ๋ก ๋น๋ํ ํ์ผ๊ณผ ์๋ณธ ํ์ผ์ ์๋ก ์ฐ๊ฒฐ์์ผ ์ค๋ค.
production ๋ชจ๋๋ก ๋์ํ์ฌ ๋ฐฐํฌ์ฉ์ผ๋ก ๋น๋๋ ํ์ผ์์ ์๋ชป๋ ๋ถ๋ถ์ด ์์์๋ ์ด ๋น๋๋ ํ์ผ์ ๋ฒ๋ค๋๊ณ , ์์ถ๋์๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ ๋ถ๋ถ์ ์ฐพ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ค์ธ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ชป๋ ๋ถ๋ถ์ ์์ ํ๊ธฐ ์ํด์๋ ์๋ณธ ํ์ผ๊ณผ ๋น๊ตํด์ ํด๋น ๋ถ๋ถ์ด ์ด๋ ๋ถ๋ถ์ธ์ง ์์์ผ ํ๋๋ฐ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด source map์ด๋ค.
devtool: 'cheap-eval-source-map';
์ ์ฝ๋๋ฅผ exportํ๋ ๋ถ๋ถ์ ์ถ๊ฐํด์ ์ฌ์ฉํ ์ ์๋ค.
๐ webpack์ ํต์ฌ ๊ฐ๋
webpack์ ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด ํต์ฌ ๊ฐ๋ ๋ง ์ดํดํ๋ฉด webpack์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ต์ง ์๋ค๊ณ ํ๋ค. ์ ๋ฆฌํด ๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1. Entry(์ํธ๋ฆฌ)
webpack์ ์ค๋ช ์ ๊ณต์๋ฌธ์์์ ์ดํด๋ณด๋ฉด webpack์ ๋ํ๋์ ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋ค๊ณ ํ๋ค.
๋ง์ฝ login.js, header.js, footer.js ๋ฑ์ ํ์ผ์ ํ๋์ ํ์ผ(index.js)๋ก ๋ฒ๋ค์ ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ฆผ์ด ๋์ค๊ฒ ๋๋ค.
์ด๋ index.js๊ฐ ์ง์ ์ (entry point)์ด๊ณ ์ธ ํ์ผ(login.js, header.js, footer.js)์ ์์กดํ๊ณ ์๋ ๊ด๊ณ๋ฅผ ํ์ฑํ๊ฒ ๋๋ค.
2. Output(์ถ๋ ฅ)
output ์์ฑ์ ์์ฑ๋ ๋ฒ๋ค์ ๋ด๋ณด๋ผ ์์น์ ์ด ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ webpack์ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค. ๊ธฐ๋ณธ ์ถ๋ ฅ ํ์ผ์ ๊ฒฝ์ฐ์๋ ./dist/main.js๋ก , ์์ฑ๋ ๊ธฐํ ํ์ผ์ ๊ฒฝ์ฐ์๋ ./dist ํด๋๋ก ์ค์ ๋๋ค.
๋ณดํต path์ filename์ ๋ช ์ํด ์ค๋ค.
output: {
path: path.resolve(ROOT_DIR, development ? 'public' : 'build'),
filename: 'js/[name].js',
},
path๋ core์ ์ํ๋ฉฐ, core๋ ๊ณตํต์ ์ธ ๊ฒ์ ๋ชจ์๋์ ์ดํ node์์ webpack์ ์ฌ์ฉํ ๊ฒฝ์ฐ ํจ๊ป installํ๋ค.
3. Loaders(๋ก๋)
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด webpack์ JavaScript์ JSON ํ์ผ๋ง ์ดํดํ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ ํ์ ํ์ผ, ๋ง์ฝ babel์ ์ฌ์ฉํ๋ค๋ฉด babel-loader๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ ์ ํ์ ํ์ผ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ ํจํ ๋ชจ๋๋ก ๋ณํํด ์ฌ์ฉํ๊ฑฐ๋ ๋ํ๋์ ๊ทธ๋ํ์ ์ถ๊ฐํ ์ ์๋ค.
4. Plugins(ํ๋ฌ๊ทธ์ธ)
webpack์ ์ด์ฉํด์ ์ฝ๋๋ค์ ๋ฒ๋คํ๊ฒ ๋๋ฉด jsํ์ผ๋ค๋ง ๋ฐฐํฌ์ฉ์ผ๋ก ์์ฑ์ด ๋๋๋ฐ ์ด๋ ํ์ํ ๊ฒ์ด ํ๋ฌ๊ทธ์ธ์ด๋ค. ๊ฒฐ๊ณผ๋ฌผ์ ์ฒ๋ฆฌํด์ฃผ๋ ์ญํ ์ ํ๋ค.
plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
// ./src/index.html์ธ ํ์ผ์ ๋ฒ๋คํด ์์ฑํ๋ค.
plugin ์์ฑ์ ๋ฐฐ์ด์ ์ฌ๋ฌ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์๋ค.
5. Mode(๋ชจ๋)
์นํฉ์ ๊ตฌ๋ํ๋๋ฐ ๋ชจ๋๋ฅผ ์ค์ ํ ์ ์๋๋ฐ 3๊ฐ์ง ๋ชจ๋๊ฐ ์กด์ฌํ๋ค.
- development(๊ฐ๋ฐ ๋ชจ๋)
- production(๋ฐฐํฌ ๋ชจ๋): ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฒ๋ค๋ง ๊ณผ์ ์์ ์์ฒด์ ์ผ๋ก์ฝ๋๋ฅผ ์ต์ ํํด ์ฉ๋์ ์ค์ฌ์ค๋ค.
- none(๋ชจ๋๋ฅผ ์ค์ ํ์ง ์์)
development ๋ชจ๋์ production ๋ชจ๋๋ DefinePlugin์ process.env.NODE_ENV๋ฅผ ๊ฐ๊ฐ development, production๋ก ์ค์ ํ๋ค.
6. Browser Compatibility(๋ธ๋ผ์ฐ์ ํธํ์ฑ)
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์นํฉ์ IE8 ์ดํ๋ฅผ ์ ์ธํ๊ณ , ES5๊ฐ ํธํ๋๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๋ค. ๋ง์ฝ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ธฐ ์ํด์๋ ํด๋ฆฌํ์ ๋ก๋ํด์ผ ํ๋ค.
7. cache
๋ง์ฝ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณ์ ๋ฒ๋ค๋งํ๊ฒ ๋๋ฉด ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ cache๋ฅผ ture๋ก ์ค์ ํด์ ๋ฐ๋ณต๋๋ ๋ฒ๋ค๋ง์ ๋ฐฉ์งํ ์ ์๋ค.
module.exports = {
cache: false,
};
→ cache๋ development ๋ชจ๋์์ type: 'memory'๋ก ์ค์ ๋๊ณ production ๋ชจ๋์์๋ ๋นํ์ฑํ๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
8. module
๋ค์ํ ์ ํ์ ๋ชจ๋์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
๋ชจ๋์ด ์์ฑ ๋ ๋ ์์ฒญ๊ณผ ์ผ์นํ๋ Rule์ ๋ฐฐ์ด์ ๋๋ค. ์ด๋ฌํ ๊ท์น์ ๋ชจ๋ ์์ฑ ๋ฐฉ๋ฒ์ ์์ ํ ์ ์์ต๋๋ค. ๋ก๋๋ฅผ ๋ชจ๋์ ์ ์ฉ์ํค๊ฑฐ๋ ํ์๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
(https://webpack.kr/configuration/module/#modulerules)
rules rule์ ๋ฐฐ์ด๋ก์ test๋ก ์ ๊ท์์ ์ฌ์ฉํด์ ์ ์ฉํ ํ์ผ์ ์ ํํ ์ ์๊ณ , use ์์ฑ์ ์ด๋ค ๋ก๋๋ฅผ ์ ์ฉ์ํฌ์ง ๋ช ์ํ ์ ์๋ค. ๋ํ exclude ์์ฑ์๋ ์ ์ฉํ์ง ์์ ํ์ผ๋ค์ ๋ช ์ํ ์ ์๋ค. (์ด ์ธ์๋ ๋ค์ํ ์ต์ ์ด ์กด์ฌํ๋ค.)
์๋ฉด ์์๋ก ํท๊ฐ๋ฆฌ๋ webpack.... ๊ธฐ๋ฅ์ด ์ ๋ง ๋ง๋ค...