๐Ÿ›  ํ”„๋กœ์ ํŠธ

[ToyProject] ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ : Webpack๊ณผ babel ์„ค์น˜- #2

najiwon 2024. 5. 17. 00:32

 

[๊ฐœ๋ฐœํ™˜๊ฒฝ]
npm: 10.5.0
Node.js: 18.20.2

 

00. ๊ฐœ์š”

Create React App(CRA)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์ž‘์—…์ด๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค๋Š” ์ ์ด ์‹ ๊ฒฝ์“ฐ์˜€๊ณ , ๋ฌด์—‡๋ณด๋‹ค ์ง์ ‘ ์›นํŒฉ์„ ์„ค์ •ํ•ด์„œ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด ๋ณด๊ณ ์‹ถ์—ˆ๋‹ค.

 

01. ์›นํŒฉ(Webpack)์ด๋ž€?

์›นํŒฉ์€ JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ •์  ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ด๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋งคํ•‘ํ•˜๊ณ  ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. 

 

02. package.json ์ƒ์„ฑ

npm init ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ package.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

$ npm init

 

์ด ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๋˜ํ•œ, ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด์— dist, public, src ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ตฌ์กฐ๋ฅผ ๋งˆ๋ จํ•œ๋‹ค.

$ mkdir dist public src

 

public ํด๋” ์•„๋ž˜์— index.html ๋งŒ๋“ค์–ด์ค€๋‹ค. 

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>React</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="main.bundle.js"></script>
  </body>
</html>

 

03. React ์„ค์น˜

npm install react react-dom ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด React์™€ ReactDOM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค. 

$ npm install react react-dom
  1. React:
    • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • React๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•˜๋ฉฐ, ์„ ์–ธ์ ์ธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ UI ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 
    • React๋Š” ๊ฐ€์ƒ DOM(Virtual DOM)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•œ๋‹ค. 
  2. ReactDOM:
    • React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ธŒ๋ผ์šฐ์ € ์ƒ์— ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๋ฅผ ์‹ค์ œ DOM์— ์ ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œํ•œ๋‹ค. 
    • ReactDOM์€ React Native์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ๋ Œ๋”๋ง ์—”์ง„์„ ์ œ๊ณตํ•œ๋‹ค. 

 

04. babel ์„ค์น˜ ๋ฐ ์„ค์ •

Babel์€ ์ตœ์‹  JavaScript ์ฝ”๋“œ๋ฅผ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” JavaScript ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ์ตœ์‹  JavaScript ๋ฌธ๋ฒ•๊ณผ JSX ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•œ๋‹ค. 

$ npm install @babel/core @babel/preset-env @babel/preset-react babel-loader
  1. @babel/core:
    • Babel์˜ ํ•ต์‹ฌ ์—”์ง„์ด๋‹ค. ์ด ์—”์ง„์€ JavaScript ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
    • Babel์€ ์ตœ์‹  JavaScript ๋ฌธ๋ฒ•์„ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, JSX์™€ ๊ฐ™์€ ํ™•์žฅ ๋ฌธ๋ฒ•์„ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  2. @babel/preset-env:
    • Babel์˜ ํ”„๋ฆฌ์…‹(preset) ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
    • ์ด ํ”„๋ฆฌ์…‹์€ ํ˜„์žฌ ํ™˜๊ฒฝ์—์„œ ์ง€์›๋˜๋Š” ์ตœ์‹  JavaScript ๋ฌธ๋ฒ•๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์˜ ์ง€์› ๋ฒ”์œ„์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. @babel/preset-react:
    • React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JSX ๋ฌธ๋ฒ•์„ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • JSX๋Š” React์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ, JavaScript์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. ์ด๋ฅผ ์ผ๋ฐ˜์ ์ธ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  4. babel-loader:
    • ์›นํŒฉ(Webpack)์—์„œ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ JavaScript ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ๋กœ๋”์ด๋‹ค.
    • ์›นํŒฉ์˜ ๋กœ๋” ์ค‘ ํ•˜๋‚˜๋กœ, JavaScript ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋™์•ˆ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ES6+ ๋ฌธ๋ฒ•์ด๋‚˜ JSX๋ฅผ ์ด์ „ ๋ฒ„์ „์˜ JavaScript๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

babel.config.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ Babel์˜ ์„ค์ •์„ ์ •์˜ํ•œ๋‹ค. 

// babel.config.js
module.exports = {
    presets: [
      "@babel/preset-env",
      [
        "@babel/preset-react",
        {
          runtime: "automatic",
        },
      ],
    ],
  };

 

05. webpack ์„ค์น˜ ๋ฐ ์„ค์ •

์›นํŒฉ์„ ์„ค์น˜ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋Š” ์„ค์ •์„ ์ง„ํ–‰ํ•œ๋‹ค. 

$ npm install webpack webpack-cli webpack-dev-server
  1. webpack:
    • ์›นํŒฉ(Webpack)์€ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋กœ, ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๊ณผ ๋ฆฌ์†Œ์Šค๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค.
    • JavaScript, CSS, ์ด๋ฏธ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋“ˆ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. webpack-cli:
    • ์›นํŒฉ์„ ๋ช…๋ น์ค„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค(Command Line Interface)์ด๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ํ„ฐ๋ฏธ๋„์—์„œ ์›นํŒฉ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. webpack-dev-server:
    • ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณตํ•œ๋‹ค.
    • ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋น ๋ฅธ ๋ฐ˜๋ณต ๋ฐ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

webpack.config.js ์›นํŒฉ ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ฒˆ๋“ค๋ง ๋™์ž‘์„ ๊ตฌ์„ฑํ•œ๋‹ค. ๋กœ๋”(loader)์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin)์„ ์„ค์ •ํ•˜์—ฌ ์›นํŒฉ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

// webpack.config.js

const path = require("path");
 
module.exports = {
  mode: "development",
  entry: {
    main: "./src/main.js", // ๋ฒˆ๋“ค๋ง ์‹œ์ž‘ ํŒŒ์ผ ์„ค์ •
  },
  /* ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ๋ช…๊ณผ ๊ฒฝ๋กœ ์„ค์ • */
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "[name].bundle.js",
    clean: true, // ๋นŒ๋“œ ์ „ output ํด๋”์˜ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ํŒŒ์ผ๋“ค์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ
  },
  resolve: {
    extensions: [".js", ".jsx"],
  },
  devtool: "source-map",
  devServer: {
    static: path.resolve(__dirname, "public"),
    hot: true, // ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •์‚ฌํ•ญ ๋ฐ˜์˜
    open: true, // ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์‹คํ–‰
    port: 3000 // process.env.PORT,
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
        },
      },
    ],
  },
};
  1. mode:
    • ํ˜„์žฌ ๊ฐœ๋ฐœ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค. "development"๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์šฉ ์„ค์ •์ด ์ ์šฉ๋œ๋‹ค. ๋นŒ๋“œ๋œ ํŒŒ์ผ์ด ์••์ถ•๋˜์ง€ ์•Š๊ณ , ์ถ”๊ฐ€์ ์ธ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ๋‹ค.
  2. entry:
    • ๋ฒˆ๋“ค๋ง์˜ ์‹œ์ž‘์ (entry point)์„ ์„ค์ •ํ•œ๋‹ค. "./src/main.js" ํŒŒ์ผ์„ ์‹œ์ž‘์œผ๋กœ ๋ชจ๋“  ์˜์กด ๋ชจ๋“ˆ์„ ์ฐพ์•„ ๋ฒˆ๋“ค๋งํ•œ๋‹ค.
  3. output:
    • ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŒŒ์ผ๋ช…๊ณผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    • path ์†์„ฑ์€ ๋ฒˆ๋“ค๋œ ํŒŒ์ผ์˜ ์ถœ๋ ฅ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • filename ์†์„ฑ์€ ์ถœ๋ ฅ๋˜๋Š” ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. [name]์€ entry์—์„œ ์„ค์ •ํ•œ ํ‚ค ์ด๋ฆ„(main)์œผ๋กœ ๋Œ€์ฒด๋œ๋‹ค.
    • clean ์†์„ฑ์€ ๋นŒ๋“œ ์ „ output ํด๋”์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•œ๋‹ค.
  4. resolve:
    • ๋ชจ๋“ˆ์„ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค.
    • extensions ์†์„ฑ์€ ๋ชจ๋“ˆ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” .js์™€ .jsx ํŒŒ์ผ์„ ํ•ด์„ํ•œ๋‹ค.
  5. devtool:
    • ์†Œ์Šค ๋งต(Source Map)์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค. "source-map"์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์†Œ์Šค ๋งต ํŒŒ์ผ์ด ๋ณ„๋„๋กœ ์ƒ์„ฑ๋œ๋‹ค. 
  6. devServer:
    • ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์„ค์ •์„ ์ •์˜ํ•œ๋‹ค.
    • static ์†์„ฑ์€ ์ •์  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • hot ์†์„ฑ์€ HMR(Hot Module Replacement) ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋œ๋‹ค.
    • open ์†์„ฑ์€ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ฐ๋‹ค.
    • port ์†์„ฑ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  7. module/rules:
    • ๋ชจ๋“ˆ์„ ํ•ด์„ํ•  ๋•Œ ์ ์šฉํ•  ๊ทœ์น™์„ ์„ค์ •ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ๋Š” .js์™€ .jsx ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์— ๋Œ€ํ•ด Babel ๋กœ๋”๋ฅผ ์ ์šฉํ•˜์—ฌ ES6+ ๋ฌธ๋ฒ•๊ณผ JSX ๋ฌธ๋ฒ•์„ ๋ณ€ํ™˜ํ•œ๋‹ค.

 

React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž. src ํด๋” ์•„๋ž˜์— main.js์™€ App.jsx ์ž‘์„ฑํ•œ๋‹ค. 

// /src/main.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
 
const root = ReactDOM.createRoot(document.getElementById("root"));
 
root.render(<App />);
// /src/App.jsx
const App = () => <>Hello React</>;
 
export default App;

 

package.json ํŒŒ์ผ์—์„œ script ๋ถ€๋ถ„์— start๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

{
  "name": "react_toy_project",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack serve --config webpack.config.js"
  },
  "author": "Jiwon Hyeon",
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.24.5",
    "@babel/preset-env": "^7.24.5",
    "@babel/preset-react": "^7.24.1",
    "babel-loader": "^9.1.3",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "webpack": "^5.91.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.0.4"
  }
}

์ด ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ์ •์˜ํ•œ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •์„ ๊ด€๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. name: ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„. npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  2. version: ํ”„๋กœ์ ํŠธ์˜ ํ˜„์žฌ ๋ฒ„์ „. ๋ฒ„์ „์€ Semantic Versioning(SemVer) ๊ทœ์น™์— ๋”ฐ๋ผ ์ง€์ •๋œ๋‹ค. 
  3. description: ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ๋‚ธ๋‹ค. ์ด ์†์„ฑ์€ ์„ ํƒ์ ์ด๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ๋ชฉ์ ์ด๋‚˜ ํŠน์ง•์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. scripts: ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค. "test"์™€ "start" ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
    • "test": ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ •์˜. ํ…Œ์ŠคํŠธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • "start": ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ •์˜. webpack serve ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. author: ํ”„๋กœ์ ํŠธ์˜ ์ €์ž‘์ž ๋˜๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  6. license: ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด์„ ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
  7. dependencies: ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๋“ค์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ฐ ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. 

 

06. ์‹คํ–‰

npm start ๋ช…๋ น์–ด๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

$ npm start

 

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 


 

์ „์ฒด ์ฝ”๋“œ

github Repository - 2024.05.10. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ• - webpack ์„ค์ •

 

2024.05.10. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ• - webpack ์„ค์ • · Hyeonjiwon/React_Toy_Project@51d9aa0

Hyeonjiwon committed May 10, 2024

github.com