일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- radixui
- MFA
- frontend
- 리팩토링
- MicroFrontEnd
- CustomHook
- 오블완
- Webworker
- 회고
- 합성 컴포넌트
- context.api
- 리액트
- Web
- 티스토리챌린지
- 이것저것
- vite
- virtaullist
- 아키텍처
- 에세이
- react
- server component
- 웹워커
- sharedworker
- provider 패턴
- 클린코드
- CRA
- JavaScript
- 자바스크립트
- TypeScript
- 프론트엔드
- Today
- Total
Lighthouse of FE biginner
Eject된 CRA 프로젝트에서 Vite 프로젝트로 마이그레이션 하기 본문
기대 효과
- 더 이상 유지보수 되지 않는 CRA
- Vite는 ESModule을 활용하기 때문에 로컬에서 개발 서버를 실행 시 번들링 없이 빠르게 시작이 가능 (대기시간 감소)
- 빠른 소스 코드 갱신
- CRA는 개발 시 소스 코드를 변경하면 모든 파일을 다시 번들링을 수행하기 때문에 페이지가 리로드가 됨.
- Vite는 ESM을 이용해 수정된 모듈만 교체하기 때문에 코드 수정이 갱신 시간에 영향을 미치지 않음. 또한 HTTP 헤더를 활용해 모듈을 캐싱하여 페이지의 로드 속도를 높여줌.
- 빌드 시간 감소
- 개발서버, 프로덕션, 빌드에 필요한 옵션을 별도의 리소스 투입 없이 config 파일로 설정이 가능해 개발 비용 감소
Vite 마이그레이션 전 고려해야 할 사항
- Node.js 버전 (최소 18버전을 요구)
- Eject 하여 설정한 부분들을 커버 할 수 있는지
- 빌드 된 결과물이 문제 없이 잘 실행되는지
- Vite 6버전 이후부터는 CJS를 지원하지 않습니다. 그렇기 때문에 CJS를 사용하는 부분을 ESM로 대체해야합니다.
- CI/CD 스크립트 체크
마이그레이션 절차
사전 준비
node 버전 관리
- TO-BE: ^18
- 24/5/13 기준 가장 최신이며 안정화 된 버전인 20버전을 고려하도록 하겠습니다.
- nvm 을 활용해 node 버전을 20으로 설정해줍니다.
nvm install 20
nvm use 20
설치해야 할 라이브러리
- vite
- @vitejs/plugin-react
- vite-tsconfig-paths (tsconfig에서 절대 경로를 설정할 경우)
고려
- vite-plugin-svgr
- svg를 사용하기 위한 플러그인
yarn add --dev vite @vitejs/plugin-react vite-tsconfig-paths vite-plugin-svgr
Vite config 파일 생성
프로젝트의 루트에 config 파일을 생성합니다.
- vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import tsconfigPath from 'vite-tsconfig-paths';
import svgr from 'vite-plugin-svgr';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
react(),
tsconfigPath(),
svgr({
include: '**/*.svg?react',
}),
],
});
index.html 파일 이동
CRA은 index.html 파일이 프로젝트 루트 산하 public 폴더에 위치합니다. 해당 파일을 프로젝트의 루트에 위치 시킵니다.
파일 이동 후 %PUBLIC_URL% 경로를 제거합니다.
body 태그 최하단에 아래와 같은 스크립트 태그를 넣어줍니다.
<script type="module" src="/src/index.tsx"></script>
tsconfig 파일 업데이트
tsconfig 파일의 프로퍼티(target, lib, types)를 업데이트 해줍니다. 현재 탭클라우드잇의 tsconfig 파일에 types 만 추가하면 됩니다.
{
"compilerOptions": {
"target": "ESNext",
"lib": ["dom", "dom.iterable", "esnext"],
"types": ["vite/client", "vite-plugin-svgr/client"],
...
},
...
}
vite-env.d.ts 파일 생성
src 폴더 하위에 vite-env.d.ts 파일을 생성합니다.
/// <reference types="vite/client" />
react-scripts 제거
통상적으로 CRA 프로젝트는 react-scripts 탬플릿으로 실행됩니다. 하지만 현재 프로젝트는 eject 된 프로젝트이고 해당 라이브러리가 존재하지 않으니 패스하겠습니다.
package.json 업데이트
Vite를 사용함으로써 스크립트를 업데이트 해야합니다. 현재 스크립트 중 build-ssl 스크립트가 존재하는데, 해당 스크립트가 하는 일을 Vite에서 커버할 수 있도록 스크립트를 추가해야겠습니다.
"scripts": {
"start": "vite",
"build": "tsc && vite build",
"serve": "vite preview"
},
프로젝트를 ESM로 인식하기 위해 "type": "module", 해당 키-값을 추가해줍니다. ESM을 사용하는 경우 require 같은 CommonJS 문법을 사용할 수 없게 됩니다. 그렇기 때문에 현재 프로젝트에서 CommonJS를 사용하는 부분을 리팩토링 해줘야합니다.
ESM에서 CJS 문법 사용 참고 블로그
https://mihee0703.tistory.com/118
기타 Eject된 후 생긴 파일 제거
Webpack, babel 설정 파일을 제거합니다.
마이그레이션 이후
통상 하는 마이그레이션 절차는 끝났습니다. 하지만 이제 정상적으로 동작하는지 체크해야 합니다. 또한 webpack 커스텀을 통해서 최적화 했던 옵션들과 프론트엔드 포트 변경 등 해야 할 일들이 있습니다.
Vite는 빌드 후 번들링된 결과물을 dist 폴더에 저장합니다. 기존 CI/CD 에서 빌드 이후 번들링 파일 경로를 확인해 수정해야 합니다.
'[WEB] 프론트엔드' 카테고리의 다른 글
[트러블슈팅] Vite 프로젝트 Node.js 환경 폴리필 (0) | 2024.07.02 |
---|---|
[트러블슈팅] Vite SCSS 변수 참조 에러 (0) | 2024.07.02 |
[React] 컴포넌트 설계하기 (0) | 2024.06.30 |
[클린코드 리액트] useEffect 바르게 사용하기 (1) | 2024.06.10 |
[클린코드 리액트] 컴포넌트 내부에 컴포넌트 선언 지양하기 (0) | 2024.06.10 |