2022. 5. 19
© WONKOOK LEE
TypeScript가 JSX를 변환하는 방법과 JSX Transform에 대해
TypeScript 4.1 이상부터는 JSX 코드를 트랜스파일링하기 위한 다양한 옵션을 제공합니다. 이러한 옵션은 React의 다양한 환경(예: React 16, React 17+, React Native)에 맞춰 JSX를 효율적으로 처리하는 데 사용됩니다. 이번 글에서는 TypeScript가 JSX를 처리하는 방식과 React 17에서 도입된 새로운 JSX Transform의 이점을 설명합니다.
- preserve
- react
- react-jsx
- react-jsxdev
- react-native
이 옵션들은 tsconfig.json 파일의 compilerOptions에 설정하는 jsx 속성에서 사용할 수 있습니다. 설정에 따라 TypeScript가 JSX 코드를 변환하거나 유지하는 방식이 달라집니다.
아래는 옵션별 TypeScript 스펙 추가 시점과 간략한 설명입니다.
옵션 | 추가 시점 | 설명 |
---|---|---|
preserve | 초기부터 존재 | JSX를 변환하지 않고 그대로 유지. |
react | 초기부터 존재 | JSX를 React.createElement 로 변환. |
react-jsx | TypeScript 4.1 | React 17+의 새로운 JSX Transform을 사용하여 jsx 함수 호출로 변환. |
react-jsxdev | TypeScript 4.1 | 개발 환경에서 디버깅 정보를 추가한 JSX Transform을 사용. |
react-native | TypeScript 4.0 | React Native 프로젝트에서 사용. |
preserve
- JSX를 변환하지 않고 그대로 유지합니다.
- 출력 파일에 JSX가 그대로 남아있습니다.
- 보통 Babel 등 다른 도구에서 JSX를 처리하도록 위임하는 경우 사용합니다.
// 입력
const element = <div>안녕하세요?</div>;
// 출력
const element = <div>안녕하세요?</div>;
Next.js에서 tsconfig.json의 ‘jsx’ 옵션을 ‘preserve’로 설정하지 않으면 자동으로 ‘preserve’로 바꿔줍니다. 그 이유는 Next.js에서 자체 구현한 JSX transform을 제공하기 때문입니다.
react
- JSX를 React의 React.createElement 호출로 변환합니다.
- React 16 이하 또는 React.createElement가 필요한 환경에서 사용됩니다.
- 이 방식을 사용할 경우 React를 반드시 import 해야합니다.
// 입력
import React from "react";
const element = <div>안녕하세요?</div>;
// 출력
import React from "react";
const element = React.createElement("div", null, "안녕하세요?");
react-jsx
- TypeScript 4.1 이상에서 지원하는 설정으로, React17 이상에서 사용됩니다.
- React의 새로운 JSX 변환 방식(React 17의 JSX Transform)을 사용합니다.
- React.createElement를 사용하지 않으며, React를 import하지 않아도 됩니다.
// 입력
const element = <div>안녕하세요?</div>;
// 출력
import { jsx as _jsx } from "react/jsx-runtime";
const element = _jsx("div", { children: "안녕하세요?" });
react-jsxdev
React 17+의 새로운 JSX Transform을 사용하면서 디버깅 정보를 추가하기 위해 사용합니다.
- 디버깅 목적으로 개발 환경(Development Mode)에서 사용합니다.
- 생성된 JSX 코드에 디버깅에 유용한 정보(예: 파일 이름, 라인 번호 등)를 포함합니다.
// 입력
const element = <div>Hello, world!</div>;
// 출력
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
const element = _jsxDEV(
"div",
{ children: "Hello, world!" },
undefined,
false,
{
fileName: "src/App.js",
lineNumber: 2,
columnNumber: 17,
},
this
);
react-native
React Native 프로젝트에서 JSX를 처리하기 위한 옵션입니다.
- React Native 환경에서는 브라우저 DOM 대신 Native Components를 사용하므로 JSX 변환 방식이 다릅니다.
- TypeScript는 JSX를 변환하지 않고 그대로 유지하며, React Native의 Babel 설정에서 변환을 처리합니다.
JSX를 변환하는 방법이 React.createElement에서 JSX Transform으로 변경된 이유
요약
- React Import 필요성을 제거하여 개발자 경험(DX)을 개선.
- 런타임 성능 최적화를 통해 더 빠른 실행과 적은 오버헤드를 제공.
- 향후 React 기능 확장을 지원하는