<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>小傲博客</title><description>技术 · 设计 · 生活</description><link>https://xiaoao-blog-firefly.pages.dev/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.6</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月7日 00:37:38</lastBuildDate><item><title>你好，我是一名能把产品完整做出来的全栈开发者</title><link>https://xiaoao-blog-firefly.pages.dev/posts/full-stack-developer-portfolio-intro/</link><guid isPermaLink="true">https://xiaoao-blog-firefly.pages.dev/posts/full-stack-developer-portfolio-intro/</guid><description>一份不堆关键词的自我介绍：我如何从需求、UI、前后端到部署，独立完成一个可运行、可维护的 Web 产品。</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;我能解决什么问题&lt;a href=&quot;#我能解决什么问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我希望应聘的是一份需要独立完成前后端开发、网页建设和 UI 设计的工作。相比只列出会用哪些框架，我更愿意用这个博客证明：我能把一个想法拆成页面、数据、接口和部署方案，并把它真正交付。&lt;/p&gt;&lt;p&gt;这个站点不是静态模板。它包含 React 服务端渲染、内容管理、富文本编辑、身份认证、评论、搜索、缓存、媒体管理和后台控制台，运行在 Cloudflare Workers、D1、KV 与 R2 之上。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;我的工作方式&lt;a href=&quot;#我的工作方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;先明确用户目标与核心流程，再确定信息架构和页面层级。&lt;/li&gt;
&lt;li&gt;建立可复用的视觉规范，让颜色、字体、间距和组件保持一致。&lt;/li&gt;
&lt;li&gt;把业务逻辑、数据访问和界面分层，避免功能增长后代码失控。&lt;/li&gt;
&lt;li&gt;通过类型检查、自动化测试和真实浏览器验收保证交付质量。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;这个博客证明了什么&lt;a href=&quot;#这个博客证明了什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前端方面，我能处理响应式布局、主题切换、交互状态、表单、富文本和可访问性；后端方面，我能设计 API、数据库模型、权限中间件、缓存和异步任务；工程方面，我会考虑错误处理、日志、测试、配置和上线后的维护成本。&lt;/p&gt;&lt;p&gt;后续文章会继续拆解这个项目的架构、UI 设计和数据层实现。这里展示的不是练习题，而是一套可以继续迭代的真实产品。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从能运行到可维护：全栈项目的质量保障清单</title><link>https://xiaoao-blog-firefly.pages.dev/posts/full-stack-project-quality-checklist/</link><guid isPermaLink="true">https://xiaoao-blog-firefly.pages.dev/posts/full-stack-project-quality-checklist/</guid><description>类型、错误、测试、日志、缓存与部署不是收尾工作，而是独立交付软件时必须完成的产品能力。</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;功能完成不等于项目完成&lt;a href=&quot;#功能完成不等于项目完成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一个页面在本机打开，只能证明 happy path 暂时可用。真正的交付还要面对非法输入、网络失败、重复请求、权限差异、数据迁移和上线后的故障定位。独立开发意味着这些问题也必须由我负责。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;类型与边界&lt;a href=&quot;#类型与边界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;项目使用 TypeScript 与 Zod 同时约束编译期和运行时数据。API 输入先校验，服务层使用 Result 返回可预期业务错误，数据库访问集中在 data 层。这样能让错误尽早暴露，也能避免界面、业务和 SQL 互相渗透。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;测试策略&lt;a href=&quot;#测试策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;工具函数使用单元测试覆盖边界条件。&lt;/li&gt;
&lt;li&gt;文章、标签、评论等核心流程使用 D1 集成测试。&lt;/li&gt;
&lt;li&gt;发布前运行类型检查、lint、格式检查和生产构建。&lt;/li&gt;
&lt;li&gt;关键页面进行桌面与移动端浏览器验收。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;可观测性与性能&lt;a href=&quot;#可观测性与性能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;结构化 JSON 日志记录错误类型和上下文，便于在 Workers Observability 中搜索。缓存采用 CDN、KV、D1 多层策略，并通过版本化 key 处理失效。内容发布时预生成公开快照，将高亮等计算从读取链路移到写入链路。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;上线前检查清单&lt;a href=&quot;#上线前检查清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;环境变量是否完整且没有把密钥打进客户端包。&lt;/li&gt;
&lt;li&gt;数据库迁移是否可重复执行并有备份与回滚方案。&lt;/li&gt;
&lt;li&gt;错误页、空状态、权限拒绝和限流反馈是否可理解。&lt;/li&gt;
&lt;li&gt;SEO、站点地图、RSS、响应式和基础可访问性是否通过检查。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最后&lt;a href=&quot;#最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我理解的独立开发，不是一个人写完所有代码，而是能对完整结果负责：知道哪里可能坏、如何验证、如何观察，以及出现问题时如何恢复。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>UI 不只是好看：我设计博客界面时做的 7 个决定</title><link>https://xiaoao-blog-firefly.pages.dev/posts/blog-ui-design-seven-decisions/</link><guid isPermaLink="true">https://xiaoao-blog-firefly.pages.dev/posts/blog-ui-design-seven-decisions/</guid><description>从视觉层级、排版、响应式到交互反馈，说明如何让一个内容型网站既有审美又真正好用。</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;设计目标先于装饰&lt;a href=&quot;#设计目标先于装饰&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;博客的核心任务是阅读和发现内容，所以视觉设计不能抢走文章本身的注意力。我把目标定为：信息层级清楚、长文阅读舒适、移动端操作自然，同时保留足够鲜明的个人气质。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七个具体决定&lt;a href=&quot;#七个具体决定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;限制正文宽度和行长，降低长时间阅读的视线移动成本。&lt;/li&gt;
&lt;li&gt;用字体大小、字重和留白建立层级，而不是依赖大量边框。&lt;/li&gt;
&lt;li&gt;同时设计浅色与深色主题，并确保颜色语义在两种主题中一致。&lt;/li&gt;
&lt;li&gt;把按钮的 hover、focus、disabled 和 loading 当作完整组件状态处理。&lt;/li&gt;
&lt;li&gt;移动端优先保留主要动作，把次要操作收进菜单或折叠区域。&lt;/li&gt;
&lt;li&gt;为空数据、加载、失败和成功分别设计明确反馈。&lt;/li&gt;
&lt;li&gt;使用统一的设计 token 管理颜色、圆角、阴影和间距，避免页面各自发挥。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;功能性如何被验证&lt;a href=&quot;#功能性如何被验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;审美判断之外，我会检查键盘导航、焦点可见性、文字对比度、点击区域和不同宽度下的布局。真实浏览器测试能发现只看代码看不到的问题，例如标题换行、弹层遮挡、滚动位置和触摸设备上的交互冲突。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;设计与开发一体化的优势&lt;a href=&quot;#设计与开发一体化的优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当同一个人理解产品目标、设计约束和实现成本时，可以更快找到兼顾效果与维护性的方案。组件不是截图的翻译，而是可复用、可扩展、能覆盖真实状态的产品单元。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>我如何用 Cloudflare Workers 搭建一个完整的全栈博客</title><link>https://xiaoao-blog-firefly.pages.dev/posts/cloudflare-workers-full-stack-blog-architecture/</link><guid isPermaLink="true">https://xiaoao-blog-firefly.pages.dev/posts/cloudflare-workers-full-stack-blog-architecture/</guid><description>从 SSR、API、D1 数据库到 KV 缓存与 R2 媒体存储，拆解一个边缘全栈项目的架构选择。</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;为什么选择边缘全栈&lt;a href=&quot;#为什么选择边缘全栈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;个人博客看似简单，但一旦加入后台、登录、评论、搜索和图片管理，就变成了一个完整 Web 产品。我选择 Cloudflare Workers 作为运行环境，是因为它能让页面渲染、API 和数据服务靠近用户，同时减少传统服务器的运维负担。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;系统分层&lt;a href=&quot;#系统分层&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;页面层使用 TanStack Start 与 React 19 负责 SSR、路由和交互；Hono 承担 API 网关；业务逻辑放在 service 层；Drizzle ORM 负责类型安全的数据访问；D1 保存文章、标签、评论和配置。KV 用于版本化缓存，R2 用于媒体文件。&lt;/p&gt;&lt;p&gt;功能模块按照 api、data、service、schema、components 和 workflows 拆分。data 层只处理数据库查询，service 层编排业务规则，UI 不直接依赖底层存储。这种边界让测试、替换实现和定位故障都更容易。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一次文章请求如何完成&lt;a href=&quot;#一次文章请求如何完成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;路由根据 slug 请求文章详情。&lt;/li&gt;
&lt;li&gt;服务层先读取版本化 KV 缓存，未命中时查询 D1。&lt;/li&gt;
&lt;li&gt;内容经过代码高亮和目录生成后返回 SSR 页面。&lt;/li&gt;
&lt;li&gt;页面设置缓存与 SEO 元数据，并在客户端完成交互增强。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;我特别处理的工程问题&lt;a href=&quot;#我特别处理的工程问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务函数使用 Result 类型表达可预期错误，调用方必须穷举错误原因；全局中间件记录结构化 JSON 日志；发布流程生成公开内容快照，避免每次访问重复执行昂贵转换；集成测试运行在 Cloudflare Workers 测试池中，使测试环境更接近生产环境。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;结论&lt;a href=&quot;#结论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;技术选型的价值不在于新，而在于边界是否清晰、部署是否稳定、维护是否可控。这套架构让我能独立完成从数据库到用户界面的整条链路，也能在需求增长时继续演进。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>