๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

๐Ÿ”งWebpack : ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Plugin ๋ณธ๋ฌธ

โš›๏ธReact/๐Ÿ”งFront-Dev-Environment

๐Ÿ”งWebpack : ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Plugin

4:Bee 2024. 8. 20. 21:43
728x90

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๊ด€ํ•ด ์‚ดํŽด ๋ณผ ๊ฒƒ์ด๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์  ํ”Œ๋Ÿฌ๊ทธ์ธ 5๊ฐ€์ง€๋ฅผ ์‚ดํŽด ๋ณผ ๊ฒƒ์ด๋‹ค. 


BannerPlugin

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์šฐ๋ฆฌ๊ฐ€ BannerPlugin์„ ๋ชจ์‚ฌํ–ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ webpack์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต์„ ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. BannerPlugin์€ ๊ฒฐ๊ณผ๋ฌผ์— ๋นŒ๋“œ ์ •๋ณด๋‚˜ ์ปค๋ฐ‹ ๋ฒ„์ „๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ webpack.config์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

//webpack.config.js

const path = require('path');
const MyWebpackPlugin = require('./my-webpack-plugin');
const webpack = require('webpack');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    main: './src/app.js'
  },
 /* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
  plugins: [
    new CleanWebpackPlugin(), // ๋นŒ๋“œ ์ „์— dist ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    new webpack.BannerPlugin({
      banner: '์ด๊ฒƒ์€ Banner ์ž…๋‹ˆ๋‹ค.'
    })
  ],
}

์ด๋ฒˆ์—๋Š” ์ƒ์„ฑ๋œ ์‹œ๊ฐ„๊ณผ ๊นƒ ์ปค๋ฐ‹ log ๋ฒˆํ˜ธ ๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑ์ž ์ •๋ณด๋ฅผ ๋„ฃ์–ด ๋ณด์ž.

::cmd
git rev-parse --short HEAD

::a7cec5b

git config user.name

::4Bee

 ๊นƒ ์ปค๋ฐ‹ log ๋ฒˆํ˜ธ๋Š” git log์™€ ๊ฐ™์ด ํ™•์ธ์„ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋„ˆ๋ฌด๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋‹จ์ถ•๋œ log๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ git์„ ํ†ตํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋งค๋ฒˆ ์ •๋ณด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•ด์„œ ๋„ฃ์–ด ์ค„ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ์ž๋™ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ node-modules์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” childProcess๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
  plugins: [
    new CleanWebpackPlugin(), // ๋นŒ๋“œ ์ „์— dist ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    new webpack.BannerPlugin({
      banner: `
      Build Date: ${new Date().toLocaleDateString()}
      Commit Version: ${childProcess.execSync('git rev-parse --short HEAD')}
      Author: ${childProcess.execSync('git config user.name')}
      `
    })
  ],
 }

์ด๋ ‡๊ฒŒ childProcess๋ฅผ ์‚ฌ์šฉํ•ด์„œ git ๋ช…๋ น์–ด๋ฅผ build๊ฐ€ ๋˜๋Š” ๊ณผ์ •์— execSync๋กœ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ์ด์ œ build๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ๋„ˆ์— ์ถ”๊ฐ€๊ฐ€๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

/*dist/main.js*/
/*!
 * 
 *       Build Date: 2024. 8. 23.
 *       Commit Version: a7cec5b
 *
 *       Author: 4Bee
 *
 *
 */

๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— console์„ ํ†ตํ•œ log๋ฅผ ํ™•์ธํ•˜๋Š” ์šฉ๋„์™€ ์œ ์‚ฌํ•˜๋‹ค. ์ž˜ ํ™œ์š”์„ ํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.


DefinePlugin

  ํ”„๋ก ํŠธ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌ ํ•  ๋•Œ ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌํ™˜๊ฒฝ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์šด์˜์„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„ API ์„œ๋ฒ„ ์ฃผ์†Œ๋‚˜ ๋ณ€๊ฒฝ์ด ๋  ์ •๋ณด๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ `ํ™˜๊ฒฝ ์˜์กด ์ •๋ณด`๋ผ๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ ๋ฐฐํฌ๋ฅผ ํ•  ๋•Œ ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ณ ์ž DefinePlugin์„ ์‚ฌ์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ํ• ์ˆ˜ ์žˆ๋‹ค.(dotenv์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•œ๋‹ค.) ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ ์—ญ์‹œ webpack์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” process.env.NODE_ENV๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ๋กœ ์ ‘๊ทผํ•ด์„œ webpack.config์˜ `mode`๊ฐ’์„ ์–ป์–ด์™€์„œ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.  process.env.NODE_ENV๋ฅผ app.js์—์„œ console๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ ` development`๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ง์ ‘ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
  plugins: [
    new CleanWebpackPlugin(), // ๋นŒ๋“œ ์ „์— dist ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    new webpack.BannerPlugin({
      banner: `
      Build Date: ${new Date().toLocaleDateString()}
      Commit Version: ${childProcess.execSync('git rev-parse --short HEAD')}
      Author: ${childProcess.execSync('git config user.name')}
      `
    }),
    new webpack.DefinePlugin({
      TWO: '1+1'
    })
  ],
 }

์ด์ œ app.js์— TWO๋ผ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ ‘๊ทผ์„ ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

//app.js

console.log(process.env.NODE_ENV);
console.log(TWO);  //2

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๊ฐ’์œผ๋กœ console์ด ์ฐํžŒ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ž๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

//TWO: '1+1'
TWO: JSON.stringify('1+1')  //1+1
// ๊ฐ์ฒด ๋ฐฉ์‹
'api.domain': JSON.stringify('http://dev.api.domain.com')

HtmlTemplatePlugin

HtmlTemplatePlugin์€ ์ด์ „ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋‹ฌ๋ฆฌ ์จ๋“œ ํŒŒํ‹ฐ ํŒจํ‚ค์ง€์ด๊ธฐ์— ๋”ฐ๋กœ ์„ค์น˜๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. HtmlTemplatePlugin์€ HTML ํŒŒ์ผ์„ ํ›„์ฒ˜๋ฆฌํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ฉฐ ๋นŒ๋“œ ํƒ€์ž„์˜ ๊ฐ’์„ ๋„ฃ๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. HtmlTemplatePlugin์€ html์„ ์ž‘์—…ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด src ๋””๋ ‰ํ† ๋ฆฌ์— html์ด ์žˆ์„ ๊ฒฝ์šฐ, webpack์œผ๋กœ ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
const HtmlWebpackPlugin = require('html-webpack-plugin');

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */ 
 plugins: [
    new CleanWebpackPlugin(), // ๋นŒ๋“œ ์ „์— dist ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    new webpack.BannerPlugin({
      banner: `
      Build Date: ${new Date().toLocaleDateString()}
      Commit Version: ${childProcess.execSync('git rev-parse --short HEAD')}
      Author: ${childProcess.execSync('git config user.name')}
      `
    }),
    new webpack.DefinePlugin({
      TWO: JSON.stringify('1+1'),
      'api.domain': JSON.stringify('http://dev.api.domain.com')
    }),
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
}

์ดํ›„ build๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด dist ๋””๋ ‰ํ† ๋ฆฌ์— index.html ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ• ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ live-server๋กœ ์ ‘๊ทผ์„ ํ•˜๋ ค๋ฉด ์ฃผ์†Œ๊ฐ€ `PortNumber/~/dist/index.html`๋กœ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  ์ด๋ฒˆ์—๋Š” ์ด์–ด์„œ html์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ejs ๋ฌธ๋ฒ•์„ ์ž ๊น ๋‹ค๋ค„ ๋ณผ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๋ฌธ๋ฒ•์€ HtmlTemplatePlugin์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ template์„ html์— ์ง์ ‘ ๋„ฃ์–ด ๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๋ฌธ๋ฒ•์€ envs๋ผ๋Š” template๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

<!-- src/index.html -->

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document<%= env %></title>
</head>
<body>
<script type="module" src="./dist/main.js"></script>
</body>
</html>

์ด์ œ ์—ฌ๊ธฐ env์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด webpack.configํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
const HtmlWebpackPlugin = require('html-webpack-plugin');
/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
    new HtmlWebpackPlugin({
      template: './src/index.html',
      templateParameters: {
        env: process.env.NODE_ENV === 'development' ? '(๊ฐœ๋ฐœ์šฉ)' : ''
      }
    })
  ],
}

์ด์ œ build๋ฅผ ํ•˜๋ฉด๋œ๋‹ค. ๋‹จ, NODE_ENV์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ build๊ฐ€ ์•„๋‹Œ ์•„๋ž˜์™€ ๊ฐ™์ด build๋ช…๋ น์œผ๋กœ ์‹คํ–‰ ํ•ด์•ผํ•œ๋‹ค.

:: ๊ฐœ๋ฐœ์šฉ์ด ์•„๋‹Œ ์ œํ’ˆ์šฉ์ผ ๊ฒฝ์šฐ development ๋Œ€์‹ production์„ ๋„ฃ์œผ๋ฉด ejs์˜ env ๋ฌธ๋ฒ•์„ ๋ฌด์‹œํ•˜๊ณ  ๋นŒ๋“œ๊ฐ€ ๋œ๋‹ค.
:: npm(Window)
set NODE_ENV=development&& npm run build
:: npm(MacOS)
NODE_ENV=development yarn run build

:: yarn(Window)
set NODE_ENV=development&& yarn run build
::yarn(MacOS)
NODE_ENV=development&& yarn build

  ์ด์™ธ์—๋„ ๋นŒ๋“œ๋˜๋Š” html์— ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์ค„์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ๋นˆ์ค„ ์ œ๊ฑฐ์™€ ์ฃผ์„ ์ œ๊ฑฐ๋ฅผ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
const HtmlWebpackPlugin = require('html-webpack-plugin');
/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
    new HtmlWebpackPlugin({
      template: './src/index.html',
      templateParameters: {
        env: process.env.NODE_ENV === 'development' ? '(๊ฐœ๋ฐœ์šฉ)' : ''
      },
      minify: {
        collapseWhitespace: true,
        removeComments: true,
      }
    })
  ],
}

์ดํ›„ build๋ฅผ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ htmlํŒŒ์ผ์€ ํ•œ์ค„๋กœ ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋œ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Document(๊ฐœ๋ฐœ์šฉ)</title><script defer="defer" src="main.js"></script></head><body><script type="module" src="./dist/main.js"></script></body></html>

์ด๋ ‡๊ฒŒ ํ•œ์ค„๋กœ buildํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ development ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ producion์ผ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

//webpack.config.js

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
const webpack = require('webpack');
const childProcess = require('child_process');  //from node_modules
const HtmlWebpackPlugin = require('html-webpack-plugin');
/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
    new HtmlWebpackPlugin({
      template: './src/index.html',
      templateParameters: {
        env: process.env.NODE_ENV === 'development' ? '(๊ฐœ๋ฐœ์šฉ)' : ''
      },
      minify: production.env.NODE_ENV === 'production' ? {
        collapseWhitespace: true,
        removeComments: true,
      } : false
    })
  ],
}

์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„๋Š” ๋ฐ”๋žŒ์— `clean-webpack-plugin`๊ณผ `mini-css-extract-plugin`์„ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋“ค์ด ๋ชจ๋‘ ์‚ฌ๋ผ์กŒ๋‹ค. ๋’ค์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ 2๊ฐœ๋Š” ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. NODE_ENV๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์ด์˜€๋‹ค. ์˜คํžˆ๋ ค ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณด์•„์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ mini-css-extract-plugin์ด์˜€๋‹ค. ์ถ”ํ›„์— ๋‹ค์‹œ ์ ๊ฒ€ํ•˜๋ฉด์„œ ๋งˆ๋ฌด๋ฆฌ ์ง€์„ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ Github์—์„œ ์ „์ฒด์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋‹ฌ๋ผ.

/* -- ์ค‘๊ฐ„ ์ƒ๋žต -- */
new CleanWebpackPlugin(), // ๋นŒ๋“œ ์ „์— dist ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    ...(process.env.NODE_ENV === 'production'
      ? [new MiniCssExtractPlugin({ filename: '[name].css' })]
      : [])

 

 

Frontend-Development-Environment/webpack.config.js at main · Programming-Contents-List/Frontend-Development-Environment

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ… ์ˆ˜์—…. Contribute to Programming-Contents-List/Frontend-Development-Environment development by creating an account on GitHub.

github.com

 

728x90

'โš›๏ธReact > ๐Ÿ”งFront-Dev-Environment' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ”งWebpack : ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Babel Plugin(Preset)  (4) 2024.08.30
๐Ÿ”งWebpack : Babel  (0) 2024.08.24
๐Ÿ”งWebpack : Plugin  (0) 2024.08.20
๐Ÿ”งWebpack : url-loader  (0) 2024.07.19
๐Ÿ”งWebpack : file-loader  (0) 2024.07.17
Comments