๐Ÿ–ฅFrontEnd/ํ”„๋ก ํŠธ์—”๋“œ

TIL) ๋ฒˆ๋“ค๋ง์ด๋ž€, Webpack์˜ ํ•„์š”์„ฑ, ์›นํŒฉ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

hellohailie 2022. 7. 25. 17:30

๋ฒˆ๋“ค๋ง์ด๋ž€?

 

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ๋ฒˆ๋“ค๋ง์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์šฉ๋Ÿ‰์„ ์ค„์ด๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์œ ์ €์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. => ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆ๋“ค๋ง์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค. 

 

Webpack

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

* ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋Š” HTML, CSS, JS ๋“ฑ์˜ ์ž์›์„ ์ „๋ถ€ ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋กœ ๋ณด๊ณ  ์ด๋ฅผ ์กฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. 

 

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

 

Webpack์€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์ธ ๋กœ๋”(loader)๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํŒŒ์ผ๋„ ๋ฒˆ๋“ค๋ง ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

Webpack์˜ ํ•„์š”์„ฑ

โžฅ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ ๋†’์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ

์›นํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์ด ๋งŽ์œผ๋ฉด ์›น ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„์™€ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š”๋ฐ, ์ด๋Š” ์œ ์ €์˜ ์ดํƒˆ๋ฅ ์ด ์ง๊ฒฐ๋œ ๋ฌธ์ œ์ด๋‹ค. 

๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋Š” ํŒŒ์ผ์˜ ์ˆซ์ž๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค. 

 

Webpack์˜ ์žฅ์  

1. Webpack์ด ์—†์œผ๋ฉด ๊ฐ ์ž์›๋“ค์„ ์ผ์ผํžˆ ์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ ์–ป์–ด์™€์•ผ ํ•˜์ง€๋งŒ, Webpack์ด ์žˆ์œผ๋ฉด ๊ฐ™์€ ํƒ€์ž…์˜ ํŒŒ์ผ๋“ค์€ ๋ฌถ์–ด์„œ ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ์ฝ”์ŠคํŠธ๊ฐ€ ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. 

 

2. Webpack loader๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” JavaScript ES6์˜ ๋ฌธ๋ฒ•๋“ค์„ ES5๋กœ ๋ฒˆํ™˜ํ•ด์ฃผ๋Š” babel-loader๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์ตœ์„ ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์„ ํƒํ•ด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•œ๋‹ค. 

 

3. Production ๋ชจ๋“œ๋กœ ๋ฒˆ๋“ค๋ง์„ ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ, ์ฝ”๋“œ ๋‚œ๋…ํ™”, ์••์ถ•, ์ตœ์ ํ™”(Tree Shaking) ์ž‘์—…์„ ์ง€์›ํ•˜, ์ƒ์šฉํ™” ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š๋ผ๊ธฐ์— ๋”์šฑ ์พŒ์ ํ•œ ํ™˜๊ฒฝ ๋ฐ ๋ณด์•ˆ๊นŒ์ง€ ์‹ ๊ฒฝ์“ฐ๋ฉด์„œ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

Webpack์˜ ํ•ต์‹ฌ ๊ฐœ๋…
  • Entry
  • Output
  • Loaders
  • Plugins
  • Browser Compatibility

 

webpack์˜ config ํŒŒ์ผ ์˜ˆ์‹œ

 

const path = require('path');

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

module.exports = {
  target: ["web", "es5"],
  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(),
    ]
  }
};

 

โœ”๏ธ Target 

target์˜ ๊ธฐ๋ณธ๊ฐ’์€ web

โœ”๏ธ Entry(Entry point) = webpack์ด ๋‚ด๋ถ€์˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“ˆ

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

โœ”๏ธ Output(์ถœ๋ ฅ) = ์ƒ์„ฑ๋œ ๋ฒˆ๋“ค์„ ๋‚ด๋ณด๋‚ผ ์œ„์น˜์™€ ์ด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ webpack์— ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• 

๊ธฐ๋ณธ ์ถœ๋ ฅ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist/main.js๋กœ , ์ƒ์„ฑ๋œ ๊ธฐํƒ€ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ./dist ํด๋”๋กœ ์„ค์ •๋œ๋‹ค. 

path ์†์„ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” path ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. 

โœ”๏ธ Loader(๋กœ๋”) = Webpack์ด ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๊ทธ๋“ค์„ ์œ ํšจํ•œ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋””ํŽœ๋˜์‹œ ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์†์„ฑ์„ ๋„ฃ์–ด ๊ทœ์น™์„ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” module.rules ์•„๋ž˜์— ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. 

 

โœ”๏ธ Plugins(ํ”Œ๋Ÿฌ๊ทธ์ธ) = ๋ฒˆ๋“ค์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜ ์—์…‹์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… ๋“ฑ์˜ ๊ด‘๋ฒ”์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” require()๋ฅผ ํ†ตํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋จผ์ € ์š”์ฒญํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ๋ฐ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœํ•ด์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค. 

 

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

โœ”๏ธ Optimization(์ตœ์ ํ™”)

  • minimize : TerserPlugin ๋˜๋Š” optimization.minimize์— ๋ช…์‹œ๋œ plugins๋กœ bundle ํŒŒ์ผ์„ ์ตœ์†Œํ™”(=์••์ถ•)์‹œํ‚ค๋Š” ์ž‘์—… ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
  • minimizer : defualt minimizer์„ ์ปค์Šคํ…€๋œ TerserPlugin ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ์žฌ์ •์˜

 


โœ”๏ธ ํ•œ ๋ˆˆ์— ์ •๋ฆฌ

entry ํŒŒ์ผ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ 

bundler์ธ webpack์ด ๋ชจ์•„์„œ ๋ฒˆ๋“ค๋ง์˜ ๊ฒฐ๊ณผ๋ฌผ์„

output ๊ฒฝ๋กœ๋กœ ์‚ฐ์ถœํ•œ๋‹ค. 

 

loader JS, JSON์ด ์•„๋‹Œ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. 

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

 


์›นํŒฉ์„ ์ด์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•

1. npm init ํ•˜๊ธฐ

npm init -y

2. ์ž๋™์œผ๋กœ ์•„๋ž˜ ๋‚ด์šฉ์˜ package.json ํŒŒ์ผ ์ƒ์„ฑ๋จ

{
  "name": "fe-sprint-webpack-tutorial",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": ""
}

 

3. ์›นํŒฉ ์„ค์น˜ํ•˜๊ธฐ

npm install -D webpack webpack-cli

 

4. ์›นํŒฉ config ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

webpack.config.js ํŒŒ์ผ์— entry์™€ output ์ •๋ณด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ๋Š”๋‹ค. 

// webpack.config.js
const path = require('path');

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

 

5. ๋ฒˆ๋“ค๋งํ•˜๊ธฐ

npx webpack

dist/app.bundle.js ํŒŒ์ผ์— ์•„๋ž˜์™€ ๋น„์Šทํ•œ ์ด์ƒํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์žˆ์œผ๋ฉด ์„ฑ๊ณต!!!

webpack์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”(minifiy)ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ minifyํ•œ ์ฝ”๋“œ๋Š” ์•…์˜์ ์œผ๋กœ ํŽธ์ง‘ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

6. npm run build ์„ค์ •ํ•˜๊ธฐ

๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜์ž!! 

 

์ด์ œ npm run build ์Šคํฌ๋ฆฝํŠธ๋กœ ์–ธ์ œ๋“  ๋ฒˆ๋“ค๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "name": "fe-sprint-webpack-tutorial",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
		"build": "webpack", // here
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "devDependencies": {
    "webpack": "^5.73.0",
    "webpack-cli": "^4.10.0"
  }
}

 

7. ๋งŒ์•ฝ js ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด, dist์˜ app.bundle.js์— ์ ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์‹œ npm run build ๋ช…๋ น์–ด๋กœ ๋ฒˆ๋“ค๋ง์„ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค. 

 

8. css ํŒŒ์ผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด, ์ ์ ˆํ•œ ๋กœ๋”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

style-loader, css-loader ๋กœ๋” ์„ค์น˜ํ•˜๊ณ  webpack.config.js ํŒŒ์ผ ์กฐ์ •ํ•˜๊ธฐ

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/,
      },
    ],
  },
};

 

9. npm run build ๋ช…๋ น์„ ํ†ตํ•ด ๋ฒˆ๋“ค๋ง์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

VS Code์˜ Format Document ๊ธฐ๋Šฅ(alt + shift + F)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

dist/index.html ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด style ์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ž‘์„ฑํ•œ CSS๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ๋‹ค.

์ด์   <link rel="stylesheet" href="style.css"> ์ฝ”๋“œ๋Š” ์‚ญ์ œํ•ด๋„ ๋œ๋‹ค. 

 

10. HTML๋„ ๋ฒˆ๋“ค์— ํฌํ•จํ•˜๋Š” ์ž‘์—…ํ•˜๊ธฐ / ๋”ฐ๋กœ ์ƒ์„ฑํ•ด์คฌ๋˜ dist/index.html์„ src ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๊ธฐ

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

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

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

 

src/index.html ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋งํ•˜์—ฌ dist/index.html ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ’ซ์›นํŒฉ์„ ์ด์šฉํ•ด์„œ ๋ฒˆ๋“ค๋ง ํ•œ ํ›„ github page ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌํ•œ ํŽ˜์ด์ง€

 

https://hellohailie.github.io/background_color_change_app/


์ฐธ๊ณ )

๊นƒํ—™ ๋ฐฐํฌ

https://phodobit.kr/49

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“