본문 바로가기
카테고리 없음

CRA를 Vite로 마이그래이션하기 (ts설정X)

by 반갑조? 2025. 1. 22.

프로젝트를 처음 시작할때에는 CRA(Create React App)로 하였다. 

그러나 CRA로 프로젝트를 진행하면서 문제가 생겼고 craco를 추가 설치하여 해결한 경험이 있다.

CRA프로젝트를 진행하면서 프로젝트가 로드 될 때마다 느린걸 체감하게 되었고 이것이 Vite로 마이그래이션 하는 큰 이유가 되었다.

 

내 프로젝트는 레이아웃을 잡아놓고 일부 기능도 구현해놓아서 프로젝트의 초반이지는 않았다.

다행히 브랜치에서 작업하고 있었기에 브랜치를 종료하고 새 브랜치를 만들어 Vite로 마이그래이션을 했다.

 

main(master)브랜치에서 바로 Vite로 마이그래이션 하지 않은 이유

  1. 작업 중인 코드의 안정성을 위해서
    • main(master)브랜치는 보통 안정된 코드만 유지하는것이 좋다.
    • Vite로 전환하는 작업은 코드베이스에 큰 영향을 줄 수 있기 때문에 테스트가 필요하다.
    • 문제가 발생하면 기존 코드로 되돌릴 수 있어야한다.
  2. 마이그래이션이 잘 되었는지 우선 확인해야한다.
    • Vite로 전환 후 모든 기능이 정상적으로 작동하는지 확인해야한다.
    • 테스트 후 문제가 없을 때 main(master)브랜치로 병합하는것이 안전하다.

 

 

마이그래이션 순서!

A. 현재 상태를 확인하고 브랜치를 사용하자!

1. 작업 중인 브랜치 보호

- 현재 작업중인 브랜치의 변경 사항이 있다면 먼저 커밋한다.

git add .
git commit -m '커밋 메시지 작성'

 

2. 브랜치 확인

- 현재 브랜치가 작업중인 브랜치가 맞는지 확인한다.

- 표시된 브랜치 앞에 ' * (별표) ' 표시가 있어야 한다. 

git branch

 

3. Vite로 변환하기 위해 새 브랜치를 생성한다.

- 'feature/chage-to-vite' 대신 알맞은 브랜치 이름을 적으면 된다.

- ' -b ' 명령어는 브랜치 생성과 함께 생성된 브랜치로 이동하는 명령어이다.

git checkout -b feature/change-to-vite

 

B. CRA 프로젝트의 초기 설정을 변경하자!

 

(순서대로 하면 된다는 의미에서 숫자는 이어간다.)

4. 기존 CRA 관련 패키지 제거

- CRA 프로젝트에서 사용되는 'react-scripts'와 관련된 패키지를 제거한다.

npm uninstall react-scripts

 

5. Vite 설치 및 설정 초기화

- Vite 관련 패키지를 설치한다.

npm install vite

 

7. Vite 기본 설정 파일 추가

- 프로젝트 루트에 'vite.config.js' 파일을 생성하여 다음 코드를 추가한다.

- Vite에서 기본 port는 5173이다. CRA에서 사용한 port 3000을 사용하고싶다면 아래에 'port: 3000'을 추가하면 된다.(선택사항임)

// 프로젝트 루트에 vite.config.js 파일 생성 후 해당 파일에 코드 추가

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

export default defineConfig({
    plugins: [react()],
    server: {
        open: true,
        port: 3000, // 선택사항
    },
});

 

프로젝트의 구조를 변경하자!

 

 

8. 'index.html' 수정

- CRA에서 사용하던 'public/index.html'을 Vite용으로 수정한다.

- 'public/index.html'을 루트로 이동하고 'public/'폴더는 삭제한다.

- 본문 코드를 수정한다.

    - ' %Public_URL% '가 쓰여진 코드를 삭제한다.

    - '<script type="module" src="/src/main.jsx"></script>' 를 추가한다.

    - 아니면 아래 코드를 사용한다.

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite React App</title>
</head>
<body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
</body>
</html>

 

9. 엔트리 파일 변경

- 기존 CRA에서 사용하던 'src/index.js' 또는 'src/index.jsx'대신 Vite에서는 'src/main.jsx'를 사용한다.

- 'src/main.jsx' 파일을 생성하거나 수정한다. (기존의 index.js를 수정하였다.)

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';

ReactDOM.createRoot(document.getElementById('root')).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);

 

패키지를 변경하고 실행하여 확인하자!

 

10. 기존 스크립트 제거 후 Vite 스크립트 추가

- 'package.json' 파일의 'scripts' 부분을 다음 코드처럼 수정한다.

"scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
}

 

11. 필요한 의존성 추가 설치

- Vite로 마이그래이션 한 후 일부 의존성이 누락되었을 수 있으니 다시 설치한다.

npm install @vitejs/plugin-react

 

12. 개발 서버 실행 확인

- Vite 개발 서버를 실행한다.

npm run dev

 

 

실행 후 아무 문제 없다면 Vite로 마이그래이션이 잘 된 것이다!

 

 

하지만 순순히 잘 되면 그것도 이상하지..... 역시나 에러메시지가!!!!

 

에러메시지 1: [vite] Pre-transform error: Failed to load url /src/main.jsx (resolved id: /src/main.jsx). Does the file exist? (x5) 

설명과 해결: 'main.jsx'를 찾지 못했다는 것을 다섯번이나 알려줌.... 에러메시지에는 늘 답이 있다!

'main.jsx'가 아닌 'main.js'로 수정을 했다는 점! 바로 발견하고 'main.jsx'로 수정했다.

 

에러메시지 2: [vite] (client) Pre-transform error: Failed to load url (생략) /src/pages/MainPage.js) in url (생략) /src/App.jsx. Does the file exist?

설명과 해결: 에러메시지1과 같다. 모든 ' .js ' 파일을 ' .jsx ' 파일로 변경했다.

 

생각보다 에러메시지가 해결하기 쉬운것이여서 다행이였다.


 

이 다음은 CRA를 사용하면서 설치한 아래의 패키지들을 삭제해주었다.

- @emotion/babel-plugin

- @babel/plugin-proposal-private-property-in-object

- @emotion/babel-preset-css-prop

npm uninstall @emotion/babel-plugin @babel/plugin-proposal-private-property-in-object @emotion/babel-preset-css-prop

 

이렇게 명령어로 삭제하는것이 안전하다.

 

혹시나 'package.json'에서 해당 패키지들을 키보드 백스페이스를 사용하여 직접 삭제를 했다면

1. node_modules 폴더 삭제

2. package-lock.json폴더 삭제

3. npm install하기

의 방법을 하면 된다.

하지만 package-lock.json을 삭제하는 방법에는 특히 협업에서는 주의해야할 사항이 있다.

1. pacage-lock.json을 삭제하면 이전에 사용하던 정확한 패키지 버전을 보장 받지 못할 수 있다.

   - npm install로 새로 설치된 패키지 중 일부가 이전 버전과 다를 수 있으므로 프로젝트 테스트가 필수이다.

2. 모든 패키지를 최신으로 설치하는 과정에서 의존성 간 충돌이 발생할 수 있다.

3. 팀원들과 동일한 package-lock.json 파일을 사용하지 않으면 다른 환경에서 작동 방식이 달라질 수 있다.

그러므로 부득이하게 package-lock.json을 삭제 후 npm install을 해야한다면 반드시 프로젝트의 모든 기능을 테스트 하여 의존성 문제나 버전 차이에 따른 동작 차이가 없는지 확인해야한다.

 

가능하면 패키지 업데이트는 package-lock.json을 유지하면서 필요한 때만 개별적으로 진행하는것을 추천한다.

 

Git에 변경 사항을 저장