npm init -y
npm install -D webpack webpack-cli
const path = require('path');
module.exports = {
entry: "./src/script.js",
output: {
filename: "[fullhash].bundle.js",
path: path.resolve(__dirname, 'dist'),
},
};
npx webpack
"scripts": {
"build": "webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
npm i -D html-webpack-plugin
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: "./src/script.js",
output: {
filename: "[fullhash].bundle.js",
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, 'src', 'index.html'),
}),
],
};
npm i -D style-loader css-loader
require("./style.css");
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./src/script.js",
output: {
path: path.resolve(__dirname, "dist"), // './dist'의 절대 경로를 리턴합니다.
filename: "[fullhash].bundle.js", // 파일name동적생성
clean: true, // 빌드전 빌드폴더 정리
},
module: {
rules: [
{
// 파일명이 .css로 끝나는 모든 파일에 적용
test: /\.css$/,
// 배열 마지막 요소부터 오른쪽에서 왼쪽 순으로 적용
// 먼저 css-loader가 적용되고, styled-loader가 적용되어야 한다.
// 순서 주의!
use: ["style-loader", "css-loader"],
// loader가 node_modules 안의 있는 내용도 처리하기 때문에
// node_modules는 제외해야 합니다
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
],
};
웹팩을 통해 배포하기 위한 코드를 작성하면 require등의 코드가 브라우저에서 실행되지 않는 등의 문제 때문에 실시간으로 개발 상황을 확인하기 불편하다. 이 때 웹팩에서 제공하는 개발서버 기능을 활용하면 된다.
개발 서버 기능 설치
npm install -D webpack-dev-server
webpack.config.js 수정
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./src/script.js",
output: {
filename: "[fullhash].bundle.js",
path: path.resolve(__dirname, "dist"),
clean: true, // 빌드전 빌드폴더 정리
},
module: {
rules: [
{
// 파일명이 .css로 끝나는 모든 파일에 적용
test: /\.css$/,
// 배열 마지막 요소부터 오른쪽에서 왼쪽 순으로 적용
// 먼저 css-loader가 적용되고, styled-loader가 적용되어야 한다.
// 순서 주의!
use: ["style-loader", "css-loader"],
// loader가 node_modules 안의 있는 내용도 처리하기 때문에
// node_modules는 제외해야 합니다
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
],
devServer: {
static: {
directory: path.resolve(__dirname, "docs"),
},
port: 3001, //포트 번호는 임의로 지정한다.
},
};
"scripts": {
"build": "webpack --mode=production",
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack serve --open --mode=development"
},
npm install --save-dev mini-css-extract-plugin
npm install css-minimizer-webpack-plugin --save-dev
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
target: ["web", "es5"],//ES6를 지원하지 않는 브라우저에서 실행 가능
entry: "./src/script.js",
output: {
path: path.resolve(__dirname, "docs"),
filename: "[fullhash].bundle.js",
clean: true
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
optimization: {
minimizer: [
new CssMinimizerPlugin(),
],
},
};
config file를 development mode와 production mode로 나누다.
webpack.config.js 대신에 webpack.config.base.js와 webpack.config.dev.js와
webpack.config.prod.js로 나눠서 만든다.
webpack.config.base.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
target: ["web", "es5"],
entry: "./src/script.js",
output: {
path: path.resolve(__dirname, "docs"),
filename: "[fullhash].bundle.js",
clean: true,
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "src", "index.html"),
}),
new MiniCssExtractPlugin(),
],
optimization: {
minimizer: [new CssMinimizerPlugin()],
},
};
webpack-merge를 활용하여 dev모드와 prod모드 config만든다.
npm install --save-dev webpack-merge
webpack.config.dev.js
const { merge } = require("webpack-merge");
const baseConfig = require("./webpack.config.base");
module.exports = merge(baseConfig, {
mode: "development",
devServer: {
port: 3001,
},
});
const { merge } = require("webpack-merge");
const baseConfig = require("./webpack.config.base");
module.exports = merge(baseConfig, {
mode: "production",
});
"scripts": {
"build": "webpack --config webpack.config.prod.js",
"dev": "webpack-dev-server --open --config webpack.config.dev.js"
},
오늘의 오류 해결
- 중간중간 npm run build하기!!!
- output의 filename: "[fullhash].bundle.js" 이런식으로 랜덤으로 파일이름 지정