์ Webpack์ด ๋ฑ์ฅํ๊ฒ ๋์์๊น?
- ๊ท๋ชจ๊ฐ ์๋ System์์๋ ๋ง์ Javascript๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ์ด ๋ง์ Javascript ํ์ผ์ ํ๋์ ํ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ์ ์ด๋ ค์์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ๋ก ํธ์ถํ๋ฉด ํด๊ฒฐ๋๋๊ฒ ์๋๊น?
- ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ธ๋ผ์ฐ์ ธ์์ ๋ก๋ฉํ๋ ๊ฒ์ ๋คํธ์ํฌ ๋น์ฉ์ด ๊ทธ๋งํผ ์ฌ์ฉํ์ฌ ๋ฐ์์๋๊ฐ ๋๋ ค์ง๊ฒ ๋ฉ๋๋ค.
- ๋ ๋์๊ฐ ๊ฐ ํ์ผ์ ๋ณ์ ์ถฉ๋์ ์ํ์ฑ๋ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Webpack์ด ๋ฑ์ฅํ๊ฒ ๋์์ต๋๋ค.
Webpack์ด๋?
- ํ๋ Javascript Application์ Static Module Bundler์ ๋๋ค.
- Webpack์ด ์คํ๋๋ค๋ฉด Dependencies Graph๋ฅผ ํตํด ํ์ํ ํํ์ ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ Bundle๋ก ์์ฑํฉ๋๋ค.
Bundle์ด๋?
- ์ํํธ์จ์ด ๋ฐ ์ผ๋ถ ํ๋์จ์ด์ ํจ๊ป ์๋ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋ Package
- ๊ฐ๊ฐ์ ๋ชจ๋๋ค์ ๋ํด ์์กด์ฑ ๊ด๊ณ๋ฅผ ํ์ ํ์ฌ ํ๋ ๋๋ ์ฌ๋ฌ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ Webpack์ ์ฌ์ฉํด์ผํ ๊น?
- ๋ค๋ฅธ Module Bundler๋ ๋ง์ด ์กด์ฌํ์ง๋ง performance๊ฐ ์ฐ์ํฉ๋๋ค.
Browsify, Grunt, Gulp ๋ฑ์ ๋๊ตฌ๋ค์ webpack๊ณผ ๋ฌด์จ ์ฐจ์ด๊ฐ ์์๊น?
- ํฌ๊ณ ๋ณต์กํ๋ฉฐ ๋ค์ํ ๋ฆฌ์์ค๋ค์ด ๋ค์ด์๋ ํ๋ก์ ํธ์๋ webpack์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- Grunt, Gulp๋ ์ค๋ก์ง ๋ฆฌ์์ค๋ค์ ๋ํ ํด๋ก ์ฌ์ฉ๋๋ฉฐ dependency graph์ ๋ํ ๊ฐ๋ ์ด ์์ต๋๋ค.
- Browsify๋ ๋น์ทํ ๋๊ตฌ์ด์ง๋ง ์๋๋ฉด์์ webpack์ด ๋ ์ข์ต๋๋ค.
Webpack Core Concept
Entry
- dependency graph๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ
Input Source
์ ๋๋ค. - ์ง/๊ฐ์ ์ ์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง ๋ชจ๋๋ค์ ์ดํดํฉ๋๋ค.
- ์ฌ๋ฌ๊ฐ์ entry๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค.
- Default value :
./src/index.js
module.exports = {
entry: './path/to/my/entry/file.js'
};
Output
- Webpack์ด ์์ฑํ bundles์ ๊ฒฐ๊ณผ๋ฌผ์ ์์น๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
- Default value :
./dist/main.js
const path = require('path');
module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'my-first-webpack.bundle.js'
}
};
Loaders
- Webpack์ ์ค์ง Javascript์ Json๋ง ์ดํดํ ์ ์๋ ๋จ์ ์ด ์์ต๋๋ค.
- Loader๋ ๋ค๋ฅธ Type์ ํ์ผ์ Webpack์ด ์ดํดํ๊ณ ์ฒ๋ฆฌ๊ฐ๋ฅํ ๋ชจ๋๋ก ๋ณํ์ํค๋ ์์ ์ ๋ด๋นํฉ๋๋ค.
const path = require('path');
module.exports = {
output: {
filename: 'my-first-webpack.bundle.js'
},
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
}
};
Plugins
- Loader๊ฐ ๋ณํํ๋ ๋์ Plugin์ bundle optimization, asset management and injection of environment๊ณผ ๊ฐ์ ์ผ์ ์งํํ ์ ์์ต๋๋ค.
const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins
module.exports = {
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
]
};
Mode
- ๋ค์ํ Profile๋ก ์ง์ ํ์ฌ ์งํํ ์ ์์ต๋๋ค.
- development, production, none
- Default value :
production
module.exports = {
mode: 'production'
};
Browser Compatibility
- ์นํฉ์ ES5๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํฉ๋๋ค. ๋จ IE8์ ์๋ ๋ฒ์ ผ์ ์ง์ํ์ง ์์ต๋๋ค.
Webpack Tips
- Webpack GUI ์ค์ ์ฌ์ดํธ
- https://webpack.jakoblind.no/