다이나믹한 상호 작용이 많은 대규모 웹 서비스들이 생겨나면서 수십 줄의 코드, 수백 개의 JS 파일을 하나씩 관리하기 어려워지고 아래와 같은 문제들이 발생하였다.
이와 같은 문제들을 해결하기 위해 번들러(bundler)가 등장했다.
번들러(bundler)란,
웹 애플리케이션을 구성하는 모든 자원을 하나의 파일로 묶는(번들) 도구를 의미하며 사용할 시 아래와 같은 장점을 얻는다.
번들러의 종류엔 웹팩(Webpack)부터 Rollup, Parcel, Browserify 등이 있다.
// webpack.config.js
// 웹팩을 실행했을 때 src 폴더 밑의 index.js 을 대상으로 웹팩이 빌드를 수행하는 코드
module.exports = {
entry: './src/index.js'
}
filename(웸팩으로 빌드한 파일의 이름)
은 지정해주어야 하며 일반적으로 path(해당 파일의 경로)
속성을 함께 정의한다.// webpack.config.js
var path = require('path');
module.exports = {
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './dist')
// path.resolve() 는 인자로 넘어온 경로들을 조합하여 유효한 파일 경로를 만들어주는 Node.js API
}
}
module
라는 이름을 사용rules
배열에 옵션을 추가하면 된다.// webpack.config.js
module.exports = {
entry: './app.js',
output: {
filename: 'bundle.js'
},
module: {
rules: [
{
// test: 로더를 적용할 파일 유형 (일반적으로 정규 표현식 사용)
// use: 해당 파일에 적용할 로더의 이름
test: /\.css$/,
use: ['css-loader']
}
]
}
}
// webpack.config.js
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
// 웹팩으로 빌드한 결과물로 HTML 파일을 생성해주는 플러그인
new HtmlWebpackPlugin(),
// 웹팩의 빌드 진행율을 표시해주는 플러그인
new webpack.ProgressPlugin()
]
}
mode
라는 속성을 정의하면 웹팩의 실행 모드가 설정된다.none(모드 설정 안 함)
development(개발 모드)
production(배포 모드): 기본값
// webpack.config.js
module.exports = (env) => {
let entryPath = env.mode === 'production'
? './public/index.js'
: './src/index.js';
return {
entry: entryPath,
output: {},
// ...
}
}
// package.json
{
"build": "webpack",
"development": "npm run build -- --env.mode=development",
"production": "npm run build -- --env.mode=production"
}
// webpack.config.js
module.exports = {
devtool: 'cheap-eval-source-map'
}
// webpack.config.js
module.exports = {
devServer: {
hot: true
}
}