# Deno 实战项目蓝图

这里不是只展示 “Hello World”，而是给出能逐步实现、测试和部署的项目骨架。先完成垂直切片，再添加功能。

## 1. [Fresh 博客](/docs/projects/fresh-blog)

```text
fresh-blog/
├── routes/posts/[slug].tsx
├── routes/admin/posts.tsx
├── islands/PostEditor.tsx
├── components/
├── src/db/{client,schema}.ts
└── deno.json
```

技术：Fresh 2 + PostgreSQL + Drizzle。第一阶段只做文章列表、详情和受保护的创建接口；第二阶段才加 Markdown、草稿、图片与搜索。

验收：无 JavaScript 时文章可阅读；slug 唯一约束生效；编辑 island 之外没有多余 hydration；migration 在独立发布步骤运行。

## 2. [Deno MCP Server](/docs/projects/mcp-server-project)

```text
mcp-project/
├── main.ts
├── tools/{search,read}.ts
├── schemas.ts
├── fixtures/
└── deno.json
```

从 stdio 和只读 tool 开始。使用 Zod 校验参数、fixtures 做协议测试，再决定是否增加 Streamable HTTP、认证与写操作。参考 [MCP Server 教程](/docs/ai/mcp-server)。

## 3. [Cron 服务](/docs/projects/cron-service)

```text
cron-service/
├── jobs/daily-report.ts
├── services/report.ts
├── main.ts
└── deno.json
```

把 job 逻辑写成普通可测试函数，再由 `Deno.cron()` 触发。任务必须幂等，使用数据库唯一键或 execution key 防止重复副作用，并为延迟、失败和补跑提供观测入口。

## 4. [图片处理 API](/docs/projects/image-api)

```text
image-api/
├── routes/transform.ts
├── services/image.ts
├── storage.ts
└── main.ts
```

用 Hono + `npm:sharp` 接收受限尺寸的图片，验证 MIME 与像素上限，转换后写入对象存储。`sharp` 涉及原生依赖，部署前必须在目标 Deno 版本和容器/Deploy 环境做 smoke test。

## 每个项目共用的完成标准

- `deno fmt --check && deno lint && deno check && deno test` 全部通过；
- `deno.lock` 提交，安装脚本有显式 allowlist；
- 开发、迁移、测试和线上进程分别使用最小权限；
- health check、结构化日志、超时、错误映射和 secret 管理已接入；
- README 写明本地启动、数据库准备、部署与回滚。
