IT/Front-End

[React] Webpack 마는 법

KimCookieYa 2023. 9. 18. 01:23

React webpack 마는 법

배경

인프런 - 웹 게임을 만들며 배우는 React 강의의 섹션 1에서 webpack과 babel을 직접 설치해서 세팅하는 방법을 알려준다. CRA나 Vite를 쓰지 않고 직접 세팅하면서 webpack과 babel의 동작 방식을 공부할 수 있었다. 언제든지 볼 수 있도록, npm init부터 HMR(Hot Module Reloading) 세팅까지의 과정을 기록하고자 한다.

 

초기 세팅

  1. npm init
  2. npm i react react-dom

 

webpack 및 babel 세팅

  1. npm i -D webpack webpack-cli
  2. npm i -D @babel/core @babel/preset-env @babel/preset-react babel-loader
// webpack.config.js
const path = require("path");

module.exports = {
  name: "wordrelay-setting",
  mode: "development",
  devtool: "eval",
  resolve: {
    extensions: [".js", ".jsx"],
  },
  entry: {
    app: ["./client"],
  }, // 입력
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        loader: "babel-loader",
        options: {
          presets: [
            [
              "@babel/preset-env",
              {
                targets: {
                  browsers: ["last 2 chrome versions"],
                },
              },
            ],
            "@babel/preset-react",
          ],
        },
      },
    ],
  }, // babel 설정
  output: {
    path: path.join(__dirname, "dist"),
    filename: "app.js",
    publicPath: "/dist/",
  }, // 출력
};
// client.jsx
import React from "react";
import ReactDOM from "react-dom/client";
import WordRelay from "./WordRelay.jsx";

ReactDOM.createRoot(document.getElementById("root")).render(<WordRelay />);
// index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>끝말잇기</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="./dist/app.js"></script>
  </body>
</html>
// WordRelay.jsx
import React from "react";

export default function WordRelay() {
  return <div>WordRelay</div>;
}
  1. package.json의 "scripts"에 "dev": "webpack" 추가
// package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "webpack"
  },
  "author": "KimCookieYa",
  "license": "MIT",
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@babel/core": "^7.22.20",
    "@babel/preset-env": "^7.22.20",
    "@babel/preset-react": "^7.22.15",
    "babel-loader": "^9.1.3",
    "webpack": "^5.88.2",
    "webpack-cli": "^5.1.4"
  }
}
  1. npm run dev 또는 npx webpack 입력하면 app.js 빌드 완료.

 

Fast Refresh(HMR) 세팅

  1. npm i -D @pmmmwh/react-refresh-webpack-plugin react-refresh
  2. npm i -D webpack-dev-server
// webpack.config.js
const path = require("path");
const RefreshWebpackPlugin = require("@pmmmwh/react-refresh-webpack-plugin");

module.exports = {
  name: "wordrelay-setting",
  mode: "development",
  devtool: "eval",
  resolve: {
    extensions: [".js", ".jsx"],
  },
  entry: {
    app: ["./client"],
  }, // 입력
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        loader: "babel-loader",
        options: {
          presets: [
            [
              "@babel/preset-env",
              {
                targets: {
                  browsers: ["last 2 chrome versions"],
                },
              },
            ],
            "@babel/preset-react",
          ],
          plugins: [require.resolve("react-refresh/babel")].filter(Boolean),
        },
      },
    ],
  }, // babel 설정
  plugins: [new RefreshWebpackPlugin()].filter(Boolean),
  output: {
    path: path.join(__dirname, "dist"),
    filename: "app.js",
    publicPath: "/dist/",
  }, // 출력
  devServer: {
    devMiddleware: { publicPath: "/dist/" },
    static: { directory: path.resolve(__dirname) },
    hot: true,
  }, // fast refresh(HMR)
};

 

출처