반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- c#
- mono-repo
- vite
- pnpm
- 라이브러리제작
- 2020년
- typescript
- 회고
- 2021년
- front
- frontend
- 디자인시스템
- react
- Next
- 다짐
- 뇌를자극하는C#
- design
- package
- nextjs
- component
- 프로그래밍
- css framework
- design token
- javascript
- 개발자
- npm
- style-dictionary
- design-system
- 모노레포
- 템플릿
Archives
- Today
- Total
개탕 IT FACTORY
나의 전용 템플릿 엔진(?) 제작기 - react-template 본문
반응형
개요
이번엔 React 템플릿을 만들어볼려고한다.
기본적인 구조는 리액트 프로젝트를 따라갈건데 기초 패키지는 정하고 템플릿을 만들예정이다.
- TanStack Query (데이터 페칭)
- Zustand (상태 관리)
- Axios(API통신)
- React Router V7
기본적으로 위 패키지는 기본장착을 할 예정이다
스타일 부분은 tailwind, emotion, vanilla-extract 등이 고민되지만 (대세는 tailwind이긴하나…)
사실 각 css 프레임워크 별로 나눠서 템플릿을 분기처리할까 생각중이다.
또 테스트 라이브러리도 cypress, playwright 고민을 하엿으나, 대세는 playwright라고 하였다.
(무엇보다 다양한 언어에 지원되는게 좋았던것같다.)
환경구성
my-monorepo-template/
├── packages/
│ ├── eslint-config/ # ESLint 설정 패키지
│ ├── prettier-config/ # Prettier 설정 패키지
│ ├── tsconfig/ # TypeScript 설정 패키지
│ ├── **react-template**/ # React 템플릿 패키지
│ ├── **create-react**/ # React 프로젝트 생성 도구
│ └── nextjs-template/ # (예정) Next.js 템플릿
├── package.json
└── pnpm-workspace.yaml
초기설정
# 패키지 디렉토리 생성
mkdir -p packages/react-template
cd packages/react-template
# 패키지 초기화
pnpm init
# 기본 의존성 설치
pnpm add react-router-dom@^7.4.1
pnpm add -D @vitejs/plugin-react@^4.3.4 vite@^6.0.7
# 모노레포 내 다른 패키지 의존성 추가
pnpm add -D @rendardev/eslint-config@workspace:* @rendardev/prettier-config@workspace:* @rendardev/tsconfig@workspace:*
프로젝트 환경 설정
package.json
: 패키지 정보 및 스크립트 설정tsconfig.json
: TypeScript 설정 (@rendardev/tsconfig/react.json 상속).eslintrc.js
: ESLint 설정 (@rendardev/eslint-config/react 상속).prettierrc
: Prettier 설정 (@rendardev/prettier-config 상속)vite.config.ts
: Vite 빌드 도구 설정playwright.config.ts
: Playwright 테스트 설정
프로젝트 코드
1. package.json
{
"name": "@rendardev/react-template",
"version": "1.0.4",
"description": "React + TypeScript + Vite 템플릿",
"private": false,
"type": "module",
"files": [
"src",
"index.html",
"vite.config.ts",
"tsconfig.json",
".eslintrc.js",
".prettierrc",
".gitignore",
"README.md",
"playwright.config.ts",
"e2e",
"playwright.d.ts"
],
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"format": "prettier --write \\"src/**/*.{ts,tsx,css,md}\\"",
"test": "playwright test",
"test:ui": "playwright test --ui",
"test:debug": "playwright test --debug",
"test:report": "playwright show-report"
},
"dependencies": {
"@tanstack/react-query": "^5.24.1",
"@tanstack/react-query-devtools": "^5.24.1",
"axios": "^1.8.4",
"react-router-dom": "^7.4.1",
"zustand": "^4.5.1"
},
"devDependencies": {
"@rendardev/eslint-config": "workspace:*",
"@rendardev/prettier-config": "workspace:*",
"@rendardev/tsconfig": "workspace:*",
"@playwright/test": "^1.42.1",
"@types/node": "^20.11.30",
"@vitejs/plugin-react": "^4.3.4",
"vite": "^6.0.7"
},
"peerDependencies": {
"react": ">=19.0.0",
"react-dom": ">=19.0.0"
}
}
2. tsconfig.json
{
"extends": "@rendardev/tsconfig/react.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"esModuleInterop": true,
"jsx": "react-jsx",
"types": ["node"]
},
"include": ["src", "e2e", "playwright.config.ts"],
"exclude": ["node_modules"]
}
3. .eslintrc.js
module.exports = {
extends: ["@rendardev/eslint-config/react"],
root: true
};
4. .prettierrc
{
"extends": "@rendardev/prettier-config"
}
5. vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
})
6. src 디렉토리 구조
src/
├── components/ # 재사용 가능한 UI 컴포넌트
│ ├── Header.tsx # 헤더 컴포넌트
│ ├── Footer.tsx # 푸터 컴포넌트
│ ├── Counter.tsx # 카운터 예제 컴포넌트
│ └── Layout.tsx # 레이아웃 컴포넌트
├── pages/ # 페이지 컴포넌트
│ ├── Home.tsx # 홈 페이지
│ ├── About.tsx # 소개 페이지
│ └── NotFound.tsx # 404 페이지
├── routes/ # 라우팅 설정
│ └── index.tsx # 라우터 구성
├── main.tsx # 앱 진입점
└── index.css # 전역 스타일
주요 기능
- React 19 지원: 최신 React 버전 사용
- TypeScript 통합: 타입 안정성을 위한 TypeScript 설정
- Vite 빌드 시스템: 빠른 개발 환경과 효율적인 빌드
- React Router v7: 최신 라우팅 라이브러리 통합
- ESLint & Prettier: 코드 품질과 일관성 유지
- 모듈화된 설정: 설정 파일을 별도 패키지로 분리하여 재사용성 향상
- Playwright 테스트: E2E 테스트 환경 제공
- TanStack Query: 데이터 페칭 솔루션
- Zustand: 간결한 상태 관리 라이브러리
- Axios: 강력한 HTTP 클라이언트
테스트 기능
테스트 기능도 추가하여 테스트도 가능하게 만들어두었다.
e2e/ # 테스트 디렉토리
├── example.spec.ts # 예제 테스트 파일
└── global.d.ts # 타입 정의
playwright.config.ts # Playwright 설정
playwright.d.ts # 타입 선언
마무리
https://www.npmjs.com/package/create-rendardev-react
사실 배포까지 마무리되었다.
글쓰기전에 이미 템플릿 제작을 완료하여서 관련된 create 명령어까지 만들어두었다
# npm 사용
npm create rendardev-react my-app
# yarn 사용
yarn create rendardev-react my-app
# pnpm 사용
pnpm create rendardev-react my-app
@rendardev 패키지로 배포할려고하였으나 create명령어에는 create라는 예약 명령어가 name에 있어야된다구 오류를 뿜어대었다.
이름은 아쉽지만 상당히 보람찬 부분이였다.
이제 해야될건 내부 템플릿제작이다.
- layout작업 (모바일,pc, 대시보드화면 등)
- Page작업 (로그인, main, 대시보드, admin)
- 컴포넌트 → 사실 디자인시스템 구축해놓은거 쓸 예정
Nextjs도 해야되지만… create-next-app도 충분히 좋으니 일단 나중으로 미루고,
react프로젝트나 계속 할 예정이다.
반응형
'Front-end' 카테고리의 다른 글
Array.prototype.map() 직접 구현하기 (1) | 2025.03.31 |
---|---|
나의 전용 템플릿 엔진(?) 제작기 - tsconfig (0) | 2025.03.24 |
나의 전용 템플릿 엔진(?) 제작기 - Prettier (0) | 2025.03.19 |
나의 전용 템플릿 엔진(?) 제작기 - ESLint (0) | 2025.03.14 |
나만의 전용 템플릿 엔진(?) 제작기 - 초기세팅 (0) | 2025.01.20 |