React Core 구현하기 - 1. JSX 컴파일

2025. 2. 14. 17:32·React

* 본 프로젝트는 Vite + VanilaJS로 생성되었으며, TypeScript를 사용합니다.

* 분량조절을 위해 타이핑 관련 코드작성은 생략합니다.


사용된 패키지

@babel/core: Babel이 동작하기 위한 엔진

@babel/cli: Babel을 커맨드라인에서 사용할 수 있게함

@babel/plugin-transform-react-jsx: JSX를 JavaScript로 변환
@babel/preset-typescript: TypeScript를 JavaScript로 변환

 

JSX는 JavaScript의 확장 문법으로, HTML과 비슷한 구조를 사용해 웹 화면을 쉽게 구성할 수 있게 해줍니다.

그러나 JSX는 브라우저가 직접 이해할 수 없는 문법이므로, JavaScript로 변환하는 과정(트랜스파일)이 필요합니다. 

 

JSX 컴파일 환경 구축하기

JSX를 트랜스파일하기 위해서는 몇가지 설정이 선행되어야 합니다.

 

1. Babel

// babel.config.json
{
  "presets": ["@babel/preset-typescript"],
  "plugins": [
    [
      "@babel/plugin-transform-react-jsx",
      {
        "runtime": "automatic",  // React 17+의 자동 런타임 방식 적용
        "importSource": "@/utils/core"  // 커스텀 JSX 처리 함수 위치 지정
      }
    ]
  ]
}
  • runtime: "automatic" 
    "automatic" 옵션은 React 17 이후의 컴파일 방식을 사용함을 뜻합니다.
    기존의 React.createElement 대신 jsx/jsxs 함수를 사용해 JSX를 변환합니다.
    이 방식은 import React from 'react'를 명시적으로 작성할 필요가 없어 코드가 더 간결해집니다.
  • importSource: "@/utils/core" 
    JSX를 처리할 커스텀 함수의 위치를 지정합니다. 
    이 프로젝트에서는 JSX 트랜스파일 로직을 @/utils/core 폴더에 구현했기 때문에, 이 경로를 지정했습니다.
    Babel은 이 경로에서 JSX 처리 함수를 가져와 변환 작업을 수행합니다.

2. Vite

// vite.config.ts
export default defineConfig({
  esbuild: {
  // babel과 동일한 설정 적용
    jsx: 'automatic',
    jsxImportSource: '@/utils/core',
  },
})
  • 개발환경에서 트랜스파일된 JSX 코드를 사용할 수 있게 합니다.
    Babel과 동일한 트랜스파일 결과물을 생성해야 하기 때문에, 바벨과 동일하게 설정합니다.

Typescript (optional)

// tsconfig.json
{
  "compilerOptions": {
    "jsx": "preserve",  // JSX 변환을 수행하지 않고 원본 구조 유지
  }
}
  • jsx: "preserve"
    TypeScript도 트랜스파일을 진행하지만, Babel과 Vite가 JSX의 트랜스파일을 담당하기 때문에 여기서는 코드 원본을 유지하는 설정을 합니다.

Babel CLI를 통한 트랜스파일 결과 확인

JSX 코드를 작성해보고 바벨 트랜스파일 결과를 확인할 수 있습니다.

트랜스파일을 CLI로 실행하기 위해 @babel/cli 패키지를 설치했고,

package.json의 scripts에 트랜스파일 cli를 설정하여 결과물을 확인합니다.

"babel-build": "babel src --out-dir dist/babel --extensions \".tsx,.ts\""

// components/child.tsx: 트랜스파일 할 함수 컴포넌트 작성
export default function Child() {
  return (
    <div>
      <h1>Child</h1>
    </div>
  );
}

// 트랜스파일 cli 실행
$ npm run babel-build

// dist/babel/components/child.js: 트랜스파일 결과
import { jsx as _jsx } from "@/utils/core/jsx-runtime";
export default function Child() {
  return _jsx("div", {
    children: _jsx("h1", {
      children: "Child"
    })
  });
}

트랜스파일된 코드를 보면 jsx라는 함수를 import하여 사용하는 것을 확인할 수 있습니다.

이는 Babel에서 지정한 jsx 런타임 로직이며, 다음 글에서는 이 런타임 로직에 대해 다뤄보겠습니다.

 

저작자표시 비영리 변경금지 (새창열림)

'React' 카테고리의 다른 글

Zustand 셀렉터... 사용하고 계시죠? (리렌더 폭탄 방지하기)  (0) 2025.06.20
React Core 구현하기 - 2. JSX 런타임 로직  (0) 2025.02.18
React18 useEffectEvent  (0) 2024.12.30
React useLayoutEffect  (2) 2024.12.27
React forwardRef와 useImperativeHandle  (0) 2024.12.27
'React' 카테고리의 다른 글
  • Zustand 셀렉터... 사용하고 계시죠? (리렌더 폭탄 방지하기)
  • React Core 구현하기 - 2. JSX 런타임 로직
  • React18 useEffectEvent
  • React useLayoutEffect
URE
URE
Skill: Javascript, ReactJS, Next.js, React Native ... *블로그 이전 작업(24. 04. 11 ~ 24. 04. 15)
  • URE
    Dev++
    URE
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Browser (6)
      • OS (1)
      • Javascript (14)
      • React (19)
      • Next.js (4)
      • React Native (0)
      • Architecture (1)
      • Network (3)
      • 스크랩 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    원시타입
    IP
    상태관리라이브러리
    URL
    dataFetching
    react concurrent
    리액트
    Redux
    javascript
    TCP
    swr
    자바스크립트
    react
    참조타입
    브라우저
    리덕스
    react18
    리액트 코어
    Port
    JS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
URE
React Core 구현하기 - 1. JSX 컴파일
상단으로

티스토리툴바