这个站本身,也是一份作业
招人看作品,客户看方案。所以我把这个站的做法摊开写:装在哪、数据放哪、通知怎么发、哪里踩了坑、实测多少毫秒,以及它现在明显的短板。
一、请求链路
四条链路,全部跑在 EdgeOne Pages 一家平台上
没有数据库、没有容器、没有反向代理。一个静态站 + 一个云函数 + 两个 Blob 桶,就是全部基础设施。
二、为什么这么选
先说踩过的坑:原方案是跨平台调云数据库,被 CORS 挡死
| 环节 | 选择 | 原因 |
|---|---|---|
| 静态托管 | EdgeOne Pages(海外区) | push 即上线,不用管服务器与证书;HTML/CSS/JS 分开部署,改文案不用重发整站 |
| 后端 | EdgeOne 云函数(Node.js 20) | 与站点同域,前端直接 fetch,不需要处理 CORS 预检 |
| 数据 | Blob 存储(KV 式 JSON 文件) | 留言、文章都是小文档,按前缀列目录即可;读写都加 consistency: "strong",避免写完读不到 |
| 邮件通知 | 阿里云邮件推送(DirectMail) | 云函数能直连邮件服务商的 SMTP 端口出网;自有域名验证过发信域,送达率比个人邮箱稳 |
| 文章接口 | 并入现有云函数,?res= 分流 |
实测新增云函数文件不随部署生效(持续 404),复用已在线的函数最稳 |
原本的打算更"标准":静态站 + 托管数据库。实际联调时,跨域预检直接被服务端拒了(强制 Origin 精确匹配),浏览器连请求都发不出去。换成本域云函数 + Blob 之后,问题消失,还少了一层鉴权配置。
三、几处具体设计
都是小站也需要的东西:防刷、防爬、防密钥泄漏
蜜罐字段
表单里塞一个正常人看不见、也不会填的 website 输入框。填了就直接返回成功、什么也不做——让机器人以为提交成功,实际一条数据都没进库。
比验证码轻,也不影响真人填写。
限频与自动清理
同一 IP 每分钟最多 3 条,超了返回 429。限频记录按分钟分键存放,每次提交顺手删掉 3 分钟前的旧键——否则 Blob 会按分钟无限堆积。
清理失败不影响留言主流程,只是多留几个文件。
管理密钥不落日志
站主读取、删除、发测试信都走 X-Admin-Key 请求头,不再用 ?key=。查询串会进平台访问日志和浏览器历史,请求头不会。
query 参数保留,只给 curl 调试用。
邮箱不让爬虫直接抓到
页面源码里只有反序字符串(tahctrats 之类),运行时由 JS 拼回真实地址。代价是禁用 JS 的访客看不到邮箱,但页面上还有表单和 GitHub 两条路。
JSON-LD 里也刻意不放 email 字段。
文章正文先转义再渲染
后台存的是纯文本 markdown,前端渲染前先做 HTML 转义,再转换标题、列表、引用、代码块。加粗与链接只放行 http(s) 与站内路径。
这样即使正文里写了脚本标签,也只会被当成文字显示。
降级而不是报错
通知信发不出去,留言照样入库并返回成功——数据比通知重要。前端在「减弱动态效果」下自动关掉滚动动画,表单逻辑单独分支,不会因为动效偏好把功能一起关掉。
这个坑真的踩过:早期一个提前 return 让表单在部分设备上退化成默认 GET 提交。
四、实测数据
2026-10-30 用 curl 从中国大陆家用网络测到 EdgeOne 海外节点,各取 3 次
含 DNS、TCP 与 TLS 握手
夜间跨境链路波动大,低时 190ms
压缩率约 66%
无 React、无打包器
| 资源 | 原始体积 | gzip 后 | 说明 |
|---|---|---|---|
| index.html | 35,302 B | 11,843 B | 含全部文案与结构化数据 |
| site.css | 39,254 B | 9,198 B | 全站样式(含文章页、本站页),含深色模式变量 |
| site.js | 5,381 B | 2,426 B | 主题切换、滚动渐入、表单提交、首页最新文章 |
| notes.js | 6,506 B | 2,481 B | 文章页的 markdown 渲染(含 GFM 表格) |
| TLS 握手 | — | 350–520 ms | 跨洋链路的主要成本 |
| 接口响应 | — | 1.4–2.1 s | 含云函数冷启动,首次偏慢 |
首页没有图片、没有字体文件、没有第三方 UI 库。慢的部分主要在链路上,不在页面上。
五、这个站现在的短板
写作品就得写缺点,不然只是宣传页
| 短板 | 影响 | 要补的话 |
|---|---|---|
| 文章页是客户端渲染 | 搜索引擎抓到的只是空壳,只能靠 sitemap 与 llms.txt 补 | 发布时预渲染成静态页,或让云函数直接返回 HTML |
| 单区域部署(海外) | 国内访问 RTT 约 190 ms,TTFB 高于国内节点 | 换到国内加速区域(需备案),或做双区域 |
| 管理后台只有静态密钥 | 没有多用户、没有操作审计,密钥泄漏等于全开 | 接真正的身份认证,加操作日志 |
| 文章无草稿工作流 | 只有「发布 / 草稿」两态,没有版本历史 | 每次保存留一个版本键,可回滚 |
这套东西的价值不在技术新颖,而在边界清楚:什么放在边缘、什么放函数里、什么必须落盘、失败了降级到哪一步。想把这套用在你自己的项目上,或者看出哪里还能更好 —— 写信给我。