Webpack ๊ณผ์ œ-01

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

๊ณผ์ œ

๋ชฉ๋ก ๋ณด๊ธฐ
6/6

๐Ÿ Bare Minimum

CLI์—์„œ npm i ๋กœ node_modules ๋‹ค์šด๋ฐ›๊ธฐ?

โžฐ src ํด๋” ๋งŒ๋“ค์–ด์„œ index.html, script.js, style.css, data.js ๋„ฃ๊ธฐ

โžฐ data.js๋ž‘ script.js ์ˆ˜์ •ํ•˜๊ธฐ

  • data.js : const agoraStatesDiscussions = [...] ์•ž์— export ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ
    โ‡’ script.js ์— ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•  ์˜ˆ์ •
  • script.js : ์ƒ๋‹จ์— import {agoraStatesDiscussions} from "./data" ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , let data = agoraStatesDiscussions ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ
    โ‡’ data.js ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋“ค ๋‹ค ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€

โžฐ ๊ด€๋ จ ์›นํŒฉ ์ „๋ถ€ ์„ค์น˜ํ•˜๊ธฐ(CLI ์—์„œ)

npm i -D webpack webpack-cli css-loader style-loader html-webpack-plugin

โžฐ package.json ์— build ์ถ”๊ฐ€

"script" ๊ฐ์ฒด ์•ˆ์— "build": "webpack", ์ถ”๊ฐ€ํ•˜๊ธฐ

โžฐ webpack.config.js ๋งŒ๋“ค๊ธฐ

src ํด๋” ๋ฐ–์— ๋งŒ๋“ค๊ธฐ!!!!!

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

module.exports = {
  mode: "development",
  entry: "./src/script.js",
  output: {
    filename: "app.bundle.js", // ์ง„์ž…์ 
    path: path.resolve(__dirname, "dist"), // ๊ฒฝ๋กœ
  },
  module: {
    rules: [
      {
        test: /\.css$/i, // .css ํŒŒ์ผ ์ „๋ถ€?
        use: ["style-loader", "css-loader"], // css-loader๋ž‘ style-loader ์‚ฌ์šฉํ•˜๊ธฐ
        exclude: /node_modules/, // node_modules ๋ผ๋Š” ํ…์ŠคํŠธ ๋“ค์–ด๊ฐ„ ํŒŒ์ผ์ด๋‚˜ ํด๋” ์ „๋ถ€ ์ œ์™ธ
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      // template ์˜ต์…˜ ์ถ”๊ฐœํ•ด์„œ html ํŒŒ์ผ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ
      // ํ˜„์žฌ ๋‚ด index.html ํŒŒ์ผ์€ src ํด๋” ๋‚ด์— ์žˆ์œผ๋‹ˆ๊นŒ ์•„๋ž˜์ฒ˜๋Ÿผ ์”€
      // ๋งŒ์•ฝ index.html ์ด webpack์ด๋ž‘ ๊ฐ™์€ ๋ ˆ๋ฒจ์„  ์ƒ์— ์žˆ๋‹ค๋ฉด
      //()์•ˆ์— index.html ๋งŒ ์จ์ฃผ๋ฉด ๋œ๋‹ค.
      template: path.resolve(__dirname, "src", "index.html")
    })
  ],
}

โžฐ index.html ์ˆ˜์ •

index.html ํŒŒ์ผ ์•ˆ์— css ์—ฐ๊ฒฐ๋œ <link> ํƒœ๊ทธ๋ž‘
data.js ์—ฐ๊ฒฐ๋œ <script> ํƒœ๊ทธ๋ž‘ script.js ์—ฐ๊ฒฐ๋œ <script> ํƒœ๊ทธ ์ง€์šฐ๊ธฐ

โžฐ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ

CLI์— npm run build ์ž…๋ ฅํ•ด์„œ ๋ฒˆ๋“ค๋งํ•ด์ฃผ๋ฉด
dist ํด๋”์— app.bundle.js ์ƒ์„ฑ๋˜๊ณ , index.html ์ƒ์„ฑ๋œ๋‹ค.
โ‡’ dist/index.html ์— <script defer="defer" src="app.bundle.js"></script> ์ถ”๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฉด ๋จ!

๐Ÿง ์‹œํ–‰์ฐฉ์˜ค-01

src/index.html ์— ์žˆ๋Š” css ๋ž‘ script ๋“ค์„ ์ง€์šฐ์ง€ ์•Š๊ณ  ์ž๊พธ ๋ฒˆ๋“ค๋งํ•จ..ใ…Ž

๐Ÿง ์‹œํ–‰์ฐฉ์˜ค-02

์ž๊พธ src/index.html ์„ ์—ด์—ˆ๋‹ค..
๋ฒˆ๋“ค๋ง ๋œ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋ ค๋ฉด dist/index.html ์„ ๋ผ์ด๋ธŒ ์„œ๋ฒ„๋กœ ์—ด์–ด์„œ ํ™•์ธํ•˜์ž



๐Ÿ Advanced

๐Ÿ‘ output ๊ด€๋ฆฌ

  • โœ”๏ธ ๋ฒˆ๋“ค๋ง ํ•  ๋•Œ ๋งˆ๋‹ค dist ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ
  • โœ”๏ธ app.bundle.js ๊ฐ€ ์•„๋‹ˆ๋ผ, output์ด ๋Š˜ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋„๋ก ์ƒ์„ฑํ•ด๋ณด๊ธฐ

Bare Minimum ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ webpack.config.js ์—์„œ
๋™์ ์œผ๋กœ ํŒŒ์ผ์ด๋ฆ„์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ฒŒ entry ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ณ 
output ์•ˆ์— filename ์„ "[name].bundle.js", ๋กœ ๋ฐ”๊พธ๊ณ 
clean: true, ์ถ”๊ฐ€ํ•˜๊ธฐ

entry: {
  main: "./src/script.js", 
},
output: {
  filename: "[name].bundle.js",
  path: path.resolve(__dirname, "dist"),
  clean: true,
},

โ‡’ clean: true ๋ฅผ ์คฌ๋”๋‹ˆ ์ด์ „์— ์žˆ์—ˆ๋˜ app.bundle.js ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค.

๐Ÿ‘ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

  • โœ”๏ธ ES6๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ target ์†์„ฑ์„ ํ™œ์šฉํ•˜๊ธฐ

webpack.config.js ์— target ์ถ”๊ฐ€ํ•˜๊ธฐ

module.exports = {
  mode: development,
  target: ["web", "es5"] // es5 ๋ฒ„์ „์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ฒŒ
}

๐Ÿ‘ ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„

  • โœ”๏ธ ๋ผ์ด๋ธŒ ์„œ๋ฒ„์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” webpack-dev-server๋ฅผ ์ ์šฉํ•˜๊ธฐ

CLI ์— npm i -D webpack-dev-server ๋กœ ์„ค์น˜ํ•˜๊ณ ,
package.json "script" ๊ฐ์ฒด ์•ˆ์— "dev": "webpack serve", ์ถ”๊ฐ€ํ•˜๊ธฐ

webpack.config.js ํŒŒ์ผ์—
module.exports ์•ˆ์— plugins ๋ฐ‘์— devServer ์ถ”๊ฐ€ํ•˜๊ธฐ

module.exports = {
  ...
  devServer: {
    port: 8000,
  }
};

๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„๊ฐ€ ์ œ๋Œ€๋กœ ๋๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด
port๋ฅผ 8000์œผ๋กœ ์„ค์ •ํ–ˆ์œผ๋‹ˆ๊นŒ 8000 ํฌํŠธ๋กœ ์ง„์ž…ํ•˜๊ธฐ
CLI ์— npm run dev (ํ•ด์„œ webpack server ์—ด๊ณ ?) ํ–ˆ์„ ๋•Œ
successfully ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ
[webpack-dev-server] Loopback: http://localhost:8000/ ์˜ ํ•ด๋‹น ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ™•์ธ์ด ๋˜๋ฉด ์ œ๋Œ€๋กœ ๋œ๊ฑฐ๋‹ค!

๐Ÿ‘ ์ž‘๋™ ๋ชจ๋“œ ์„ค์ • + Asset ๊ด€๋ฆฌ

  • โœ”๏ธ development mode์™€ production mode์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜๊ณ , config file์„ ๋‚˜๋ˆ„๊ธฐ
  • โœ”๏ธ CSS์— minify๋ฅผ ์ ์šฉํ•ด๋ณด๊ธฐ. (ํžŒํŠธ: mini-css-extract-plugin, css-minimizer-webpack-plugin)

mode: development ์™€ mode: production ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ config ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 
์ด๊ฑธ ํ•ฉ์ณ์ฃผ๋Š” ๋…€์„์ด ํ•„์š”ํ•œ๋ฐ ์ด๋Š” merge๋ž€ package๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

โžฐ ์„ฑ๊ฒฉ์— ๋งž๋Š” config ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

๊ฐ๊ธฐ ๋‹ค๋ฅธ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„ ํŒŒ์ผ๋“ค
webpack.common.js, webpack.dev.js, webpack.prod.js
์›๋ž˜ webpack.config.js ํŒŒ์ผ์ด ์žˆ๋˜ root ์— ๋งŒ๋“ค๊ณ  webpack.config.js ์ง€์šฐ๊ธฐ
(CLI ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ)

  • mode: production ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ : mini-css-extract-plugin (style-loader ๋Œ€์‹ ), css-minimizer-webpack-plugin, devtool, target
  • mode: development ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ : webpack-dev-server, target

โžฐ webpack-merge ์„ค์น˜ํ•˜๊ธฐ

์ด config ํŒŒ์ผ๋“ค์„ ํ•ฉ์ณ์ค„ ์ˆ˜ ์žˆ๋Š” webpack-merge ๋ฅผ CLI ์—์„œ ์„ค์น˜ํ•œ๋‹ค.

โžฐ ๊ฐ config ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

webpack.common.js
๊ณตํ†ต ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋Š๋‚Œ์œผ๋กœ, ๊ธฐ์กด์— webpack.config.js ํŒŒ์ผ์—์„œ
mode, devServer, devtool, style-loader ์„ ์‚ญ์ œํ•œ๋‹ค.
์ถ”๊ฐ€๋กœ ์šฐ๋ฆฌ๋Š” github ๋ฐฐํฌ๋ฅผ docs ํŒŒ์ผ๋กœ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—
output ์— path ๋ฅผ path: path.resolve(__dirname, "docs"), ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

webpack.dev.js
mode, devServer. devtool ์ถ”๊ฐ€

const { merge } = require("webpack-merge");
const common = require("./webpack.common.js");
// ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” style-loader๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•จ????
const customizedDevCommon = {
  ...common,
  module: {
    rules: [
      { 
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
        exclude: /node-modules/,
      }
    ],
  },
};
//
module.exports = merge(customizedDevCommon, {
  mode: "development",
  devServer: {
    port: 8000,
  }
  devtool: "eval-source-map", // ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ์ถ”์ฒœํ•˜๋Š” sourceMap 
})

webpack.prod.js
MiniCssExtractPlugin ์€ loader ๋ž‘ plugin ์— ๋“ฑ๋กํ•˜๊ณ 
CssMinimizerPlugin ์€ ์ตœ์ ํ™”์— ๋“ฑ๋ก

const { merge } = require("webpack-merge");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-plugin");
const common = require("./webpack.common.js");
// ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” MiniCssExtractPlugin ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•จ
const customizedDevCommon = {
  ...common,
  module: {
    rules: [
      { 
        test: /\.css$/i,
        use: [MiniCssExtractPlugin.loader, "css-loader"], // MiniCssExtractPlugin loader ๋“ฑ๋ก
        exclude: /node-modules/,
      }
    ],
  },
};
//
module.exports = merge(customizedDevCommon, {
  mode: "production",
  optimization: {
    minimizer: [new CssMinimizerPlugin()],
  },
  plugins: [new MiniCssExtractPlugin()],
})

โžฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ config ํŒŒ์ผ ๊ด€๋ จ package.json์— ์„ค์ • ์ถ”๊ฐ€ํ•˜๊ธฐ

webpack ์ด mode์— ๋งž๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ
package.json ์— script๋ฅผ ์•Œ๋งž๊ฒŒ ๋ฐ”๊ฟ”์ฃผ์ž

"script" ๊ฐ์ฒด ์•ˆ์— "dev": "webpack serve --open --config webpack.dev.js", ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ 
"build": "webpack --config webpack.prod.js", ์ถ”๊ฐ€ํ•˜๊ธฐ

๐Ÿ‘ github ์— ๋ฐฐํฌํ•˜๊ธฐ

remote url ํ™•์ธํ•˜๊ธฐ : git config --get remote.origin.url

โžฐ ๋จผ์ € ๋‚ด github ์— ์ƒˆ๋กœ์šด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

โžฐ ์ด์ „์˜ git ๋‚ ๋ฆฌ๊ณ  ๋‹ค์‹œ ์„ค์ •ํ•˜๊ธฐ

agora-state-reference ๋ฅผ clone ํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์—
CLI ์—์„œ rm -rf .git .github ๋กœ ์›๋ž˜ git์„ ์ง€์›Œ์ฃผ๊ณ 
git init ์œผ๋กœ ๋‹ค์‹œ ์„ค์ •ํ•œ๋‹ค.

โžฐ ๋งŒ๋“ค์—ˆ๋˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๊ธฐ

git remote add origin ์—ฌ๊ธฐ์—์ƒ์„ฑํ•œ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜SSH๋„ฃ๊ธฐ ํ•˜๊ณ  ์—”ํ„ฐ

โžฐ github page์— ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๋Š” gh-pages package ์‚ฌ์šฉํ•˜๊ธฐ

CLI ์—์„œ npm i -D gh-pages ํ•˜๊ณ ,

package.json ์— ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
์šฐ์„  "script" ๊ฐ์ฒด ์•ˆ์— "deploy": "gh-pages -d dist", ์ถ”๊ฐ€ํ•˜๊ณ ,
"homepage" ๋’ค์— ์žˆ๋Š” ๊ฐ’์„ ์•„๋ž˜ ์ฒ˜๋Ÿผ ๋‚ด github์ด๋ฆ„๊ณผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
"https://๊นƒํ—™์•„์ด๋””.github.io/์ƒ์„ฑํ–ˆ๋˜๋ ˆํฌ์ง€ํ† ๋ฆฌ์ด๋ฆ„",
์˜ˆ์‹œ: "https://moonozz.github.io/webpack-ad-practice",

์ „๋ถ€ ๋‹ค ํ•˜๊ณ  npm run build ๋ฅผ ํ•œ ํ›„์—

CLI ์— npm run deploy ํ•˜๋ฉด
์›๋ž˜ branch ์—์„œ gh-pages ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์ค„ ํ•„์š” ์—†์ด
gh-pages package ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋™์œผ๋กœ github page ์— ๋ฐฐํฌํ•œ๋‹ค.

๐Ÿง ์‹œํ–‰์ฐฉ์˜ค-03

webpack.common.js ์— plugins ์˜ template ์„ ์ž˜๋ชป ์ ์—ˆ๋‹ค.
๋‚˜๋Š” index.html์ด src์— ์žˆ์œผ๋‹ˆ๊นŒ
template: path.resolve(__dirname, "./src/index.html"), ์ด๋ ‡๊ฒŒ ์ ์–ด์•ผ ํ•จ!

๋งŒ์•ฝ ๊ฐ™์€ root ์— ์žˆ๋‹ค๋ฉด template: "./index.html", ์ด๋ ‡๊ฒŒ ์ ์œผ๋ฉด ๋œ๋‹ค.

๐Ÿง ์‹œํ–‰์ฐฉ์˜ค-04

๋ฐฐํฌ์—์„œ 404์—๋Ÿฌ๊ฐ€ ๋– ์„œ ๋ฌผ์–ด๋ดค๋Š”๋ฐ..
package.json ์— homepage ์—์„œ url ๋งํฌ๋ฅผ ์ œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๋‹ค..ใ…Ž
์ž‘์€ ์‹ค์ˆ˜ ์กฐ์‹ฌํ•˜์ž!!!


์ถœ์ฒ˜ : ๋ฐ•๊ธฐ์ • ์งฑ๐Ÿ‘

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