๐ Webpack์ด๋?
- ์คํ ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ด๋ค.
- ์ด๋ ๋ชจ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์์ (HTML, CSS, JS, Images ๋ฑ)์ ํด๋นํ๋ค. (์ฆ, ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ ํ์ผ์ ๋งํ๋ค.)
Entry point
๋ถํฐ ์์ํ์ฌ dependency graph
๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋๋ค์ bundling
ํ๋ค.
๐ก Webpack์ ์ ์ฌ์ฉํด์ผ ํ ๊น?
- ์ฝ๋๊ฐ ๊ธธ๊ณ ๋ง์์ง์๋ก ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ง์ ์์ ํ์ผ(์ฝ๋)์ ๋ธ๋ผ์ฐ์ ์ ๋ก๋ํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ํน์ ์ํฉ์ ๋คํธ์ํฌ ๋น์ฉ์ด ๋ฐ์ํ ์ ์๋ค.
- Webpack์ ์ฌ์ฉํ๊ธฐ ์ CommonJS๋ AMD๋ก ํ์ผ๋ณ๋ก ๋ชจ๋์ ๊ด๋ฆฌํ ์ ์์์ง๋ง, ์ฌ์ ํ ๋ธ๋ผ์ฐ์ ์์๋ ์ฝ์ง ์๋ค๊ณ ํ๋ค.
SPA(Single Page Application)
์ด ์ถ์ธ์ด๊ณ , ๋ธ๋ผ์ฐ์ ๋ฅผ ์ต์ ํ ํ๋ ๊ฒ์ ์น ํ๋ก ํธ์๋์๊ฒ ๊ผญ ํ์ํ ์๊ตฌ ์กฐ๊ฑด์ด๋ค.
๐ก Webpack์ ์ฃผ์ ๊ฐ๋
entry
- Webpack์ ๋ชจ๋ ํ์ผ์ ๋ชจ๋๋ก ๊ด๋ฆฌํ๊ณ ๋ชจ๋์ด ๋ง์์ง์๋ก ์์กด์ฑ์ด ๋์์ง๋ค.
- ๊ทธ ์์กด์ฑ์ ์์์ ์
entry
๋ผ๊ณ ํ๋ค.
- ์ฝ๊ฒ ๋งํ์๋ฉด ํ๋ก์ ํธ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ๊ฐ์ฅ ๋จผ์ ๋ถ๋ฌ์ค๋ ํ์ผ
const config: webpack.Configuration = merge(baseConfig, {
mode: 'production',
entry: './src/index.tsx',
output
: ๋ฒ๋ค๋ ํ์ผ์ ์์น์ ํ์ผ๋ช
์ง์
output: {
path: path.resolve(__dirname, '..', 'dist'),
publicPath: '../dist/',
filename: 'bundle.js'
},
loader
- Webpack์ ์ฌ์ค javascript์ JSON ๋ง ๋น๋ํ ์ ์๋ค.
- ๋ค๋ฅธ ์์ (HTML, CSS, Image)์ ๋น๋ํ ์ ์๋๋ก ๋์์ฃผ๋ ์์ฑ
css-loader
, file-loader
, babel-loader
/**
* Transfile TS files or TSX files to JS files.
* And run babel at JS files to transfile ES6+ code to ES5.
*/
{
test: /\.tsx?$/,
use: {
loader: 'awesome-typescript-loader',
options: {
silent: true,
useBabel: true,
useCache : true,
babelCore: '@babel/core',
babelOptions: {
babelrc: false,
presets: babelPresets
}
}
}
},
plugin
- Webpack์ ๊ธฐ๋ณธ์ ์ธ ๋์์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์์ฑ์ด๋ค.
loader
๋ ํ์ผ์ ํด์ํ๊ณ ๋ณํํ๋ ๊ณผ์ ์ ๊ด์ฌํ๋ ๋ฐ๋ฉด, plugin
์ ํด๋น ๊ฒฐ๊ณผ๋ฌผ์ ํํ๋ฅผ ๋ฐ๊พธ๋ ์ญํ ์ ํ๋ค.
- ๊ฒฐ๊ณผ๋ฌผ์์ ์คํ์ผ ์ฝ๋๋ง ๋ฝ์์ ๋ณ๋ css ํ์ผ๋ก ๋ง๋ค์ด ์ญํ ์ ๋ฐ๋ผ์ ํ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
plugins: [
/**
* Add production environment.
* Ref: https://webpack.js.org/plugins/define-plugin/
*/
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production'),
'process.env.FLUENTFFMPEG_COV': false
}),
๐ Babel์ด๋?
- ์๋ฐ์คํฌ๋ฆฝํธ
ES6
๋ฌธ๋ฒ์ ES5
๋ก ๋ณํํด์ฃผ๋ ํธ๋ ์คํ์ผ๋ฌ(transpiler
)์ด๋ค.
- ๋ธ๋ผ์ฐ์ ๋ค์ด ์ต์ Javscript ์ฝ๋๋ฅผ ์ฝ์ง ๋ชปํ๋ ๊ฒ์ ์ํด ์ต์ ๋ฒ์ ์ Javascript๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ์ ์ ์๋๋ก ์๋ ๋ฒ์ ์ Javascript ์ฝ๋๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- Babel ๋์์ ์ธ ๋จ๊ณ๋ก ๊ตฌ๋ถ๋๋ค.
- ํ์ฑ (
Parsing
) : ์ฝ๋๋ฅผ ์ฝ๊ณ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST
)๋ก ๋ณํํ๋ ๋จ๊ณ
- ๋ณํ (
Transsforming
) : ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ๋จ๊ณ
- ์ถ๋ ฅ (
Printing
) : ๋ณ๊ฒฝ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํ๋ ๋จ๊ณ
- Babel์ด ๋ด๋นํ๋ ๊ฒ์ ํ์ฑ๊ณผ ์ถ๋ ฅ์ด๊ณ ๋ณํ ๋จ๊ณ๋
Babel Plugin
์ด ๋ด๋นํ๋ค.
- ํ๋ฌ๊ทธ์ธ์ ์ด๋ค ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ณํํ ์ง์ ๋ํ ๊ท์น์ ์ ์ํ๋ค. (ํ๋ฌ๊ทธ์ธ๋ค์ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฌถ์ด๋์ ์ธํธ๋ฅผ
preset
์ด๋ผ๊ณ ํ๋ค.)
- ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ: ํ๋ก๊ทธ๋จ ๋ด์์ ๋ฐ์ํ๋ ๊ธฐ๋ฅ์ ๋ํ๋ด๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ตฌ๋ฌธ ๊ตฌ์กฐ์ด๋ค. ์ฝ๋๋ฅผ ๊ตฌ์กฐํ๋ ํธ๋ฆฌ๋ก ๋ณํ