@kood/claude-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# Cloudflare 배포
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포](./index.md)
|
|
4
|
+
|
|
5
|
+
Cloudflare는 Workers와 Pages 두 가지 배포 옵션을 제공합니다.
|
|
6
|
+
|
|
7
|
+
## 배포 옵션 비교
|
|
8
|
+
|
|
9
|
+
| 옵션 | Preset | 특징 |
|
|
10
|
+
|------|--------|------|
|
|
11
|
+
| **Workers** | `cloudflare_module` | 서버리스 컴퓨팅, KV/D1 통합 |
|
|
12
|
+
| **Pages** | `cloudflare_pages` | 정적 사이트 + Functions |
|
|
13
|
+
|
|
14
|
+
## Cloudflare Workers
|
|
15
|
+
|
|
16
|
+
### 1. 패키지 설치
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
yarn add @cloudflare/vite-plugin wrangler -D
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Vite 설정 (직접 통합)
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// vite.config.ts
|
|
26
|
+
import { defineConfig } from 'vite'
|
|
27
|
+
import react from '@vitejs/plugin-react'
|
|
28
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
29
|
+
import { cloudflare } from '@cloudflare/vite-plugin'
|
|
30
|
+
|
|
31
|
+
export default defineConfig({
|
|
32
|
+
plugins: [
|
|
33
|
+
cloudflare({ viteEnvironment: { name: 'ssr' } }),
|
|
34
|
+
tanstackStart(),
|
|
35
|
+
react(),
|
|
36
|
+
],
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 3. Wrangler 설정
|
|
41
|
+
|
|
42
|
+
```jsonc
|
|
43
|
+
// wrangler.jsonc
|
|
44
|
+
{
|
|
45
|
+
"$schema": "node_modules/wrangler/config-schema.json",
|
|
46
|
+
"name": "my-tanstack-app",
|
|
47
|
+
"compatibility_date": "2025-01-01",
|
|
48
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
49
|
+
"main": "@tanstack/react-start/server-entry"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 4. 배포
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 빌드
|
|
57
|
+
yarn build
|
|
58
|
+
|
|
59
|
+
# 배포
|
|
60
|
+
wrangler deploy
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Cloudflare Pages
|
|
64
|
+
|
|
65
|
+
### 1. Nitro 설정
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// nitro.config.ts
|
|
69
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
70
|
+
|
|
71
|
+
export default defineNitroConfig({
|
|
72
|
+
preset: 'cloudflare_pages',
|
|
73
|
+
// Nitro v3 필수: Static Assets 지원을 위해 2024-09-19 이상 필요
|
|
74
|
+
compatibilityDate: '2024-09-19',
|
|
75
|
+
cloudflare: {
|
|
76
|
+
deployConfig: true, // wrangler.json 자동 생성
|
|
77
|
+
nodeCompat: true, // Node.js API 호환성
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2. Vite 설정 (Nitro 통합)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// vite.config.ts
|
|
86
|
+
import { defineConfig } from 'vite'
|
|
87
|
+
import react from '@vitejs/plugin-react'
|
|
88
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
89
|
+
import { nitro } from 'nitro/vite'
|
|
90
|
+
|
|
91
|
+
export default defineConfig({
|
|
92
|
+
plugins: [
|
|
93
|
+
tanstackStart(),
|
|
94
|
+
nitro(),
|
|
95
|
+
react(),
|
|
96
|
+
],
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 3. 배포
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 빌드
|
|
104
|
+
NITRO_PRESET=cloudflare_pages yarn build
|
|
105
|
+
|
|
106
|
+
# Pages 배포
|
|
107
|
+
wrangler pages deploy .output/public
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Wrangler 설정 상세
|
|
111
|
+
|
|
112
|
+
### wrangler.toml (Workers)
|
|
113
|
+
|
|
114
|
+
```toml
|
|
115
|
+
name = "my-app"
|
|
116
|
+
main = ".output/server/index.mjs"
|
|
117
|
+
compatibility_date = "2025-01-01"
|
|
118
|
+
compatibility_flags = ["nodejs_compat"]
|
|
119
|
+
|
|
120
|
+
[vars]
|
|
121
|
+
MY_VAR = "value"
|
|
122
|
+
|
|
123
|
+
[[kv_namespaces]]
|
|
124
|
+
binding = "MY_KV"
|
|
125
|
+
id = "your-kv-id"
|
|
126
|
+
|
|
127
|
+
[[d1_databases]]
|
|
128
|
+
binding = "DB"
|
|
129
|
+
database_name = "my-database"
|
|
130
|
+
database_id = "your-database-id"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### wrangler.toml (Pages)
|
|
134
|
+
|
|
135
|
+
```toml
|
|
136
|
+
name = "my-pages-app"
|
|
137
|
+
pages_build_output_dir = ".output/public"
|
|
138
|
+
compatibility_date = "2025-01-01"
|
|
139
|
+
compatibility_flags = ["nodejs_compat"]
|
|
140
|
+
|
|
141
|
+
[[d1_databases]]
|
|
142
|
+
binding = "DB"
|
|
143
|
+
database_name = "my-database"
|
|
144
|
+
database_id = "your-database-id"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## KV 스토리지 사용
|
|
148
|
+
|
|
149
|
+
### KV 네임스페이스 생성
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# KV 네임스페이스 생성
|
|
153
|
+
wrangler kv:namespace create "MY_KV"
|
|
154
|
+
|
|
155
|
+
# wrangler.toml에 바인딩 추가
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 코드에서 사용
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
// server/api/kv-example.ts
|
|
162
|
+
import { defineHandler } from 'nitro/h3'
|
|
163
|
+
|
|
164
|
+
export default defineHandler(async (event) => {
|
|
165
|
+
const env = event.context.cloudflare.env
|
|
166
|
+
|
|
167
|
+
// KV 읽기
|
|
168
|
+
const value = await env.MY_KV.get('key')
|
|
169
|
+
|
|
170
|
+
// KV 쓰기
|
|
171
|
+
await env.MY_KV.put('key', 'value')
|
|
172
|
+
|
|
173
|
+
return { value }
|
|
174
|
+
})
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## D1 데이터베이스 사용
|
|
178
|
+
|
|
179
|
+
### D1 데이터베이스 생성
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# 데이터베이스 생성
|
|
183
|
+
wrangler d1 create my-database
|
|
184
|
+
|
|
185
|
+
# 마이그레이션 실행
|
|
186
|
+
wrangler d1 migrations apply my-database
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 코드에서 사용
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// server/api/d1-example.ts
|
|
193
|
+
import { defineHandler } from 'nitro/h3'
|
|
194
|
+
|
|
195
|
+
export default defineHandler(async (event) => {
|
|
196
|
+
const env = event.context.cloudflare.env
|
|
197
|
+
|
|
198
|
+
// 쿼리 실행
|
|
199
|
+
const results = await env.DB.prepare(
|
|
200
|
+
'SELECT * FROM users WHERE id = ?'
|
|
201
|
+
).bind(1).all()
|
|
202
|
+
|
|
203
|
+
return results
|
|
204
|
+
})
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 환경변수 관리
|
|
208
|
+
|
|
209
|
+
### 로컬 개발
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
# .dev.vars 파일 생성
|
|
213
|
+
DATABASE_URL=your-local-url
|
|
214
|
+
API_SECRET=your-secret
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### 프로덕션
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# 시크릿 설정
|
|
221
|
+
wrangler secret put API_SECRET
|
|
222
|
+
|
|
223
|
+
# 일반 변수 (wrangler.toml)
|
|
224
|
+
[vars]
|
|
225
|
+
NODE_ENV = "production"
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 커스텀 도메인
|
|
229
|
+
|
|
230
|
+
### Pages
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# 커스텀 도메인 추가
|
|
234
|
+
wrangler pages project add-custom-domain my-app example.com
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Workers
|
|
238
|
+
|
|
239
|
+
Cloudflare 대시보드에서 설정하거나:
|
|
240
|
+
|
|
241
|
+
```toml
|
|
242
|
+
# wrangler.toml
|
|
243
|
+
routes = [
|
|
244
|
+
{ pattern = "example.com/*", zone_name = "example.com" }
|
|
245
|
+
]
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## 개발 서버
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# 로컬 개발 (Workers)
|
|
252
|
+
wrangler dev
|
|
253
|
+
|
|
254
|
+
# Pages 로컬 개발
|
|
255
|
+
wrangler pages dev .output/public
|
|
256
|
+
|
|
257
|
+
# 미니플레어 사용
|
|
258
|
+
wrangler dev --local
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## 트러블슈팅
|
|
262
|
+
|
|
263
|
+
### Node.js API 호환성
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
// nitro.config.ts
|
|
267
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
268
|
+
|
|
269
|
+
export default defineNitroConfig({
|
|
270
|
+
preset: 'cloudflare_pages',
|
|
271
|
+
compatibilityDate: '2024-09-19',
|
|
272
|
+
cloudflare: {
|
|
273
|
+
nodeCompat: true,
|
|
274
|
+
},
|
|
275
|
+
// 또는 특정 폴리필 설정
|
|
276
|
+
unenv: {
|
|
277
|
+
alias: {
|
|
278
|
+
'node:buffer': 'buffer',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
})
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 번들 크기 최적화
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
// nitro.config.ts
|
|
288
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
289
|
+
|
|
290
|
+
export default defineNitroConfig({
|
|
291
|
+
preset: 'cloudflare_pages',
|
|
292
|
+
compatibilityDate: '2024-09-19',
|
|
293
|
+
// 외부화할 패키지
|
|
294
|
+
externals: ['@prisma/client'],
|
|
295
|
+
// 트리 쉐이킹
|
|
296
|
+
minify: true,
|
|
297
|
+
})
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 로그 확인
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# 실시간 로그
|
|
304
|
+
wrangler tail
|
|
305
|
+
|
|
306
|
+
# 특정 배포 로그
|
|
307
|
+
wrangler tail --deployment-id [id]
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## CI/CD 설정
|
|
311
|
+
|
|
312
|
+
### GitHub Actions
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
name: Deploy to Cloudflare
|
|
316
|
+
|
|
317
|
+
on:
|
|
318
|
+
push:
|
|
319
|
+
branches: [main]
|
|
320
|
+
|
|
321
|
+
jobs:
|
|
322
|
+
deploy:
|
|
323
|
+
runs-on: ubuntu-latest
|
|
324
|
+
steps:
|
|
325
|
+
- uses: actions/checkout@v4
|
|
326
|
+
- uses: actions/setup-node@v4
|
|
327
|
+
with:
|
|
328
|
+
node-version: '20'
|
|
329
|
+
|
|
330
|
+
- run: yarn install
|
|
331
|
+
- run: yarn build
|
|
332
|
+
env:
|
|
333
|
+
NITRO_PRESET: cloudflare_pages
|
|
334
|
+
|
|
335
|
+
- uses: cloudflare/wrangler-action@v3
|
|
336
|
+
with:
|
|
337
|
+
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
338
|
+
command: pages deploy .output/public --project-name=my-app
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## 참고 자료
|
|
342
|
+
|
|
343
|
+
- [Cloudflare Workers 문서](https://developers.cloudflare.com/workers/)
|
|
344
|
+
- [Cloudflare Pages 문서](https://developers.cloudflare.com/pages/)
|
|
345
|
+
- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)
|
|
346
|
+
- [Nitro Cloudflare Preset](https://nitro.build/deploy/providers/cloudflare)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 배포 (Deployment)
|
|
2
|
+
|
|
3
|
+
> **Framework**: TanStack Start + Nitro
|
|
4
|
+
> **Source**: [Nitro Deployment](https://nitro.build/deploy), [TanStack Start Hosting](https://tanstack.com/start/latest/docs/framework/react/hosting)
|
|
5
|
+
|
|
6
|
+
TanStack Start는 Nitro를 배포 레이어로 사용하여 다양한 플랫폼에 배포할 수 있습니다.
|
|
7
|
+
|
|
8
|
+
## 문서 구조
|
|
9
|
+
|
|
10
|
+
- [Nitro 설정](./nitro.md) - Nitro 배포 레이어 기본 설정
|
|
11
|
+
- [Vercel](./vercel.md) - Vercel 배포 가이드
|
|
12
|
+
- [Cloudflare](./cloudflare.md) - Cloudflare Workers/Pages 배포
|
|
13
|
+
- [Railway](./railway.md) - Railway 배포 가이드
|
|
14
|
+
|
|
15
|
+
## 배포 옵션 비교
|
|
16
|
+
|
|
17
|
+
| 플랫폼 | Preset | Edge 지원 | 특징 |
|
|
18
|
+
|--------|--------|-----------|------|
|
|
19
|
+
| Vercel | `vercel` | ✅ | ISR, 자동 배포, Bun 런타임 |
|
|
20
|
+
| Cloudflare Pages | `cloudflare_pages` | ✅ | 글로벌 CDN, Workers 통합 |
|
|
21
|
+
| Cloudflare Workers | `cloudflare_module` | ✅ | 서버리스 컴퓨팅, KV 스토리지 |
|
|
22
|
+
| Railway | `node-server` | ❌ | Docker 지원, 간편한 설정 |
|
|
23
|
+
|
|
24
|
+
## 빠른 시작
|
|
25
|
+
|
|
26
|
+
### 1. Nitro 플러그인 설치
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
yarn add nitro
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. Vite 설정
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// vite.config.ts
|
|
36
|
+
import { defineConfig } from 'vite'
|
|
37
|
+
import react from '@vitejs/plugin-react'
|
|
38
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
39
|
+
import { nitro } from 'nitro/vite'
|
|
40
|
+
|
|
41
|
+
export default defineConfig({
|
|
42
|
+
plugins: [
|
|
43
|
+
tanstackStart(),
|
|
44
|
+
nitro(),
|
|
45
|
+
react(),
|
|
46
|
+
],
|
|
47
|
+
})
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 3. Nitro 설정
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// nitro.config.ts
|
|
54
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
55
|
+
|
|
56
|
+
export default defineNitroConfig({
|
|
57
|
+
preset: 'vercel', // 또는 cloudflare_pages, node-server 등
|
|
58
|
+
// Nitro v3 필수: Cloudflare Static Assets 지원을 위해 2024-09-19 이상 필요
|
|
59
|
+
compatibilityDate: '2024-09-19',
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 4. 빌드 및 배포
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# 빌드
|
|
67
|
+
yarn build
|
|
68
|
+
|
|
69
|
+
# 또는 환경변수로 preset 지정
|
|
70
|
+
NITRO_PRESET=vercel yarn build
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Preset 선택 가이드
|
|
74
|
+
|
|
75
|
+
### Edge 런타임이 필요한 경우
|
|
76
|
+
- **Vercel**: `vercel` (Edge Functions 자동 지원)
|
|
77
|
+
- **Cloudflare**: `cloudflare_pages` 또는 `cloudflare_module`
|
|
78
|
+
|
|
79
|
+
### Node.js 서버가 필요한 경우
|
|
80
|
+
- **Railway**: `node-server`
|
|
81
|
+
- **기타 Node.js 호스팅**: `node-server`
|
|
82
|
+
|
|
83
|
+
### 정적 사이트 생성 (SSG)
|
|
84
|
+
- **정적 호스팅**: `static`
|
|
85
|
+
|
|
86
|
+
## 환경변수
|
|
87
|
+
|
|
88
|
+
모든 플랫폼에서 공통으로 사용하는 환경변수:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 빌드 시 preset 지정
|
|
92
|
+
NITRO_PRESET=vercel
|
|
93
|
+
|
|
94
|
+
# 런타임 환경변수
|
|
95
|
+
DATABASE_URL=postgresql://...
|
|
96
|
+
API_SECRET=your-secret-key
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 참고 자료
|
|
100
|
+
|
|
101
|
+
- [Nitro 공식 문서](https://nitro.build)
|
|
102
|
+
- [TanStack Start Hosting](https://tanstack.com/start/latest/docs/framework/react/hosting)
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Nitro 배포 레이어
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [배포](./index.md)
|
|
4
|
+
|
|
5
|
+
Nitro는 TanStack Start의 배포 레이어로, 다양한 플랫폼에 대한 preset을 제공합니다.
|
|
6
|
+
|
|
7
|
+
## 설치
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
yarn add nitro
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Vite 통합
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// vite.config.ts
|
|
17
|
+
import { defineConfig } from 'vite'
|
|
18
|
+
import react from '@vitejs/plugin-react'
|
|
19
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
20
|
+
import { nitro } from 'nitro/vite'
|
|
21
|
+
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
plugins: [
|
|
24
|
+
tanstackStart(),
|
|
25
|
+
nitro(),
|
|
26
|
+
react(),
|
|
27
|
+
],
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Nitro 설정
|
|
32
|
+
|
|
33
|
+
### nitro.config.ts
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { defineNitroConfig } from 'nitro/config'
|
|
37
|
+
|
|
38
|
+
export default defineNitroConfig({
|
|
39
|
+
// 배포 플랫폼 preset
|
|
40
|
+
preset: 'vercel',
|
|
41
|
+
|
|
42
|
+
// 호환성 설정 (Nitro v3 필수)
|
|
43
|
+
compatibilityDate: '2024-09-19',
|
|
44
|
+
})
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 환경변수로 Preset 지정
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 빌드 시 환경변수로 지정
|
|
51
|
+
NITRO_PRESET=cloudflare_pages yarn build
|
|
52
|
+
|
|
53
|
+
# 또는 CLI 옵션
|
|
54
|
+
nitro build --preset cloudflare_pages
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 주요 Preset 목록
|
|
58
|
+
|
|
59
|
+
### 서버리스/Edge
|
|
60
|
+
|
|
61
|
+
| Preset | 플랫폼 | 설명 |
|
|
62
|
+
|--------|--------|------|
|
|
63
|
+
| `vercel` | Vercel | Vercel Functions |
|
|
64
|
+
| `cloudflare_pages` | Cloudflare | Pages Functions |
|
|
65
|
+
| `cloudflare_module` | Cloudflare | Workers Module |
|
|
66
|
+
| `netlify` | Netlify | Netlify Functions |
|
|
67
|
+
| `aws_lambda` | AWS | Lambda Functions |
|
|
68
|
+
|
|
69
|
+
### Node.js 서버
|
|
70
|
+
|
|
71
|
+
| Preset | 플랫폼 | 설명 |
|
|
72
|
+
|--------|--------|------|
|
|
73
|
+
| `node-server` | 범용 | Node.js HTTP 서버 |
|
|
74
|
+
| `node-cluster` | 범용 | 클러스터 모드 |
|
|
75
|
+
| `bun` | Bun | Bun 런타임 |
|
|
76
|
+
| `deno_deploy` | Deno | Deno Deploy |
|
|
77
|
+
|
|
78
|
+
### 정적/기타
|
|
79
|
+
|
|
80
|
+
| Preset | 플랫폼 | 설명 |
|
|
81
|
+
|--------|--------|------|
|
|
82
|
+
| `static` | 범용 | 정적 사이트 생성 |
|
|
83
|
+
| `github_pages` | GitHub | GitHub Pages |
|
|
84
|
+
| `render_com` | Render | Render.com |
|
|
85
|
+
|
|
86
|
+
## 출력 구조
|
|
87
|
+
|
|
88
|
+
빌드 후 `.output/` 디렉토리에 생성되는 파일:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
.output/
|
|
92
|
+
├── server/
|
|
93
|
+
│ └── index.mjs # 서버 엔트리포인트
|
|
94
|
+
├── public/
|
|
95
|
+
│ └── ... # 정적 파일
|
|
96
|
+
└── nitro.json # Nitro 설정
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 런타임 설정
|
|
100
|
+
|
|
101
|
+
### Node.js 호환성
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// nitro.config.ts
|
|
105
|
+
export default defineNitroConfig({
|
|
106
|
+
preset: 'cloudflare_pages',
|
|
107
|
+
cloudflare: {
|
|
108
|
+
nodeCompat: true, // Node.js API 호환성
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 외부 패키지 처리
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// nitro.config.ts
|
|
117
|
+
export default defineNitroConfig({
|
|
118
|
+
// 번들에서 제외할 패키지
|
|
119
|
+
externals: ['pg', 'mysql2'],
|
|
120
|
+
|
|
121
|
+
// 번들에 포함할 패키지
|
|
122
|
+
inlineDependencies: ['my-esm-package'],
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 라우트 규칙
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// nitro.config.ts
|
|
130
|
+
export default defineNitroConfig({
|
|
131
|
+
routeRules: {
|
|
132
|
+
// 정적 페이지 캐싱
|
|
133
|
+
'/': { prerender: true },
|
|
134
|
+
|
|
135
|
+
// ISR (Incremental Static Regeneration)
|
|
136
|
+
'/products/**': {
|
|
137
|
+
isr: {
|
|
138
|
+
expiration: 60, // 60초
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// API 라우트 설정
|
|
143
|
+
'/api/**': {
|
|
144
|
+
cors: true,
|
|
145
|
+
headers: {
|
|
146
|
+
'Access-Control-Allow-Origin': '*',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
})
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 환경변수 관리
|
|
154
|
+
|
|
155
|
+
### .env 파일
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# .env.production
|
|
159
|
+
DATABASE_URL=postgresql://...
|
|
160
|
+
API_SECRET=your-secret-key
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 런타임에서 사용
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// server/api/example.ts
|
|
167
|
+
import { defineHandler } from 'nitro/h3'
|
|
168
|
+
|
|
169
|
+
export default defineHandler(() => {
|
|
170
|
+
const dbUrl = process.env.DATABASE_URL
|
|
171
|
+
// ...
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 빌드 명령어
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# 개발 서버
|
|
179
|
+
yarn dev
|
|
180
|
+
|
|
181
|
+
# 프로덕션 빌드
|
|
182
|
+
yarn build
|
|
183
|
+
|
|
184
|
+
# 빌드 결과 미리보기
|
|
185
|
+
yarn preview
|
|
186
|
+
|
|
187
|
+
# 특정 preset으로 빌드
|
|
188
|
+
NITRO_PRESET=vercel yarn build
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## 디버깅
|
|
192
|
+
|
|
193
|
+
### 빌드 로그 확인
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# 상세 로그 출력
|
|
197
|
+
DEBUG=nitro:* yarn build
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 출력 검사
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# 빌드 후 출력 확인
|
|
204
|
+
ls -la .output/server/
|
|
205
|
+
cat .output/nitro.json
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## 참고 자료
|
|
209
|
+
|
|
210
|
+
- [Nitro 공식 문서](https://nitro.build)
|
|
211
|
+
- [Nitro Preset 목록](https://nitro.build/deploy)
|