왓에버

React 직접 만들어보기: JSX 이해 및 개발 환경 구축

choijming21 2025. 1. 27. 16:06

1. 초기 개발 환경 구축

 

vite 프로젝트 생성

  • 먼저 Vanilla Javascript 기반의 Vite 프로젝트를 생성합니다.
  • Vite를 사용한 이유: Vite는 매우 빠른 개발 서버와 빌드 도구를 제공합니다.
# Vite 프로젝트 생성
npm create vite@latest whatever-project --template vanilla

# 프로젝트 폴더로 이동
cd whatever-project

# 의존성 패키지 설치
npm install

 

 

Babel 설치 및 설정

  • JSX를 JavaScript로 변환하기 위한 Babel 패키지를 설치합니다.
# Babel 관련 패키지 설치
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/plugin-transform-react-jsx

 

 

 

 

 

2. 설정 파일 작성

Babel 설정 (babel.config.json)

  • 프로젝트 루트에 babel.config.json 파일을 생성:
{
  "presets": ["@babel/preset-env"],
  "plugins": [
    ["@babel/plugin-transform-react-jsx", {
      "pragma": "createElement",
      "pragmaFrag": "Fragment"
    }]
  ]
}

 

이 설정은:

  • @babel/preset-env: 최신 JavaScript를 브라우저가 이해할 수 있는 코드로 변환
  • @babel/plugin-transform-react-jsx: JSX를 JavaScript로 변환
  • pragma: "createElement": JSX를 변환할 때 사용할 함수 이름을 지정

 

Vite 설정 (vite.config.js)

  • 프로젝트 루트에 vite.config.js 파일을 생성:
import { defineConfig } from "vite";

export default defineConfig({
  esbuild: {
    jsxFactory: "createElement",
    jsxFragment: "Fragment",
  },
});

 

  • 이 설정은 Vite에게 JSX를 JavaScript로 변환할 때 createElement 함수를 사용하라고 지시합니다.

 

 

HTML 파일 수정(index.html)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>My React from Scratch</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.jsx"></script> // src 수정
  </body>
</html>

 

 

 

 

 

3. JSX 테스트 코드 작성

src/main.jsx 파일 생성

/** @jsx createElement */
function createElement(type, props, ...children) {
  return {
    type,     // HTML 태그 이름 ('div', 'h1' 등)
    props,    // 속성들 객체 (className, id 등)
    children, // 자식 요소들의 배열
  };
}

const element = (
  <div className="container">
    <h1 id="title">Hello World</h1>
    <p id="content">This is a paragraph</p>
  </div>
);

console.log(element);

 

 

 

 

 

4. 프로젝트 구조

my-react/
├── index.html          # 메인 HTML 파일
├── package.json        # 프로젝트 설정 파일
├── babel.config.json   # Babel 설정
├── vite.config.js      # Vite 설정
└── src/
    └── main.jsx       # 메인 JSX 파일

 

 

 

 

5. 실행 방법

# 개발 서버 실행
npm run dev

 

 

 

 

 

6. JSX 변환 과정 이해

  •  jsx 코드 작성:
<div className="container">
  <h1>Hello World</h1>
</div>

 

 

  • Babel이 변환한 JavaScript 코드:
createElement(
  "div",
  { className: "container" },
  createElement("h1", null, "Hello World")
);

 

 

  • createElement 함수가 생성하는 객체 구조(console에서 확인):
{
  type: "div",
  props: { className: "container" },
  children: [
    {
      type: "h1",
      props: null,
      children: ["Hello World"]
    }
  ]
}

 

 

이렇게 생성된 객체 구조는 Virtual DOM의 기초가 되며, 이후에 실제 DOM 요소로 변환 되어 브라우저에 렌더링됩니다.

 

이 모든 과정은:

  1. JSX 작성 →
  2. Babel이 JSX를 createElement 호출로 변환 →
  3. createElement가 Virtual DOM 객체 생성 →
  4. (나중에 구현할) render 함수가 실제 DOM으로 변환

의 순서로 진행됩니다.