Vintage appMaker의 Tech Blog

[크롬확장] HTML을 React로 변환 본문

Source code or Tip/Others

[크롬확장] HTML을 React로 변환

VintageappMaker 2024. 11. 10. 16:46

 

> 크롬브라우저에서 요소를 클릭하면  React 컴포넌트로 정리하고 싶을 때가 있다. 그럴 때 유용하게 사용할 수 있는 확장프로그램은 아래와 같다. 

 

https://chromewebstore.google.com/detail/html-to-react/glefoejbpalgpdgfbbmemfgegepiamnd

 

HTML to React - Chrome 웹 스토어

The fastest and smartest way to analyze HTML elements and generate full React component representations.

chromewebstore.google.com

 

위의 확장 프로그램을 설치 후, 실행을 하면 위의 상단의 버튼 4개가 보인다. 이곳에서

 

1. 실행[>] 을 선택

2. 화면의 HTML 요소를 클릭한다.

3. 약간의 시간이 흐른 후, React Component 소스가 클립보드로 복사

 

 

이런 과정을 거친 후, React component로 바로 사용가능하다. 그러나 React에 익숙하지 않은 개발자라면 생성 AI를 통해 다음과 같은 프롬프트를 진행하는 것도 매크로 기능처럼 활용할 수 있어 추천한다. 

 

1. 생성된 소스를 복사

2. 생성AI(claude ai 또는 ChatGPT, Gemini)에 붙여넣기 후, 소스 분석해줘

3. css와 자바스크립트를 분리해줘

4. 빌드할 수 있도록 순서대로 설명해줘

 

와 같은 내용으로 진행하면 다음과 같은 결과물을 얻을 수 있다. 

 

----

 

You:

import React from "react";

export default function Component() {
  return (
    <>
      <div
        className="k1zIA rSk4se"
        style={{
          height: "100%",
          marginTop: "auto",
          maxHeight: "92px",
          position: "relative",
        }}
      >
        <img
          className="lnXdpd"
          height={92}
          width={272}
          alt="Google"
          src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
          srcSet="/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png 1x, /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 2x"
          style={{
            maxHeight: "100%",
            maxWidth: "100%",
            objectFit: "contain",
            objectPosition: "center bottom",
            width: "auto",
          }}
        />
      </div>
      <style
        dangerouslySetInnerHTML={{
          __html: `
html {
  min-width: 400px;
  margin: 0px;
  padding: 0px;
  height: 100%;
}

body {
  background: rgb(255, 255, 255);
  font-size: 14px;
  font-family: Arial, "Apple SD Gothic Neo", sans-serif;
  color: #1f1f1f;
  min-width: 400px;
  margin: 0px;
  padding: 0px;
  height: 100%;
}
`,
        }}
      />
    </>
  );
}

 

위의 소스를 설명해줘


ChatGPT:

주어진 React 컴포넌트는 주로 Google 로고를 표시하는 간단한 UI 요소입니다. 각 부분을 자세히 설명해 드릴게요.

1. <Component> 컴포넌트 구조

export default function Component() {
  return (
    <>
      <div className="k1zIA rSk4se" style={...}>
        <img className="lnXdpd" alt="Google" src="..." srcSet="..." style={...} />
      </div>
      <style dangerouslySetInnerHTML={{ __html: `...` }} />
    </>
  );
}
  • React 컴포넌트로, 익명 함수 형태로 정의되었습니다.
  • 이 컴포넌트는 JSX를 사용하여 HTML 요소와 스타일을 포함합니다.

2. <div> 요소

<div
  className="k1zIA rSk4se"
  style={{
    height: "100%",
    marginTop: "auto",
    maxHeight: "92px",
    position: "relative",
  }}
>
  • div 요소는 Google 로고 이미지를 감싸는 컨테이너입니다.
  • CSS 스타일:
    • height: "100%": 부모 요소의 전체 높이를 차지합니다.
    • marginTop: "auto": 아래쪽에 정렬되도록 합니다.
    • maxHeight: "92px": 최대 높이를 92px로 제한합니다.
    • position: "relative": 내부 요소(img)의 위치를 조절할 수 있도록 합니다.

3. <img> 요소

<img
  className="lnXdpd"
  height={92}
  width={272}
  alt="Google"
  src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
  srcSet="/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png 1x, /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 2x"
  style={{
    maxHeight: "100%",
    maxWidth: "100%",
    objectFit: "contain",
    objectPosition: "center bottom",
    width: "auto",
  }}
/>
  • Google 로고를 표시하는 이미지입니다.
  • 속성 설명:
    • height & width: 기본 이미지 크기(92px 높이와 272px 너비).
    • alt: 대체 텍스트 "Google".
    • src: 이미지 URL.
    • srcSet: 다양한 해상도에 맞는 이미지 제공.
      • 1x, 2x 해상도를 지원하여 고해상도 디스플레이에서 더 선명한 이미지를 표시합니다.
    • CSS 스타일:
      • maxHeight & maxWidth: 컨테이너 크기에 맞게 조절.
      • objectFit: "contain": 이미지 비율을 유지하면서 컨테이너에 맞추어 조정.
      • objectPosition: "center bottom": 이미지의 하단이 컨테이너의 중심에 맞춰지도록 조정.

4. <style> 요소 (내부 스타일)

<style
  dangerouslySetInnerHTML={{
    __html: `
html {
  min-width: 400px;
  margin: 0px;
  padding: 0px;
  height: 100%;
}

body {
  background: rgb(255, 255, 255);
  font-size: 14px;
  font-family: Arial, "Apple SD Gothic Neo", sans-serif;
  color: #1f1f1f;
  min-width: 400px;
  margin: 0px;
  padding: 0px;
  height: 100%;
}
`,
  }}
/>
  • 전체 페이지 스타일을 설정합니다.
    • html, body 요소에 대해 최소 너비(min-width: 400px), 여백, 패딩 등을 초기화합니다.
    • 배경색(background)은 흰색, 기본 글꼴은 ArialApple SD Gothic Neo 등으로 설정됩니다.
  • dangerouslySetInnerHTML 속성은 HTML을 직접 삽입할 수 있게 해주는데, 이는 보안 위험이 있을 수 있으므로 신중하게 사용해야 합니다.

요약

이 컴포넌트는 Google 로고를 중앙에 배치한 심플한 페이지를 구현합니다. 페이지의 스타일은 직접 삽입된 <style> 요소를 통해 기본적으로 설정되었고, divimg 태그를 사용해 로고가 컨테이너에 잘 맞게 조절되도록 되어 있습니다.

주로 Google 관련 페이지 또는 로고 표시 용도로 사용될 수 있는 심플한 컴포넌트입니다.


You:

위의 소스를 css 로 분리해서 깔끔하게 정리해줘


ChatGPT:

주어진 소스에서 인라인 스타일dangerouslySetInnerHTML로 삽입된 스타일을 CSS 파일로 분리하고, JSX 코드도 개선하여 가독성을 높이도록 리팩토링해 보겠습니다.

리팩토링 목표

  1. CSS 파일로 스타일을 분리하여 코드 가독성을 높임.
  2. 클래스 이름을 의미 있게 변경하여 유지 보수성을 개선.
  3. JSX 코드는 더 간결하게 작성.

디렉토리 구조 제안

src/
├── components/
│   └── GoogleLogo.js
└── styles/
    └── GoogleLogo.css

1. GoogleLogo.js (React 컴포넌트)

import React from "react";
import "./../styles/GoogleLogo.css";

export default function GoogleLogo() {
  return (
    <div className="logo-container">
      <img
        className="google-logo"
        alt="Google"
        src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
        srcSet="/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png 1x, /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 2x"
      />
    </div>
  );
}

2. GoogleLogo.css (CSS 파일)

/* 전체 페이지 스타일 */
html,
body {
  min-width: 400px;
  height: 100%;
  margin: 0;
  padding: 0;
  background-color: #fff;
  font-size: 14px;
  font-family: Arial, "Apple SD Gothic Neo", sans-serif;
  color: #1f1f1f;
}

/* 로고 컨테이너 스타일 */
.logo-container {
  height: 100%;
  margin-top: auto;
  max-height: 92px;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: flex-end;
}

/* Google 로고 스타일 */
.google-logo {
  max-height: 100%;
  max-width: 100%;
  object-fit: contain;
  object-position: center bottom;
  width: auto;
}

리팩토링 설명

  1. CSS 파일 분리:
    • GoogleLogo.css 파일로 스타일을 이동했습니다.
    • html, body, .logo-container, .google-logo 스타일을 정의했습니다.
  2. 클래스 이름 변경:
    • 기존 클래스 이름(k1zIA, rSk4se, lnXdpd) 대신 의미 있는 이름(logo-container, google-logo)으로 변경했습니다.
  3. JSX 코드 개선:
    • style 속성을 사용하지 않고, CSS 클래스를 활용했습니다.
    • dangerouslySetInnerHTML를 제거하고 외부 CSS 파일에서 스타일을 관리하도록 변경했습니다.

장점

  • 재사용성: CSS 파일로 분리함으로써 컴포넌트가 더 재사용 가능해졌습니다.
  • 가독성: 인라인 스타일 제거로 JSX가 더 깔끔해졌습니다.
  • 유지 보수성: CSS와 JSX 코드가 명확하게 분리되어 스타일 수정이 더 쉬워졌습니다.

이제 컴포넌트를 사용할 때 GoogleLogo.js를 임포트하면 됩니다. 🎉


You:

향상된 예제로
프로젝트를 만들고 전체소스를 빌드하는 과정을
정리해줘


ChatGPT:

React 프로젝트 개선 및 빌드하기

이번에는 Google 로고를 표시하는 React 컴포넌트를 사용하여 새로운 React 프로젝트를 구축하고, CSS 분리프로젝트 빌드까지 완성해 보겠습니다.

목표

  • React 프로젝트를 생성하고, GoogleLogo 컴포넌트 추가.
  • 스타일을 외부 CSS 파일로 분리.
  • 프로젝트를 빌드하여 최종 배포용 파일 생성.

Step 1: 프로젝트 생성

먼저 React 프로젝트를 생성합니다.

1.1. 프로젝트 생성 명령어

npx create-react-app google-logo-app
cd google-logo-app

1.2. 프로젝트 디렉토리 구조

google-logo-app/
├── public/
├── src/
│   ├── components/
│   │   └── GoogleLogo.js
│   ├── styles/
│   │   └── GoogleLogo.css
│   ├── App.js
│   ├── index.js
│   └── index.css
├── .gitignore
├── package.json
└── README.md

Step 2: 컴포넌트 및 스타일 작성

2.1. GoogleLogo.js (React 컴포넌트)

src/components/GoogleLogo.js 파일을 생성하고 아래 코드를 추가합니다.

import React from "react";
import "./../styles/GoogleLogo.css";

export default function GoogleLogo() {
  return (
    <div className="logo-container">
      <img
        className="google-logo"
        alt="Google"
        src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
        srcSet="/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png 1x, /images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 2x"
      />
    </div>
  );
}

2.2. GoogleLogo.css (CSS 스타일)

src/styles/GoogleLogo.css 파일을 생성하고 아래 스타일을 추가합니다.

/* 전체 페이지 스타일 */
html,
body {
  min-width: 400px;
  height: 100%;
  margin: 0;
  padding: 0;
  background-color: #fff;
  font-size: 14px;
  font-family: Arial, "Apple SD Gothic Neo", sans-serif;
  color: #1f1f1f;
}

/* 로고 컨테이너 스타일 */
.logo-container {
  height: 100%;
  margin-top: auto;
  max-height: 92px;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: flex-end;
}

/* Google 로고 스타일 */
.google-logo {
  max-height: 100%;
  max-width: 100%;
  object-fit: contain;
  object-position: center bottom;
  width: auto;
}

2.3. App.js 수정

src/App.js 파일을 수정하여 GoogleLogo 컴포넌트를 사용합니다.

import React from "react";
import GoogleLogo from "./components/GoogleLogo";
import "./App.css";

function App() {
  return (
    <div className="App">
      <GoogleLogo />
    </div>
  );
}

export default App;

2.4. App.css (필요 시 추가)

src/App.css에 기본 스타일을 추가합니다.

.App {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  background-color: #f0f0f0;
}

Step 3: 프로젝트 실행 및 확인

3.1. 의존성 설치

프로젝트의 모든 의존성을 설치합니다.

npm install

3.2. 로컬 서버 실행

npm start
  • http://localhost:3000에서 앱이 열립니다.
  • Google 로고가 가운데에 잘 표시되는지 확인합니다.

Step 4: 빌드 및 배포

4.1. 프로젝트 빌드

프로덕션용으로 최적화된 빌드를 생성합니다.

npm run build
  • build/ 폴더에 최적화된 파일이 생성됩니다.

4.2. 빌드된 파일 구조

build/
├── static/
├── asset-manifest.json
├── favicon.ico
├── index.html
├── manifest.json
├── robots.txt
└── ...

4.3. 빌드된 파일을 배포하는 방법

  • Netlify, Vercel, GitHub Pages와 같은 서비스에 build 폴더를 업로드하여 배포할 수 있습니다.
  • 로컬에서 테스트하려면 serve 패키지를 사용할 수 있습니다:
  • npm install -g serve serve -s build

추가 팁: ESLint 및 Prettier 설정

코드 스타일을 유지하기 위해 ESLintPrettier를 추가하는 것도 좋은 방법입니다.

npm install --save-dev eslint prettier eslint-plugin-react eslint-config-prettier eslint-plugin-prettier

.eslintrc.json 파일 추가

{
  "extends": ["react-app", "plugin:prettier/recommended"]
}

마무리

이제 프로젝트를 로컬에서 실행하고, 빌드 후 배포까지 완료했습니다!

이 가이드를 따라하면 React 프로젝트를 처음부터 끝까지 구축하고 배포하는 과정을 이해하는 데 도움이 될 것입니다. 🚀

Comments