[React] ๐ŸงถWebpack ์‚ฌ์šฉ๋ฒ•

TATAยท2023๋…„ 3์›” 20์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
17/32

โ–ท Webpack์ด๋ž€?

ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ
๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ด๋‹ค.

Webpack์€ ํ•˜๋‚˜์˜ ์‹œ์ž‘์ (ex. index.js)์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š”
๋ชจ๋“ˆ์„ ๋ชจ๋‘ ์ถ”์ ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

โ“๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ?
์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ์ฃผ๋Š” ๊ฒƒ์„ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค.
HTML, CSS, JavaScript ๋“ฑ์˜ ์ž์›์„ ์ „๋ถ€ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ ,
์ด๋ฅผ ์กฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ๋ฒˆ๋“ค๋ง(๋นŒ๋“œ)ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.

โ“์™œ ์‚ฌ์šฉ?
๋‘ ๊ฐœ์˜ .js ํŒŒ์ผ์—์„œ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”
๋ณ€์ˆ˜ ๊ฐ„ ์ถฉ๋Œ์„ ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ๋ฒˆ๋“ค ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์ฃผ์–ด
์ธํ„ฐ๋„ท ์†๋„๊ฐ€ ๋Š๋ฆฐ ๊ตญ๊ฐ€์˜ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋„ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž˜ ๋งŒ๋“ค์–ด๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒˆ๋“ค๋ง์€ ๊ผญ ํ•„์š”ํ•˜๋‹ค.

โ—๏ธ์ฐธ๊ณ ) Webpack์—์„œ์˜ ๋ชจ๋“ˆ์€ JavaScript์˜ ๋ชจ๋“ˆ์—๋งŒ ๊ตญํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค. HTML, CSS, ํ˜น์€ .jpg๋‚˜ .png ๊ฐ™์€ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค๋„ ์ „๋ถ€ ํฌํ•จํ•œ ํฌ๊ด„์ ์ธ ๊ฐœ๋…์ด๋‹ค.


โ–ท Webpack ๋œฏ์–ด๋ณด๊ธฐ

๐Ÿงถ ๋นŒ๋“œ์™€ ๋ฒˆ๋“ค๋ง

๋นŒ๋“œ
npm run build๋ฅผ ์‹คํ–‰ํ•˜๋ฉด React build ์ž‘์—…์ด ์ง„ํ–‰๋˜๊ณ ,
index.html ํŒŒ์ผ์— ์••์ถ•๋˜์–ด ๋ฐฐํฌ์— ์ตœ์ ํ™”๋œ ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•ด ์ค€๋‹ค.

๋ฒˆ๋“ค๋ง
ํŒŒ์ผ์„ ๋ฌถ๋Š” ์ž‘์—… ๊ทธ ์ž์ฒด๋ฅผ ๋งํ•œ๋‹ค.
ํŒŒ์ผ์€ ์˜์กด์  ๊ด€๊ณ„์— ์žˆ๋Š” ํŒŒ์ผ๋“ค(import, export)
๊ทธ ์ž์ฒด ํ˜น์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํฌํ•จ ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“ˆ์„ ์˜๋ฏธํ•œ๋‹ค.


๐Ÿงถ ์›นํŒฉ์˜ ํ•ต์‹ฌ ๊ฐœ๋…

โˆ’ Entry : ๋ฒˆ๋“ค๋ง์„ ์›ํ•˜๋Š” ์œ„์น˜
โˆ’ Output : ๋ฒˆ๋“ค๋ง์˜ ๊ฒฐ๊ณผ๋ฌผ
โˆ’ Loaders
โˆ’ Plugins
โˆ’ Mode
โˆ’ Browser Compatibility

โˆ’ Webpack Dev Server
โˆ’ Clean Webpack Plugin


๐Ÿงถ Target

๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ๊ณผ target์„ ์ปดํŒŒ์ผํ•œ๋‹ค.

module.exports = {
  target: ["web", "es5"], // ๊ธฐ๋ณธ๊ฐ’์ด web
  // ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ es5 ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๊ฒ ๋‹ค๊ณ  ์ง€์ •ํ•œ ๊ฒƒ์ž„
};

๐Ÿงถ Entry

Entry point

webpack์—์„œ์˜ entry๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€
์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ "์‹œ์ž‘์ "์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ํŽธํ•˜๋‹ค.

Webpack์€ Entry point๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง๊ฐ„์ ‘์ ์œผ๋กœ
์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

//๊ธฐ๋ณธ ๊ฐ’
module.exports = {
	...
  entry: "./src/index.js",
};

-----
//์ง€์ • ๊ฐ’
module.exports = {
	...
  entry: "./src/script.js",
};

/*
* ๊ธฐ๋ณธ ๊ฐ’์€ ./src/index.js์ด์ง€๋งŒ,
* Entry ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋ฅธ (๋˜๋Š” ์—ฌ๋Ÿฌ entry point)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
*/

๐Ÿงถ Output

์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„
์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ webpack์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

const path = require('path'); // path ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

module.exports = {
	...
  output: {
    path: path.resolve(__dirname, "docs"), // ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค. 
    filename: "app.bundle.js",
    clean: true // ์˜ค๋ž˜๋œ ํŒŒ์ผ ์—†์ด ๋นŒ๋“œ์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  },
};

๐Ÿงถ Loader

Webpack์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript์™€ JSON ํŒŒ์ผ๋งŒ ์ดํ•ดํ•œ๋‹ค.
๊ทธ๋ž˜์„œ loader๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JavaScript, JSON์ด ์•„๋‹Œ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
(ex. CSS)

module.exports = {
	...
  module: {
    rules: [
      {
        test: /\.css$/, // ํŒŒ์ผ๋ช…์ด .css๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์— ์ ์šฉ
        use: [MiniCssExtractPlugin.loader, "css-loader"], // ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰ ์˜ค๋ฅธ์ชฝ => ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์ ์šฉ
        exclude: /node_modules/,
      },
    ],
  },
};

/*
* - test: ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ(ํ•„์ˆ˜)
* - use: ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋กœ๋”๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์†์„ฑ(ํ•„์ˆ˜)
* - exclude: ๋ฐ”๋ฒจ๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์ง€์ •
*   (๋ฐ˜๋Œ€๋กœ include ์†์„ฑ์„ ์ด์šฉํ•ด ๋ฐ˜๋“œ์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•  ํŒŒ์ผ์ด๋‚˜ ํด๋” ์ง€์ • ๊ฐ€๋Šฅ)
*/

๐Ÿงถ Plugins

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฒˆ๋“ค๋ง ๊ณผ์ • ์ค‘์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š”
๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

โ–ท html-webpack-plugin
๋ฒˆ๋“ค๋ง ๊ณผ์ • ์ค‘ html ํŒŒ์ผ์„ ์ž์‹ ์ด ์›ํ•˜๋Š”
ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•˜์—ฌ ๋ฒˆ๋“ค์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

// ์„ค์น˜ ํ›„ require๋กœ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ
npm i -D html-webpack-plugin

-----
const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  ...
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),
    new MiniCssExtractPlugin(),
  ],
};

/*
* ์œ„์˜ ์˜ˆ์ œ์—์„œ html-webpack-plugin ์€ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฒˆ๋“ค์„
* ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์ค€๋‹ค.
* mini-css-extract-plugin์€ CSS๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ถ”์ถœํ•ด
* CSS๋ฅผ ํฌํ•จํ•˜๋Š” JS ํŒŒ์ผ ๋‹น CSS ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ฃผ๊ฒŒ๋” ์ง€์›ํ•œ๋‹ค.
*/

๐Ÿงถ Optimization - ์ตœ์ ํ™”

Webpack์€ ๋ฒ„์ „ 4๋ถ€ํ„ฐ๋Š” ์„ ํƒํ•œ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์ตœ์ ํ™”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

module.exports = {
  ...
  optimization: {
    minimizer: [
      new CssMinimizerPlugin(),
    ]
  }
};

/*
* ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์ง€์›์ด ๋˜๋Š”๋ฐ,
* ๋Œ€ํ‘œ์ ์œผ๋กœ minimize์™€ minimizer ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.
* 
* - minimize: TerserPlugin ๋˜๋Š” optimization.minimize์—
*             ๋ช…์‹œ๋œ plugins๋กœ bundle ํŒŒ์ผ์„ ์ตœ์†Œํ™”(=์••์ถ•)์‹œํ‚ค๋Š” ์ž‘์—… ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
* 
* - minimizer: defualt minimizer์„ ์ปค์Šคํ…€๋œ
*              TerserPlugin ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
*/

๐Ÿงถ webpack-dev-server

๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜์˜ํ•ด์„œ(๋นŒ๋“œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ) ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

// ์„ค์น˜ ํ›„ ์‚ฌ์šฉ
npm i -D webpack-dev-server

-----
/* webpack.config.js */
devServer: {
  static: {
    directory: path.resolve(__dirname, โ€˜distโ€™)
  },
  port: 3001, 
}

-----
/* package.json */
"script" : {
  "build": "webpack"
  "start": "webpack server --open --mode=development",
}
  
/*
* package.json์˜ script์— web pack server์„ ์ถ”๊ฐ€ํ•˜๋ฉด
* npm start๋กœ ์‹คํ–‰์‹œ์ผฐ์„ ๋•Œ, ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜์˜ํ•ด์„œ(๋นŒ๋“œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ) ๋ณด์—ฌ์ค€๋‹ค.
*/

๐Ÿงถ clean-webpack-plugin

๊ธฐ์กด ๋นŒ๋“œ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ,
์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์ง€์šฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค.

// ์„ค์น˜ ํ›„ ์‚ฌ์šฉ
npm i -D clean-webpack-plugin

-----
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

Module.exports = {
  โ€ฆ
  Plugin: [new CleanWebpackPlugin()]
}

๐Ÿงถ webpack.config.js ์˜ˆ์‹œ

module.exports = {
  target: ["web", "es5"], // ๊ธฐ๋ณธ๊ฐ’์€ web
  entry: "./src/script.js",
  output: {
    path: path.resolve(__dirname, "docs"),
    filename: "app.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 ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

๐Ÿงถ start!

// package.json ์ƒ์„ฑํ•˜๊ธฐ
npm init -y

// ์›นํŒฉ ์„ค์น˜ํ•˜๊ธฐ
npm install -D webpack webpack-cli

๐Ÿงถ webpack.config.js

๋ฒˆ๋“ค๋ง์„ ์›ํ•˜๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ entry,
๋ฒˆ๋“ค๋ง์˜ ๊ฒฐ๊ณผ๋ฌผ์„ output์ด๋ผ๊ณ  ํ•œ๋‹ค.

// ์›นํŒฉ config ํŒŒ์ผ ์ž‘์„ฑ(package.json์ด ์žˆ๋Š” ์œ„์น˜์— ์ƒ์„ฑ)
// path๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'), // './dist'์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    filename: 'app.bundle.js',
  },
};

// npx webpack์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ
// package.json์˜ "scripts"์— "build": "webpack" ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

๐Ÿงถ CSS๋ฅผ ๋ฒˆ๋“ค์— ํฌํ•จํ•˜๊ธฐ

// ์„ค์น˜ ํ›„ ์‚ฌ์šฉ
npm i -D css-loader style-loader

-----
/* webpack.config.js */
const path = require("path");

module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "app.bundle.js",
  },
  module: {
    rules: [
      {
				// ํŒŒ์ผ๋ช…์ด .css๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์— ์ ์šฉ
        test: /\.css$/,
				// ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ์ˆœ์œผ๋กœ ์ ์šฉ
				// ๋จผ์ € css-loader๊ฐ€ ์ ์šฉ๋˜๊ณ , styled-loader๊ฐ€ ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.
				// ์ˆœ์„œ ์ฃผ์˜!
        use: ["style-loader", "css-loader"],
				// loader๊ฐ€ node_modules ์•ˆ์˜ ์žˆ๋Š” ๋‚ด์šฉ๋„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—
				// node_modules๋Š” ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค.
        exclude: /node_modules/,
      },
    ],
  },
};

// ์ดํ›„ npm run build ๋ช…๋ น์„ ํ†ตํ•ด ๋ฒˆ๋“ค๋ง์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋จ

๐Ÿงถ HTML์„ ๋ฒˆ๋“ค์— ํฌํ•จํ•˜๊ธฐ

npm i -D html-webpack-plugin

์„ค์น˜ ํ›„ webpack.config.js ํŒŒ์ผ์— ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ ์šฉํ•œ๋‹ค.
์ž˜ ์ ์šฉ๋˜์—ˆ์œผ๋ฉด, npm run build ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค.

const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "docs"),
    filename: "app.bundle.js",
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
        exclude: /node_modules/,
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),
    new CleanWebpackPlugin(),
  ],
  devServer: {
    static: {
      directory: path.resolve(__dirname, "docs"),
    },
    port: 3001,
  },
};



๐ŸงคCRA ์—†์ด Webpack์œผ๋กœ React ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
๐Ÿ‘‰ Webpack(๊ณต์‹๋ฌธ์„œ)
๐Ÿ‘‰ Webpack(๊ณต์‹๋ฌธ์„œ) - why webpack
๐Ÿ‘‰ CSS์— minify๋ฅผ ์ ์šฉํ•˜๊ธฐ : mini-css-extract-plugin / css-minimizer-webpack-plugin
๐Ÿ‘‰ WebpackManifestPlugin ์‚ฌ์šฉ๋ฒ•

profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€