🌀 ToneTwist 五轮迭代演进

从 250 行极简原型到产品级 Web 应用——每次提交都是一次能力跃升

📅 2025年5月🛠 DeepSeek API 🎨 Tailwind CSS🔐 Supabase BaaS📦 单文件架构
5
迭代版本
250→1099
代码行数
5→20+
功能模块数
5→7
预设风格
+340%
总增量 (v1→v5)
📜 五轮迭代时间线
V1.0 · 原型版2025-05-05

🌑 纯暗色 · 概念验证

单一暗色硬编码主题,5 种风格按钮,一个输入框一个输出框。通过 Node.js 代理转发 DeepSeek API 解决 CORS。仅有基础的 fetch 错误判断。代码 250 行,但已是功能完整的 MVP。

Tailwind CDN5 风格CORS代理单文件暗色唯一
V2.0 · 主题版2025-05-11

☀️🌙 亮暗双主题 + 创意控制

引入 CSS 自定义属性实现亮/暗主题切换,依系统偏好自动选择。风格从 5 种扩展到 7 种(+武侠 +赛博朋克)。首创创意程度滑块(忠实原意 ↔ 最大趣味),temperature 0.3~1.2 动态映射。新增原文/译文对比视图、结果操作按钮组、随机风格、自定义风格、报告错误。

CSS变量7风格创意滑块对比视图随机+自定义localStorage
V3.0 · 品牌版2025-05-11

🔍 品牌定型 + SEO + 历史记录

产品正式更名为 ToneTwist,建立品牌标识。首度引入 SEO 体系(meta description / keywords / robots / canonical)。实现完整的本地历史记录面板:自动保存每次转换、渲染列表、点击回填原文、清空操作、50 条防溢出。

ToneTwist 品牌SEO历史面板escapeHtml数据持久化
V4.0 · 商业版2025-05-14

🔐 用户系统 + 商业化闭环

集成 Supabase BaaS:邮箱注册登录 + GitHub OAuth。引入每日免费额度控制(3 次/天)与三档定价(免费 / 进阶 ¥9.9/月 / 学生 ¥4.9/月),支付宝/微信支付弹窗。新增云端历史同步、社区作品墙、风格投票、点赞/点踩反馈、隐私政策弹窗、ARIA 无障碍。代码膨胀至 1358 行

SupabaseGitHub OAuth定价3档支付弹窗社区ARIA
V5.0 · 终极版2025-05-28

🎨 设计令牌重构 · 工程化精简

全面重构 CSS 为统一设计令牌体系(--bg/--surface/--border/--text/--muted/--accent/--gold)。字体升级为 Noto Serif SC(正文)+ JetBrains Mono(界面)。新增 CSS 工具提示、可折叠面板、动画系统、自定义滚动条、徽章体系。代码 逆势精简 19%(1358→1099 行),功能完整度不变。

设计令牌Noto Serif SCCSS工具提示折叠面板代码-19%
🎨 代码对比:主题系统演进
/* V1: 一切硬编码,只支持暗色 */ body { font-family: 'Inter', sans-serif; background: #0b0b0f; } .glass-panel { background: rgba(18,22,30,0.85); border: 1px solid rgba(120,80,220,0.15); } .vibe-btn { background: rgba(30,35,45,0.7); } .vibe-btn.active { background: #7e22ce; } ❌ 无日间模式 · 颜色硬编码 · 改配色要逐行替换
/* V2: CSS变量诞生 — 值耦合在变量名里 */ :root { --bg: #f8fafc; --glass-bg: rgba(255,255,255,0.8); --text-primary: #1e293b; --btn-bg: #f1f5f9; } .dark { --bg: #0b0b0f; --glass-bg: rgba(18,22,30,0.85); --text-primary: #f1f5f9; --btn-bg: rgba(30,35,45,0.7); } body { background: var(--bg); color: var(--text-primary); } ✅ 可切换 · ⚠️ 变量含UI语义(glass-bg) · 不够抽象
/* V3: 变量体系无变化,代码量温和增长 */ /* 与V2相同结构,品牌更名为ToneTwist */ :root { --bg: #f8fafc; --glass-bg: rgba(255,255,255,0.8); /* ... */ } /* V3焦点:非CSS而是品牌定型 + SEO + 历史记录 */ /* 650行,增量全部在HTML结构层和JS逻辑 */
/* V4: 变量数量膨胀 — 新增大量业务专用变量 */ :root { --bg: #f8fafc; /* ... 与V2/V3继承相同 */ } /* 但CSS整体膨胀 — 大量inline style + 重复属性组合 .compare-box / .auth-input / .history-panel .vote-item / .price-card / .pay-tab 每个子组件独立写border/background/padding/margin 没有形成可复用的组件级class */ ⚠️ 1358行 · CSS和inline混用 · 维护成本高
/* V5: 设计令牌体系 — 语义化抽象,一处定义全局复用 */ :root { --bg: #f5f3ef; /* 纸张底色 · 暖色系 */ --surface: #fdfcfa; /* 卡片表面 */ --border: #e8e3da; /* 统一边框 */ --text: #1c1a17; /* 主文本 */ --muted: #7a7468; /* 辅助文本 */ --accent: #6b4fff; /* 品牌紫 */ --accent-2: #ff6b6b; /* 强调红 */ --gold: #c8a84b; /* 金色点缀 */ --radius: 16px; --shadow: 0 2px 24px rgba(0,0,0,0.06); } .dark { --bg: #0f0e0d; --surface: #1a1916; --border: #2d2b27; } /* 通用组件 — 全站统一 */ .card { background:var(--surface); border:1px solid var(--border); } .btn-primary{ background:var(--accent); } .btn-ghost { border:1px solid var(--border); } .badge-purple{ background:rgba(107,79,255,.12); } ✅ 语义清晰 · 全局一致 · 易维护 · 代码-19%
代码对比:API 调用健壮性
// V1: 基础fetch,固定参数,粗粒度错误 async function callAI(content, vibe) { const response = await fetch(API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${API_KEY}` }, body: JSON.stringify({ model: 'deepseek-chat', messages: [{role:'system',content:buildSystemPrompt(vibe)}, {...}], temperature: 0.9, // 固定 max_tokens: 1000 // 固定 }) }); if (!response.ok) throw new Error('请求失败'); return (await response.json()).choices[0].message.content; }
// V2: 温度动态化 + token上限提升 async function callAI(content, vibe, creativity) { const temperature = 0.3 + (creativity / 100) * 0.9; const response = await fetch(API_URL, { // ... body: JSON.stringify({ temperature: temperature, // 0.3~1.2 动态 max_tokens: 1200 // +20% }) }); }
/* V3: API层无结构性变化 */ // V3 的品牌/SEO/历史记录变更不涉及API调用层 // 函数签名和错误处理保持V2模式 async function callAI(content, vibe, creativity) { // ...同V2结构 }
// V4: HTTP状态码分类 + 动态max_tokens if (!response.ok) { let errorMsg = `请求失败 (${response.status})`; if (response.status === 429) errorMsg = '请求太频繁,请稍后重试'; else if (response.status === 401) errorMsg = 'API Key 无效'; else if (response.status >= 500) errorMsg = '服务器繁忙'; throw new Error(errorMsg); } max_tokens: Math.min(2000, Math.max(300, Math.ceil(content.length * 2.5)))
// V5: AbortController超时 + 网络异常 + prompt精简 async function callAI(content, vibe, creativity) { const controller = new AbortController(); const tid = setTimeout(() => controller.abort(), 30000); try { const res = await fetch(API_URL, { // ... signal: controller.signal // ← 30s 超时 }); clearTimeout(tid); // ... 状态码分类同V4 + prompt长度缩减40% } catch(e) { clearTimeout(tid); // ← 防止Timer泄漏 if (e.name === 'AbortError') throw new Error('请求超时,请重试'); if (e.message.includes('fetch')) throw new Error('网络连接失败'); throw e; } }
📊 功能矩阵全对比(24维度 × 5版本)
功能维度 V1 · 原型V2 · 主题 V3 · 品牌V4 · 商业V5 · 终极
🎨 视觉 & 体验
亮暗主题CSS变量设计令牌
预设风格数57777
创意程度滑块
自定义风格
随机风格
CSS工具提示
折叠面板
CSS动画fadeUp/spin
字体体系InterInterInterInterSerif+Mono
主题色系暗紫单色紫/蓝紫/蓝紫/蓝/绿/黄暖纸张系
📝 结果操作
原文/结果对比
复制结果
重写/分享链接
原意保留提示
字数统计
点赞/点踩
错误报告基础✓ 邮件
🔍 SEO & 品牌
SEO meta/OG✓ 完整
品牌名称氛围学习VibeTextToneTwistToneTwistToneTwist
sitemap/robots
🔐 账号系统
用户注册/登录
GitHub OAuth
本地历史记录
云端历史(DB)
💳 商业化
每日额度控制✓ 3次✓ 3次
升级定价3档3档
支付弹窗QR码精简
🏆 社区 & 隐私
作品墙
风格投票
隐私政策✓ 弹窗✓ 弹窗
🛡️ 工程品质
API错误分类HTTP状态码+超时+网络
API超时保护30s Abort
ARIA无障碍
代码行数25056765013581099 (−19%)
文件数21131
🏗️ 架构演进一览
📦 V1 · 极简单体
文件: 2 (HTML + Node代理)
架构: 前端 → Node代理 → DeepSeek API
状态: DOM变量
持久化:
依赖: Tailwind CDN
亮点: 最小可行产品
瓶颈: 需本地跑代理
🎨 V2 · 增强单体
文件: 1 (纯前端)
架构: 前端 → CF Worker → DeepSeek
状态: DOM + localStorage
持久化: localStorage(主题)
依赖: Tailwind CDN
亮点: 去代理,主题,创意控制
瓶颈: 无后端持久化
🔍 V3 · 品牌单体
文件: 1
架构: 同V2
状态: DOM + localStorage
持久化: localStorage(历史)
依赖: Tailwind CDN
亮点: 品牌+SEO+历史面板
瓶颈: 仍无后端/用户系统
🔐 V4 · 商业全栈
文件: 3 (+robots +sitemap)
架构: 前端 → CF Worker → DeepSeek
前端 → Supabase(认证+DB)
状态: DOM + localStorage + Supabase
依赖: Tailwind + Supabase SDK
亮点: 用户系统,支付闭环
瓶颈: 代码膨胀,样式混乱
✨ V5 · 精炼工程
文件: 1 (恢复单文件)
架构: 同V4 + JS分区注释
状态: DOM + localStorage + Supabase
持久化: localStorage + DB
依赖: Tailwind + Supabase SDK
亮点: 设计令牌,代码−19%
可改进: 前端Key暴露
💡 五轮迭代核心突破
🌑→☀️🌙→🎨

主题系统三级跳

V1 硬编码暗色 → V2 CSS变量明暗切换 → V5 设计令牌语义化体系。从「写死值」到「全局设计系统」的完整跨越。

📛

品牌定名

V3 将产品从「氛围学习」确定为 ToneTwist,沿用至今。品牌统一是产品化的第一步。

🔐

从单用户到多租户

V4 引入 Supabase BaaS,实现邮箱注册登录、GitHub OAuth、云端历史同步——从工具到平台的质变。

💳

商业化闭环

V4 实现完整 freemium 模型:每日免费额度 → 三档定价 → 支付宝/微信支付弹窗 → 学生优惠。

🧹

代码逆势精简 19%

V5 在不减功能的前提下,通过设计令牌 + 组件类化 + 合并冗余,将 1358 行精炼为 1099 行。

🔍

SEO 从零到完善

V3 起建立 SEO 基础,V4 补齐 sitemap.xml + robots.txt。品牌关键词覆盖完整。

🎛️

创意控制精细化

V2 首创创意滑块:0%=严格忠实 → 50%=中等 → 100%=最大趣味,temperature 0.3~1.2 动态映射 + 5 档 prompt 微调。

🛡️

API 可靠性五级进化

V1 无保护 → V2 参数动态 → V4 HTTP状态码分类 → V5 AbortController 30s超时 + 网络异常独立捕获。

📜

历史记录:从无到双轨

V3 首次实现本地历史(localStorage),V4 升级为本地+Supabase云端双轨,未登录/已登录场景全覆盖。