<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Waylan</title><link>https://waylan.org</link><description>记录操作系统、软件工具、网络服务、脚本自动化和新技术体验。以实际问题为起点，写清环境、操作、结果与取舍。</description><language>zh-CN</language><atom:link href="https://waylan.org/rss.xml" rel="self" type="application/rss+xml"/><item><title>静态优先：内容站的预渲染、水合与边缘 API</title><link>https://waylan.org/post/a-room-on-the-internet</link><guid isPermaLink="false">echo:echo-001</guid><pubDate>Sat, 31 Oct 2026 04:00:00 GMT</pubDate><description>正文在构建时渲染成完整 HTML，交互在水合后接管，登录与评论交给同一个 Worker。记录这个博客的架构取舍，以及为水合一致性处理的那些细节。</description></item><item><title>URL 是一种公开接口</title><link>https://waylan.org/post/urls-are-interfaces</link><guid isPermaLink="false">echo:echo-009</guid><pubDate>Fri, 30 Oct 2026 04:00:00 GMT</pubDate><description>URL 一旦发布，就是对外承诺的接口。改版可以重写一切实现，但不应该让任何一个旧链接变成 404。</description></item><item><title>用 stroke-dasharray 把一条 SVG 路径变成点阵</title><link>https://waylan.org/post/svg-dotted-line</link><guid isPermaLink="false">echo:echo-007</guid><pubDate>Thu, 29 Oct 2026 04:00:00 GMT</pubDate><description>不需要 Canvas，也不需要额外的图片。把虚线的线段长度设为接近零，再配合圆形端点，一条 SVG 路径就会变成一串均匀的圆点。</description></item><item><title>设计 token 的三层结构：让多主题不再是第二套样式</title><link>https://waylan.org/post/design-tokens-theming</link><guid isPermaLink="false">echo:echo-002</guid><pubDate>Wed, 28 Oct 2026 04:00:00 GMT</pubDate><description>深色模式之所以难维护，往往是因为颜色直接写在了组件里。把 token 分成原始值、语义与组件三层，主题切换就只是换一组映射。</description></item><item><title>Waylan 技术博客</title><link>https://waylan.org/post/project-waylan</link><guid isPermaLink="false">echo:echo-014</guid><pubDate>Tue, 27 Oct 2026 04:00:00 GMT</pubDate><description>你正在浏览的这个网站。静态预渲染的 React 应用，部署在 Cloudflare Workers 上，支持私人划线、段落级批注，以及基于 GitHub Discussions 的公开讨论。</description></item><item><title>开发日志：批注锚点的改稿迁移</title><link>https://waylan.org/post/devlog-anchor-migration</link><guid isPermaLink="false">echo:echo-012</guid><pubDate>Mon, 26 Oct 2026 04:00:00 GMT</pubDate><description>这周把批注的定位从“只认字符偏移”改成了“块标识 + 原文 + 前后文”的三段式查找，并补上了原文已变化时的展示。</description></item><item><title>Cloudflare Workers + D1：一个小而完整的边缘数据层</title><link>https://waylan.org/post/workers-d1-edge-data</link><guid isPermaLink="false">echo:echo-003</guid><pubDate>Sat, 24 Oct 2026 04:00:00 GMT</pubDate><description>静态站点只需要很少的服务端能力：登录、评论和批注。用一个 Worker 同时托管静态资源与 API，再配一个 D1 数据库，就能覆盖这些需求。</description></item><item><title>读 Web Annotation 数据模型：文本锚点如何在改稿后存活</title><link>https://waylan.org/post/stable-text-anchors</link><guid isPermaLink="false">echo:echo-004</guid><pubDate>Tue, 20 Oct 2026 04:00:00 GMT</pubDate><description>一条批注指向的是“某几个字”，而文章会被修改。精读 W3C Web Annotation 的选择器设计，并记录我在实现中采用的定位顺序与失败策略。</description></item><item><title>读陌生仓库，先读测试</title><link>https://waylan.org/post/read-tests-first</link><guid isPermaLink="false">echo:echo-010</guid><pubDate>Sun, 18 Oct 2026 04:00:00 GMT</pubDate><description>读一个陌生的仓库，我会先读测试。文档描述作者希望代码做什么，测试记录的是代码实际被要求做什么。</description></item><item><title>好工具，应该允许人慢一点：评论框的草稿保存与离开保护</title><link>https://waylan.org/post/slow-tools</link><guid isPermaLink="false">echo:echo-005</guid><pubDate>Fri, 16 Oct 2026 04:00:00 GMT</pubDate><description>读者写一条评论，中途去登录、切换标签页或误触返回，文字都不应该丢。记录评论框里草稿持久化与离开保护的实现细节。</description></item><item><title>读取“减少动态效果”偏好：一个函数和一个 Hook</title><link>https://waylan.org/post/use-reduced-motion</link><guid isPermaLink="false">echo:echo-008</guid><pubDate>Tue, 13 Oct 2026 04:00:00 GMT</pubDate><description>系统设置里的“减少动态效果”是读者明确表达过的偏好。动画开始之前先确认是否允许，并且在预渲染时给出确定的默认值。</description></item><item><title>前端性能预算：把“别变慢”写成构建门禁</title><link>https://waylan.org/post/performance-budget</link><guid isPermaLink="false">echo:echo-006</guid><pubDate>Sat, 10 Oct 2026 04:00:00 GMT</pubDate><description>性能很少在某一次提交里突然变差，而是在几十次“只多了几 KB”之后。给资源体积设定预算，并让 CI 在超出时失败，是我目前最有效的做法。</description></item><item><title>页边回声：可重新定位的文本批注</title><link>https://waylan.org/post/project-margin-echo</link><guid isPermaLink="false">echo:echo-015</guid><pubDate>Thu, 08 Oct 2026 04:00:00 GMT</pubDate><description>把一段讨论锚定在原文的某几个字上。文章修改之后，按块标识、原文与前后文依次找回位置；找不到时明确标记，而不是悄悄贴错。</description></item><item><title>组件的边界</title><link>https://waylan.org/post/component-boundaries</link><guid isPermaLink="false">echo:echo-011</guid><pubDate>Sat, 26 Sep 2026 04:00:00 GMT</pubDate><description>当一个组件需要靠布尔 props 切换出完全不同的结构时，它通常是两个组件被写在了一起。</description></item><item><title>开发日志：单文件离线预览</title><link>https://waylan.org/post/devlog-offline-preview</link><guid isPermaLink="false">echo:echo-013</guid><pubDate>Mon, 14 Sep 2026 04:00:00 GMT</pubDate><description>为了让人不装任何依赖就能看到网站效果，这周做了一个可以直接双击打开的单文件 HTML 预览。</description></item></channel></rss>