react-next-scaffold
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseNext.js React Project Scaffold
Next.js React 项目脚手架
Next.js 기반 React(SSR) 프로젝트를 스캐폴딩하거나, 기존 프로젝트의 누락된 설정을 자동 보완하는 스킬.
可用于搭建基于Next.js的React(SSR)项目脚手架,或是自动补全现有项目缺失配置的工具。
동작 흐름
运行流程
1단계: 프로젝트 상태 감지
第1步:检测项目状态
다음 파일들을 확인하여 현재 프로젝트 상태를 판별한다:
| 확인 대상 | 감지 방법 |
|---|---|
| 빈 디렉토리 여부 | 현재 디렉토리에 파일이 없거나 |
| Next.js 프로젝트 | |
| TypeScript | |
| TanStack Query | |
| Tailwind CSS | |
| ESLint 구성 | |
| Prettier 구성 | |
| VSCode 설정 | |
| 패키지 매니저 | |
通过检查以下文件判定当前项目状态:
| 检测对象 | 检测方式 |
|---|---|
| 是否为空目录 | 当前目录无文件或不存在 |
| Next.js项目 | 存在 |
| TypeScript | 存在 |
| TanStack Query | |
| Tailwind CSS | |
| ESLint配置 | 存在 |
| Prettier配置 | 存在 |
| VSCode设置 | 存在 |
| 包管理器 | |
2단계: 분기 처리
第2步:分支处理
빈 디렉토리인 경우 (스캐폴딩 모드):
- 프로젝트 생성 명령 실행
- 아래 설정 전부 자동 적용
기존 Next.js 프로젝트인 경우 (보완 모드):
- 위 감지 기준으로 설치 상태 자동 판별
- 누락된 설정만 식별하여 자동 생성
- 이미 존재하는 설정 파일은 건드리지 않음
若为空目录(脚手架模式):
- 执行项目创建命令
- 自动应用所有以下配置
若为现有Next.js项目(补全模式):
- 根据上述检测标准自动判断安装状态
- 仅识别缺失的配置并自动生成
- 不改动已存在的配置文件
3단계: 프로젝트 생성
第3步:创建项目
현재 디렉토리에 Next.js 프로젝트 생성:
은 패키지 매니저 감지 규칙에 따라 결정된 패키지 매니저로 대체한다. (npm, pnpm, yarn, bun){pm}는 해당 패키지 매니저의 실행 명령어로 대체한다. (npx, pnpm dlx, yarn dlx, bunx){pmx}
참고:로 스킬을 설치하면npx skills add,.agents/등의 파일이 이미 존재할 수 있다.skills-lock.json은 디렉토리에 파일이 있으면 충돌로 판단하고 종료되므로, 스캐폴딩 모드에서는 다음 절차를 따른다:create-next-app
- 현재 디렉토리의 기존 파일/폴더 목록을 기억해 둔다
- 기존 파일/폴더를 모두 삭제한다
명령으로 프로젝트를 생성한다{pmx} create-next-app@latest .- 기억해 둔 파일/폴더 중 프로젝트 생성으로 만들어지지 않은 것들(
,.agents/등)을 다시 생성한다skills-lock.json
bash
{pmx} create-next-app@latest .대화형 선택지 (v16 기준):
- Would you like to use the recommended Next.js defaults?: No, customize settings
- Would you like to use TypeScript?: Yes
- Which linter would you like to use?: ESLint
- Would you like to use React Compiler?: Yes
- Would you like to use Tailwind CSS?: Yes
- Would you like your code inside a directory?: Yes
src/ - Would you like to use App Router? (recommended): Yes
- Would you like to customize the import alias (by default)?: No
@/*
在当前目录创建Next.js项目:
将替换为根据包管理器检测规则确定的包管理器(npm、pnpm、yarn、bun){pm}将替换为对应包管理器的执行命令(npx、pnpm dlx、yarn dlx、bunx){pmx}
参考: 通过安装工具时,可能已存在npx skills add、.agents/等文件。skills-lock.json若检测到目录下有文件会判定为冲突并终止运行,因此脚手架模式下遵循以下流程:create-next-app
- 记录当前目录下的现有文件/文件夹列表
- 全部删除现有文件/文件夹
- 执行
命令创建项目{pmx} create-next-app@latest .- 恢复记录中未被项目生成的文件/文件夹(如
、.agents/等)skills-lock.json
bash
{pmx} create-next-app@latest .交互式选项(基于v16版本):
- Would you like to use the recommended Next.js defaults?: No, customize settings
- Would you like to use TypeScript?: Yes
- Which linter would you like to use?: ESLint
- Would you like to use React Compiler?: Yes
- Would you like to use Tailwind CSS?: Yes
- Would you like your code inside a directory?: Yes
src/ - Would you like to use App Router? (recommended): Yes
- Would you like to customize the import alias (by default)?: No
@/*
4단계: 경로 별칭
第4步:路径别名
@/*create-next-app@/*create-next-app5단계: ESLint + Prettier 구성
第5步:配置ESLint + Prettier
bash
{pm} install -D prettier eslint-config-prettier eslint-plugin-prettier prettier-plugin-tailwindcsseslint.config.jseslint.config.mjsjs
import prettierRecommended from 'eslint-config-prettier'
const eslintConfig = defineConfig([
{
extends: [prettierRecommended]
}
])
export default eslintConfigTanStack Query가 포함된 경우, 같은 배열에 추가:
extendsjs
import prettierRecommended from 'eslint-config-prettier'
import tanstackQuery from '@tanstack/eslint-plugin-query'
const eslintConfig = defineConfig([
{
extends: [
prettierRecommended,
tanstackQuery.configs.recommended
]
}
])
export default eslintConfigbash
{pm} install -D prettier eslint-config-prettier eslint-plugin-prettier prettier-plugin-tailwindcss在(或)中添加Prettier集成:
eslint.config.jseslint.config.mjsjs
import prettierRecommended from 'eslint-config-prettier'
const eslintConfig = defineConfig([
{
extends: [prettierRecommended]
}
])
export default eslintConfig若包含TanStack Query,在同一个数组中添加配置:
extendsjs
import prettierRecommended from 'eslint-config-prettier'
import tanstackQuery from '@tanstack/eslint-plugin-query'
const eslintConfig = defineConfig([
{
extends: [
prettierRecommended,
tanstackQuery.configs.recommended
]
}
])
export default eslintConfig패키지 역할 참고
包作用说明
| 패키지 | 설명 |
|---|---|
| Prettier 코어 패키지 |
| ESLint와 Prettier의 충돌 방지 |
| Prettier 규칙을 ESLint 규칙으로 통합 |
| Tailwind CSS 클래스 자동 정렬 |
| TanStack Query 규칙 (TanStack Query 사용 시) |
| 包 | 说明 |
|---|---|
| Prettier核心包 |
| 避免ESLint与Prettier规则冲突 |
| 将Prettier规则整合为ESLint规则 |
| 自动排序Tailwind CSS类名 |
| TanStack Query规则(使用TanStack Query时启用) |
6단계: .prettierrc
第6步:配置.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"]
}7단계: .vscode/settings.json
第7步:配置.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"
}8단계: TanStack Query
第8步:配置TanStack Query
@tanstack/react-querypackage.jsonNext.js에서는 패키지를 추가로 설치해야 한다.
@tanstack/react-query-next-experimental-
패키지 설치:bash
{pm} install @tanstack/react-query @tanstack/react-query-next-experimental {pm} install -D @tanstack/eslint-plugin-query -
ESLint Flat Config()에 TanStack Query 플러그인 추가 (5단계 참조)
eslint.config.js -
생성:
src/providers/query.tsxtsx'use client' import { QueryClient, QueryClientProvider, isServer, } from '@tanstack/react-query' import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental' function makeQueryClient() { return new QueryClient({ defaultOptions: { queries: { // 클라이언트의 즉시 다시 요청에 대응하도록, 기본 캐싱 시간(min)을 지정 staleTime: 60 * 1000 } } }) } let browserQueryClient: QueryClient | undefined = undefined function getQueryClient() { if (isServer) { return makeQueryClient() } else { if (!browserQueryClient) browserQueryClient = makeQueryClient() return browserQueryClient } } export function QueryProvider({ children }: { children: React.ReactNode }) { const queryClient = getQueryClient() return ( <QueryClientProvider client={queryClient}> <ReactQueryStreamedHydration> {children} </ReactQueryStreamedHydration> </QueryClientProvider> ) } -
에서
src/app/layout.tsx로QueryProvider을 래핑:childrentsximport { QueryProvider } from '@/providers/query' export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( <html lang="ko"> <body> <QueryProvider>{children}</QueryProvider> </body> </html> ) }
若中不存在:
package.json@tanstack/react-queryNext.js环境下需要额外安装包。
@tanstack/react-query-next-experimental-
安装包:bash
{pm} install @tanstack/react-query @tanstack/react-query-next-experimental {pm} install -D @tanstack/eslint-plugin-query -
在ESLint Flat Config()中添加TanStack Query插件(参考第5步)
eslint.config.js -
创建:
src/providers/query.tsxtsx'use client' import { QueryClient, QueryClientProvider, isServer, } from '@tanstack/react-query' import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental' function makeQueryClient() { return new QueryClient({ defaultOptions: { queries: { // 适配客户端即时重发请求场景,设置默认缓存时间(分钟) staleTime: 60 * 1000 } } }) } let browserQueryClient: QueryClient | undefined = undefined function getQueryClient() { if (isServer) { return makeQueryClient() } else { if (!browserQueryClient) browserQueryClient = makeQueryClient() return browserQueryClient } } export function QueryProvider({ children }: { children: React.ReactNode }) { const queryClient = getQueryClient() return ( <QueryClientProvider client={queryClient}> <ReactQueryStreamedHydration> {children} </ReactQueryStreamedHydration> </QueryClientProvider> ) } -
在中用
src/app/layout.tsx包裹QueryProvider:childrentsximport { QueryProvider } from '@/providers/query' export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( <html lang="ko"> <body> <QueryProvider>{children}</QueryProvider> </body> </html> ) }
주의사항
注意事项
- 이미 존재하는 설정 파일은 덮어쓰지 않는다
- 기존 프로젝트 보완 모드에서는 질문 없이 자동으로 진행한다
- 패키지 매니저는 기존 프로젝트의 lock 파일로 판별한다:
- →
pnpm-lock.yamlpnpm - →
yarn.lockyarn - 또는
bun.lockb→bun.lockbun - 또는 lock 파일 없음 →
package-lock.jsonnpm
- 빈 디렉토리(스캐폴딩 모드)에서는 을 사용한다
npm
- 不会覆盖已存在的配置文件
- 现有项目补全模式下无需交互,自动执行
- 按照现有项目的lock文件判定包管理器:
- →
pnpm-lock.yamlpnpm - →
yarn.lockyarn - 或
bun.lockb→bun.lockbun - 或无lock文件 →
package-lock.jsonnpm
- 空目录(脚手架模式)下默认使用
npm