[React #17] React App 생성

    반응형

    01. React App

    • 리액트로 만든 웹 서비스
    • 웹 페이지의 기능을 넘어서 어플리케이션에 가까운 기능을 해서 웹 위에 동작하는 어플리케이션이라는 의미

     

    02. React App 생성

    • Vite : 차세대 프론트엔드 개발 툴로, 기본 설정이 적용된 React App 생성 가능
    • vite에는 웹 서버가 내장되어 있음

    01) React App 생성

    npm create vite@latest

    생성 완료

     

    📑 package.json

    - node.js 패키지이기 때문에 package.json 파일이 있음

    {
      "name": "practice-react",
      "private": true,
      "version": "0.0.0",
      "type": "module",
      "scripts": {
        "dev": "vite",
        "build": "vite build",
        "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
        "preview": "vite preview"
      },
      "dependencies": {
        "react": "^18.2.0",
        "react-dom": "^18.2.0"
      },
      "devDependencies": {
        "@types/react": "^18.2.56",
        "@types/react-dom": "^18.2.19",
        "@vitejs/plugin-react": "^4.2.1",
        "eslint": "^8.56.0",
        "eslint-plugin-react": "^7.33.2",
        "eslint-plugin-react-hooks": "^4.6.0",
        "eslint-plugin-react-refresh": "^0.4.5",
        "vite": "^5.1.4"
      }
    }
    • devDependencies : 개발할 때에만 사용되는 라이브러리들 저장, 배포할 때는 포함되지 않음

    02) package.json을 기반으로 라이브러리 설치

    npm i

     

    - 설치가 완료되면 node_modules, package-lock.json 파일 생성됨

    node_modules

     

     

    03. React App 파일 구성

    React App 파일

    ① 📑 public

    - svg, png, jpg 등과 같은 이미지 파일 보관

    - 폰트나 동영상 같은 정적인 파일 보관

     

    ② 📑 src

    - 작성하게 될 리액트나 자바스크립트 코드들 보관

     

    ③ 📑 assets

    - 정적 파일 보관

     

    📑 eslintrc.cjs

    - eslint 도구의 설정 파일

    (eslint : 개발자들 사이에 코드 스타일을 통일하는 데 도움을 주는 도구)

     

    ⑤ 📑 .gitignore

    - github에 업로드할 때 올리면 안 되는 파일 명시하는 파일

     

    ⑥ 📑 index.html

    - 리액트의 기본적인 틀 역할을 하는 HTMl 코드가 담긴 파일

     

    ⑦ 📑 vite.config.js

    - vite 도구의 옵션을 설정하는 파일

     

     

    04. React App 실행

     

    📑 package.json

    {
      "scripts": {
        "dev": "vite",
        "build": "vite build",
        "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
        "preview": "vite preview"
      }
    }
    • dev : 개발용으로 실행

    📑 ctrl+J 누른 후 terminal에 'npm run dev' 입력

    npm run dev
    • 리액트 웹 서버 가동

     

    [ 단축키 ]

    - r + enter : 새로고침

    - u + enter : url 다시 보기

    - o + enter : 브라우저 다시 열기

    - c + enter : 콘솔 지우기

    - q + enter : 리액트 앱 종료

     

     

    📌 localhost:5173

     

    - localhost : 내 컴퓨터를 뜻함, 남의 컴퓨터로 이 주소에 접속할 수 없음

    - 5173 : 포트 번호로, 하나의 컴퓨터 내에서 여러 개의 서버를 동작시키기 위해 필요한 주소를 말함

    - 포트 번호가 필요한 이유 : 예를 들어 React Server, PHP Server 두 개의 서버가 동작하고 있을 때 어떠한 서버가 요청에 응답할지 명시해주기 위함

    - 그래서 모든 프로그램이 실행될 때마다 자동으로 고유한 포트 번호를 붙여줌

     

     

     

    05. React App 구동 원리

    구동화면

     

    📑 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>Vite + React</title>
      </head>
      <body>
        <div id="root"></div>
        <script type="module" src="/src/main.jsx"></script>
      </body>
    </html>
    • 기본화면으로 여기서 main.jsx 파일 실행

    📑 main.jsx

    import React from 'react'
    import ReactDOM from 'react-dom/client'
    import App from './App.jsx'
    import './index.css'
    
    ReactDOM.createRoot(document.getElementById('root')).render(
      <React.StrictMode>
        <App />
      </React.StrictMode>,
    )
    • createRoot : 인수로 전달받은 html 요소를 리액트의 루트로 만들어주는 역할
    • render : <App />을 렌더링 한다는 뜻
    • <App /> : 컴포넌트를 렌더링하는 문법
    • StrictMode : 작성한 코드에 잠재적인 문제가 있는지 검사해서 경고해주는 도구

    📑 App.jsx

    import { useState } from 'react'
    import reactLogo from './assets/react.svg'
    import viteLogo from '/vite.svg'
    import './App.css'
    
    function App() {
      const [count, setCount] = useState(0)
    
      return (
        <>
          <div>
            <a href="https://vitejs.dev" target="_blank">
              <img src={viteLogo} className="logo" alt="Vite logo" />
            </a>
            <a href="https://react.dev" target="_blank">
              <img src={reactLogo} className="logo react" alt="React logo" />
            </a>
          </div>
          <h1>Vite + React</h1>
          <div className="card">
            <button onClick={() => setCount((count) => count + 1)}>
              count is {count}
            </button>
            <p>
              Edit <code>src/App.jsx</code> and save to test HMR
            </p>
          </div>
          <p className="read-the-docs">
            Click on the Vite and React logos to learn more
          </p>
        </>
      )
    }
    
    export default App
    • 함수가 html 태그들을 리턴하고 있으면 함수를 컴포넌트라고 부름
    • App() 함수가 리턴하고 있는 html 태그들을 main.jsx에서 사용

    📌정리

     'app.jsx'에서  html 태그 리턴 'main.jsx'에서 <App /> 실행 'index.html'에서 main.jsx 실행

     

     

    참고자료

    이정환 Winterlood, '한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지'
    반응형

    댓글