본문 바로가기
Git

Git - Vite와 React, pnpm 으로 github page 배포하기

by 새발개발JA 2024. 8. 25.
반응형

 

 

 

일단 이 포스팅을 남기는 이유는

vite, react, pnpm 을 사용해 github page를 배포하려다 호되게 후두려 맞았기 때문이며, 지난날 삽질의 기록이기도 하다.

 

일단 vite 생태계는 좀 다르다. 빌드 결과물의 경로가 build 디렉터리가 아닌 dist 디렉터리를 바라본다.

또한 baseurl 도 잘 지정해주어야 한다. 빌드는 결국 경로 지정 싸움이기 때문이다.

그래서 vite 웹사이트에서 static site build 를 안내하는 섹션이 따로 있을 정도이다.

 

그래서 배포시 extra care 가 필요하다고 본다. 

기억나는 데로 크게 세 가지 범주로 나누어 볼 수 있다. 

1. 깃헙 페이지 세팅하기 
2. vscode 세팅하기
3. 깃헙 페이지 배포하기

 


 

Git - Vite와 React, pnpm 으로 github page 배포하기

 

내 깃헙 아이디가 saebalja 라고 한다면, saebalja.github.io 라는 레포지토리 가 필요하다

그리고 거기에서 작업을 시작해야한다.

 

 

깃헙 페이지에서 세팅하기

github 사이트의 레포지토리 페이지에서 ⚙ [세팅] - pages  로 들어간다.

Build and deployment 섹션에서 branch 를 main 과 /root 로 두고 저장해준다

 

 

vscode 에서 세팅하기

- gh-pages 를 설치해주고

- package.json 및 vite.config.ts 그리고 Router 를 손봐줄 것이다

 

 

1. gh-pages 설치하기

깃헙 페이지로 배포하려면 빌드된 파일을 gh-pages 브랜치에 푸시를 해줘야 배포가 된다.

이 패키지를 설치하면 간단한 명령어로 자동으로 푸시할 수 있다.

$ pnpm add gh-pages

 

 

2. package.json

여기서는 gh-pages 에 관한 명령어들을 추가해줄 것이다.

// your package.json 
{
	"homepage": "https://beemee-p.github.io/",
	"scripts": {
        "dev": "vite",
        "build": "tsc -b && vite build",
        "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
        "preview": "vite preview",
        "server": "nodemon server.js",
        "predeploy": "pnpm run build", // 요거랑
        "deploy": "gh-pages -d dist" // 이걸 추가해주자
	},
  .
  .
  .
  나머지 내용들
}

 

 

3. vite.config.ts 

여기서는 base 옵션에 '/' 를 추가해주자

(여러 포스팅 참고해보면 상대경로로 하려면 base="" 이렇게 빈칸으로 남겨두라고 하는데, 내경우에는 절대경로라도 잘 보였다.)

import react from "@vitejs/plugin-react";
import path from "path";
import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  base: "/", // 바로 여기
});

 

 

 

4. index.tsx

여기서는 Router 부분을 손봐줘야 된다. 이 부분을 몰라서 배포가 되도 에러 없이 흰 화면이 보이는 이슈가 있었다.

gh-pages 는 리액트 라우터의 BrowserRouter을 지원하지 않기 때문이다.

HashRouter 도 사용해봤지만 url 뒤에 /#/ 이 붙는 이슈가 있어서  다시 BrowerRouter 로 돌아왔다.

그럴 때는 base 태그 하나를 index.html 에 추가해주어 해결한다.

import React from "react";
import ReactDOM from "react-dom/client";
import {
  RouterProvider,
  createHashRouter,
} from "react-router-dom";
import App from "./App.tsx";
import "./index.css";

const router = createHashRouter([
  {
    path: "/",
    element: <App />,
    loader: () => <div>로딩중...</div>,
    ErrorBoundary: () => <div>404 NOT FOUND</div>,
  }
]);

ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
      <RouterProvider router={router} />
  </React.StrictMode>
);

 

 

5. index.html

<base href="/" /> 태그를 추가해주자

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <base href="/" /> # 여기 이렇게 추가 해주자
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>깃헙 배포 테스트 페이지</title>
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap"
      rel="stylesheet"
    />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,200..900;1,200..900&family=Gowun+Dodum&display=swap"
      rel="stylesheet"
    />
  </head>

  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>

 

 

여기까지 수정한 파일들을 커밋하고, main 브랜치로 푸시해주자

 

 

깃헙 페이지로 배포하기

위의 과정을 다 거쳤으면 main 브랜치 기준으로 작업 내용을 origin/main 에 푸시해주자

작업내용을 main 브랜치에 저장해주었다면, 배포해주자

... main 브랜치로 작업내용 커밋 & 푸쉬 후
$ pnpm run deploy

 

 

 

이렇게 되면 gh-pages 라는 원격 브랜치가 자동으로 생성되고, 그 브랜치에는 빌드된 아웃풋이 들어있다

근데 우리는 굳이 거길 건드릴 필요가 없다. 깃헙 내부에서 배포에 사용되는 브랜치이기 때문이다

 

 

깃헙 페이지 세팅 - pages 로 다시 돌아와서 branch 를 gh-pages 로 바꾸고 save 해주자

그리고 github.io 로 배포된 주소로 들어가보면 배포가 잘 되어 있다

 

 

 

반응형

댓글