react-vite-scaffold
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseVite React Project Scaffold
Vite React项目脚手架
Vite 기반 React(CSR) 프로젝트를 스캐폴딩하거나, 기존 프로젝트의 누락된 설정을 자동 보완하는 스킬.
本工具可用于搭建基于Vite的React(CSR)项目脚手架,或自动补全现有项目缺失的配置。
동작 흐름
运行流程
1단계: 프로젝트 상태 감지
第1步:检测项目状态
다음 파일들을 확인하여 현재 프로젝트 상태를 판별한다:
| 확인 대상 | 감지 방법 |
|---|---|
| 빈 디렉토리 여부 | 현재 디렉토리에 파일이 없거나 |
| Vite 프로젝트 | |
| TypeScript | |
| TanStack Query | |
| React Router | |
| Zustand | |
| Tailwind CSS | |
| ESLint 구성 | |
| Prettier 구성 | |
| VSCode 설정 | |
| 패키지 매니저 | |
通过检查以下文件判断当前项目状态:
| 检测对象 | 检测方式 |
|---|---|
| 是否为空目录 | 当前目录下无文件,或不存在 |
| Vite项目 | 存在 |
| TypeScript | 存在 |
| TanStack Query | |
| React Router | |
| Zustand | |
| Tailwind CSS | |
| ESLint配置 | 存在 |
| Prettier配置 | 存在 |
| VSCode设置 | 存在 |
| 包管理器 | |
2단계: 분기 처리
第2步:分支处理
빈 디렉토리인 경우 (스캐폴딩 모드):
- 프로젝트 생성 명령 실행
- 아래 설정 전부 자동 적용
기존 Vite 프로젝트인 경우 (보완 모드):
- 위 감지 기준으로 설치 상태 자동 판별
- 누락된 설정만 식별하여 자동 생성
- 이미 존재하는 설정 파일은 건드리지 않음
如果是空目录(脚手架模式):
- 执行项目创建命令
- 自动应用下方所有配置
如果是现有Vite项目(补全模式):
- 按照上述检测标准自动判断安装状态
- 仅识别并自动生成缺失的配置
- 不修改已经存在的配置文件
3단계: 프로젝트 생성
第3步:创建项目
현재 디렉토리에 Vite 프로젝트 생성:
bash
{pm} create vite@latest .은 패키지 매니저 감지 규칙에 따라 결정된 패키지 매니저로 대체한다. (npm, pnpm, yarn, bun){pm}
대화형 선택지:
- Current directory is not empty. Please choose how to proceed: Ignore files and continue (디렉토리에 등 스킬 관련 파일이 있는 경우 표시됨)
.claude/ - Select a framework: React
- Select a variant: TypeScript + React Compiler
- Use rolldown-vite (Experimental)?: No
- Install with npm and start now? Yes
요구사항: Node.js 18+, NPM 8+
在当前目录下创建Vite项目:
bash
{pm} create vite@latest .会替换为根据包管理器检测规则判定的包管理器(npm、pnpm、yarn、bun)。{pm}
交互式选项:
- Current directory is not empty. Please choose how to proceed: Ignore files and continue(目录下存在等工具相关文件时会显示该选项)
.claude/ - Select a framework: React
- Select a variant: TypeScript + React Compiler
- Use rolldown-vite (Experimental)?: No
- Install with npm and start now? Yes
环境要求:Node.js 18+,NPM 8+
4단계: Tailwind CSS 설치
第4步:安装Tailwind CSS
bash
{pm} install -D tailwindcss @tailwindcss/vitevite.config.tsts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
react(),
tailwindcss()
],
resolve: {
alias: [
{ find: '@', replacement: '/src' }
]
}
})src/index.csscss
@import 'tailwindcss';bash
{pm} install -D tailwindcss @tailwindcss/vite在中添加Tailwind插件:
vite.config.tsts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
react(),
tailwindcss()
],
resolve: {
alias: [
{ find: '@', replacement: '/src' }
]
}
})在文件顶部添加:
src/index.csscss
@import 'tailwindcss';5단계: 경로 별칭 구성
第5步:配置路径别名
vite.config.tsresolve.aliasts
resolve: {
alias: [
{ find: '@', replacement: '/src' }
]
}tsconfig.app.jsonjson
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}vite.config.tsresolve.aliasts
resolve: {
alias: [
{ find: '@', replacement: '/src' }
]
}在中添加路径别名:
tsconfig.app.jsonjson
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}6단계: ESLint + Prettier 구성
第6步:配置ESLint + Prettier
ESLint 관련 패키지는 Vite 프로젝트 생성 시 이미 포함되어 있음.
Prettier 관련 패키지를 추가 설치:
bash
{pm} install -D prettier eslint-config-prettier eslint-plugin-prettier prettier-plugin-tailwindcsseslint.config.jsjs
import prettierRecommended from 'eslint-plugin-prettier/recommended'
export default defineConfig([
{
extends: [
prettierRecommended
]
}
])TanStack Query가 포함된 경우, 같은 배열에 추가:
extendsjs
import prettierRecommended from 'eslint-plugin-prettier/recommended'
import tanstackQuery from '@tanstack/eslint-plugin-query'
export default defineConfig([
{
extends: [
prettierRecommended,
tanstackQuery.configs.recommended
]
}
])ESLint相关包在创建Vite项目时已默认包含。
额外安装Prettier相关包:
bash
{pm} install -D prettier eslint-config-prettier eslint-plugin-prettier prettier-plugin-tailwindcss在中添加Prettier集成:
eslint.config.jsjs
import prettierRecommended from 'eslint-plugin-prettier/recommended'
export default defineConfig([
{
extends: [
prettierRecommended
]
}
])如果项目包含TanStack Query,在同一个数组中添加配置:
extendsjs
import prettierRecommended from 'eslint-plugin-prettier/recommended'
import tanstackQuery from '@tanstack/eslint-plugin-query'
export default defineConfig([
{
extends: [
prettierRecommended,
tanstackQuery.configs.recommended
]
}
])패키지 역할 참고
包作用参考
| 패키지 | 설명 |
|---|---|
| ESLint 코어 패키지 (Vite에 포함) |
| Prettier 코어 패키지 |
| React 문법 분석 및 검사 (Vite에 포함) |
| ESLint와 Prettier의 충돌 방지 |
| Prettier 규칙을 ESLint 규칙으로 통합 |
| React Hooks 규칙 강제 (Vite에 포함) |
| React Refresh 규칙 (Vite에 포함) |
| Tailwind CSS 클래스 자동 정렬 |
| TanStack Query 규칙 (TanStack Query 사용 시) |
| 包名 | 说明 |
|---|---|
| ESLint核心包(Vite已内置) |
| Prettier核心包 |
| React语法分析与校验(Vite已内置) |
| 避免ESLint与Prettier规则冲突 |
| 将Prettier规则整合为ESLint规则 |
| 强制React Hooks规则(Vite已内置) |
| React Refresh规则(Vite已内置) |
| 自动排序Tailwind CSS类名 |
| TanStack Query规则(使用TanStack Query时需要) |
7단계: .prettierrc
第7步:生成.prettierrc
.prettierrcjson
{
"semi": false,
"singleQuote": true,
"singleAttributePerLine": true,
"bracketSameLine": true,
"endOfLine": "auto",
"trailingComma": "none",
"arrowParens": "avoid",
"plugins": ["prettier-plugin-tailwindcss"]
}如果不存在文件,在项目根目录创建该文件:
.prettierrcjson
{
"semi": false,
"singleQuote": true,
"singleAttributePerLine": true,
"bracketSameLine": true,
"endOfLine": "auto",
"trailingComma": "none",
"arrowParens": "avoid",
"plugins": ["prettier-plugin-tailwindcss"]
}8단계: .vscode/settings.json
第8步:生成.vscode/settings.json
.vscode/settings.jsonjson
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}如果不存在文件,创建该文件:
.vscode/settings.jsonjson
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}9단계: TanStack Query
第9步:配置TanStack Query
@tanstack/react-querypackage.json-
패키지 설치:bash
{pm} install @tanstack/react-query {pm} install -D @tanstack/eslint-plugin-query -
ESLint Flat Config()에 TanStack Query 플러그인 추가 (6단계 참조)
eslint.config.js -
에서 QueryClientProvider 래핑:
src/App.tsxtsximport { QueryClient, QueryClientProvider } from '@tanstack/react-query' const queryClient = new QueryClient() export default function App() { return ( <QueryClientProvider client={queryClient}> {/* 기존 컴포넌트 */} </QueryClientProvider> ) }
如果中没有:
package.json@tanstack/react-query-
安装包:bash
{pm} install @tanstack/react-query {pm} install -D @tanstack/eslint-plugin-query -
在ESLint Flat Config()中添加TanStack Query插件(参考第6步)
eslint.config.js -
在中用QueryClientProvider包裹组件:
src/App.tsxtsximport { QueryClient, QueryClientProvider } from '@tanstack/react-query' const queryClient = new QueryClient() export default function App() { return ( <QueryClientProvider client={queryClient}> {/* 原有组件 */} </QueryClientProvider> ) }
10단계: React Router
第10步:配置React Router
react-routerpackage.json-
패키지 설치:bash
{pm} install react-router -
생성:
src/routes/index.tsxtsximport { createBrowserRouter, RouterProvider } from 'react-router' import Home from './pages/Home' import About from './pages/About' const router = createBrowserRouter([ { path: '/', element: <Home /> }, { path: '/about', element: <About /> } ]) export default function Router() { return <RouterProvider router={router} /> } -
생성:
src/routes/pages/Home.tsxtsxexport default function Home() { return <h1>Home</h1> } -
생성:
src/routes/pages/About.tsxtsxexport default function About() { return <h1>About</h1> } -
에서
src/main.tsx를 사용하도록 수정:Routertsximport { createRoot } from 'react-dom/client' import Router from './routes' createRoot(document.getElementById('root')!).render(<Router />)
如果中没有:
package.jsonreact-router-
安装包:bash
{pm} install react-router -
生成:
src/routes/index.tsxtsximport { createBrowserRouter, RouterProvider } from 'react-router' import Home from './pages/Home' import About from './pages/About' const router = createBrowserRouter([ { path: '/', element: <Home /> }, { path: '/about', element: <About /> } ]) export default function Router() { return <RouterProvider router={router} /> } -
生成:
src/routes/pages/Home.tsxtsxexport default function Home() { return <h1>Home</h1> } -
生成:
src/routes/pages/About.tsxtsxexport default function About() { return <h1>About</h1> } -
修改使用
src/main.tsx:Routertsximport { createRoot } from 'react-dom/client' import Router from './routes' createRoot(document.getElementById('root')!).render(<Router />)
11단계: Zustand
第11步:配置Zustand
zustandpackage.json-
패키지 설치:bash
{pm} install zustand -
생성:
src/store/example.tstsimport { create } from 'zustand' interface ExampleStore { count: number increase: () => void decrease: () => void } export const useExampleStore = create<ExampleStore>(set => ({ count: 0, increase: () => set(state => ({ count: state.count + 1 })), decrease: () => set(state => ({ count: state.count - 1 })) }))
如果中没有:
package.jsonzustand-
安装包:bash
{pm} install zustand -
生成:
src/store/example.tstsimport { create } from 'zustand' interface ExampleStore { count: number increase: () => void decrease: () => void } export const useExampleStore = create<ExampleStore>(set => ({ count: 0, increase: () => set(state => ({ count: state.count + 1 })), decrease: () => set(state => ({ count: state.count - 1 })) }))
주의사항
注意事项
- 이미 존재하는 설정 파일은 덮어쓰지 않는다
- 기존 프로젝트 보완 모드에서는 질문 없이 자동으로 진행한다
- 패키지 매니저는 기존 프로젝트의 lock 파일로 판별한다:
- →
pnpm-lock.yamlpnpm - →
yarn.lockyarn - 또는
bun.lockb→bun.lockbun - 또는 lock 파일 없음 →
package-lock.jsonnpm
- 빈 디렉토리(스캐폴딩 모드)에서는 을 사용한다
npm
- 不会覆盖已经存在的配置文件
- 现有项目补全模式下无需人工确认,自动执行
- 根据现有项目的锁文件判定包管理器:
- →
pnpm-lock.yamlpnpm - →
yarn.lockyarn - 或
bun.lockb→bun.lockbun - 存在或无锁文件 →
package-lock.jsonnpm
- 空目录(脚手架模式)下默认使用
npm