1 webpack 기본강의
source: categories/study/youtube-developers_quality/webpack.md
1.1 웹팩 기본강의
웹팩을 하기전에 우선 번들링(bundling)이란 개념을 알아야되는데, 번들링이란 우리가 개발한 파일을 하나로 합쳐주는 애를 번들러라고합니다.
꼭 자바스크립트 파일만이 아니고 HTML 파일이 될 수도 있고, 이미지가 될수도있고, CSS가 될수도있고
어쨌든 그런 파일들을 최적화를 하면서 압축을 해주면서 자바스크립트 파일은 하나로 합쳐준다던지
이런식으로 처리를 해주는 것을 번들링이라고 하는데, 그 번들링하는 툴을 번들러라고 부릅니다.
웹팩은 여러가지 번들러중 가장 인기있는 번들러입니다.
번들링한 파일들을 서버에올려서 배포하는 것이죠.
사용자가 사용하는 페이지들은 웹팩으로 번들링이 끝난 최종버전 파일이 되는 것입니다.
webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CopyWebpackPlugin = require("copy-webpack-plugin");
const webpackMode = process.env.NODE_ENV || 'development';
module.exports = {
mode: webpackMode,
entry: {
main: './src/main.js', // 빌드의 시작점
},
output: { // 최종 파일을 어디에다 생성할지를 정함
path: path.resolve('./dist'),
filename: '[name].js'
},
// es5로 빌드 해야 할 경우 주석 제거
// 단, 이거 설정하면 webpack-dev-server 3번대 버전에서 live reloading 동작 안함
// target: ['web', 'es5'],
devServer: {
liveReload: true
},
optimization: {
// 파일 공백을 없애줌
minimizer: webpackMode === 'production' ? [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true // console 코드를 지웁니다
}
}
})
] : [],
splitChunks: {
chunks: 'all'
}
},
// externals: {
// 빌드 과정에서 제외하고 그대로 사용할 패키지 지정
// 예시 - foo라는 이름의 모듈이라면 아래처럼 입력
// foo: "foo"
// },
module: {
rules: [
{
test: /\.(css|scss)$/,
use: [
process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader :
'style-loader',
'css-loader',
'sass-loader',
]
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'url-loader',
options: {
name: '[name].[ext]?[hash]',
limit: 10000, // 10kb 이하 파일은 그냥 이미지 파일을 쓰는게 아니라 Base64 포맷으로해서 이미지 자체를 데이터로 포함시키도록 처리
// 그렇게하면 이미지가 외부에서 로드되는게 아니라 문서 자체의 데이터로 들어가있기 때문에 로딩시간이 단축된다.
// 그래서 작은 아이콘 같은 경우에는 보통 이렇게 처리를 해준다.
}
},
{
test: /\.js$/,
loader: 'babel-loader', // 최신 스펙으로 개발한 자바스크립트 파일을 인터넷 익스플로러 같은데서도, 구형 브라우저에서도 잘 돌아갈 수 있도록 예전 방식하고 호환되는 자바스크립트 코드로 변환해준다.
exclude: /node_modules/
},
{
test: /\.js$/,
enforce: 'pre',
use: ['source-map-loader'],
}
]
},
plugins: [
new webpack.BannerPlugin({ // 라이센스 텍스트 파일에 라이센스 관련 정보를 출력
banner: `
LICENSE.txt에 출력할 내용
`
}),
new HtmlWebpackPlugin({ // index.html을 컨트롤 - 공백없이 압축을 해준다던지
template: './src/index.html',
minify: process.env.NODE_ENV === 'production' ? {
collapseWhitespace: true,
removeComments: true,
} : false
}),
new CleanWebpackPlugin(), // 빌드를 할 때마다 배포용 파일이 dist 폴더에 생기는데 빌드할 때마다 일단 파일들을 싹 지워버리고 새로 만들도록 클린 작업을 해준다.
// 그렇게 안하면 만약에 빌드를 잘못해서 원하지 않는 파일들이 생겼어. 그런데 그 다음에 다시 빌드를 하면 새로운 파일이 생기는데 이전에 생겼던 원하지않는 파일들도 그대로 남아있게된다.
// 그래서 일부로 지워줘야되니까 귀찮기 때문에 이거를 같이 써주는 것.
// CopyWebpackPlugin: 그대로 복사할 파일들
new CopyWebpackPlugin({
patterns: [
{ from: "./src/main.css", to: "./main.css" },
{ from: "./src/images", to: "./images" },
],
})
]
};
babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: { // 타겟 브라우저의 버전을 숫자로 입력할 수 있다.
chrome: '58',
ie: '11',
},
useBuiltIns: 'usage',
corejs: {
version: 3,
}
}]
]
};