使用 Cloudflare Workers 和 KV 构建在线 Todo 应用
目录
本文介绍如何使用 Cloudflare Workers 和 KV 存储构建一个无服务器的在线 Todo 应用。这是继 Google Drive 列表应用之后的又一个 Cloudflare Workers 实践项目。
一、项目概述
1.1 技术栈
- Cloudflare Workers:提供无服务器运行环境
- Workers KV:键值存储系统
- HTML/CSS/JavaScript:前端界面
1.2 功能特点
- 无需传统服务器
- 全球边缘部署
- 低延迟响应
- 高可用性
二、环境准备
2.1 必要条件
-
Cloudflare 账户
- 免费账户即可
- 需要验证邮箱
-
Wrangler CLI 工具
npm install -g @cloudflare/wrangler
-
API 密钥
- 登录 Cloudflare 控制台
- 生成 API Token
- 设置适当的权限
2.2 项目初始化
# 创建新项目
wrangler generate todo-app
# 配置 wrangler.toml
name = "todo-app"
type = "webpack"
account_id = "your-account-id"
workers_dev = true
三、实现核心功能
3.1 配置 KV 存储
# wrangler.toml
kv_namespaces = [
{ binding = "TODO_STORE", id = "your-kv-namespace-id" }
]
3.2 数据写入操作
async function createTodo(request) {
const body = await request.json();
const id = Date.now().toString();
await TODO_STORE.put(id, JSON.stringify({
id,
text: body.text,
completed: false
}));
return new Response(JSON.stringify({ success: true }), {
headers: { 'Content-Type': 'application/json' }
});
}
3.3 数据读取操作
async function getTodos() {
const list = await TODO_STORE.list();
const todos = await Promise.all(
list.keys.map(async key => {
const value = await TODO_STORE.get(key.name);
return JSON.parse(value);
})
);
return new Response(JSON.stringify(todos), {
headers: { 'Content-Type': 'application/json' }
});
}
四、构建用户界面
4.1 HTML 结构
<!DOCTYPE html>
<html>
<head>
<title>Todo App</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>Todo List</h1>
<form id="todo-form">
<input type="text" id="todo-input" placeholder="添加新任务...">
<button type="submit">添加</button>
</form>
<ul id="todo-list"></ul>
</div>
<script src="app.js"></script>
</body>
</html>
4.2 样式设计
.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.todo-item {
display: flex;
align-items: center;
padding: 10px;
border-bottom: 1px solid #eee;
}
.todo-item.completed {
text-decoration: line-through;
color: #888;
}
4.3 交互实现
document.getElementById('todo-form').addEventListener('submit', async (e) => {
e.preventDefault();
const input = document.getElementById('todo-input');
const text = input.value.trim();
if (text) {
await createTodo({ text });
input.value = '';
await updateTodoList();
}
});
async function updateTodoList() {
const todos = await getTodos();
const list = document.getElementById('todo-list');
list.innerHTML = todos.map(todo => `
<li class="todo-item ${todo.completed ? 'completed' : ''}">
<input type="checkbox" ${todo.completed ? 'checked' : ''}>
<span>${todo.text}</span>
<button onclick="deleteTodo('${todo.id}')">删除</button>
</li>
`).join('');
}
五、部署和测试
5.1 部署步骤
# 发布到 Cloudflare Workers
wrangler publish
# 查看部署状态
wrangler tail
5.2 测试要点
- 添加新任务
- 标记完成状态
- 删除任务
- 数据持久化
- 性能测试
六、优化建议
6.1 性能优化
- 实现任务缓存
- 批量操作优化
- 减少 API 调用
6.2 功能扩展
- 添加任务分类
- 实现任务提醒
- 支持多用户
- 数据导出功能