本站

这个站本身,也是一份作业

招人看作品,客户看方案。所以我把这个站的做法摊开写:装在哪、数据放哪、通知怎么发、哪里踩了坑、实测多少毫秒,以及它现在明显的短板。

一、请求链路

四条链路,全部跑在 EdgeOne Pages 一家平台上

访问 浏览器 EdgeOne 边缘节点HTML / CSS / JS 静态直出 首屏无框架、无构建
留言 联系表单POST /api/contact 云函数校验 · 蜜罐 · 限频 Blob 存储contact-messages DirectMail SMTP发信域已验证 站主邮箱
文章 列表 / 详情页GET ?res=articles 同一个云函数?res= 分流 Blob 存储site-articles
发布 改文件 git pushGitHub Actions / CLIedgeone makers deploy 边缘节点40–200 秒生效

没有数据库、没有容器、没有反向代理。一个静态站 + 一个云函数 + 两个 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 次

1.0–1.7s
首次请求首字节
含 DNS、TCP 与 TLS 握手
0.45–0.96s
复用连接首字节
夜间跨境链路波动大,低时 190ms
35KB → 12KB
首页 HTML 原始 → gzip
压缩率约 66%
0 个
前端框架与构建步骤
无 React、无打包器
资源原始体积gzip 后说明
index.html35,302 B11,843 B含全部文案与结构化数据
site.css39,254 B9,198 B全站样式(含文章页、本站页),含深色模式变量
site.js5,381 B2,426 B主题切换、滚动渐入、表单提交、首页最新文章
notes.js6,506 B2,481 B文章页的 markdown 渲染(含 GFM 表格)
TLS 握手—350–520 ms跨洋链路的主要成本
接口响应—1.4–2.1 s含云函数冷启动,首次偏慢

首页没有图片、没有字体文件、没有第三方 UI 库。慢的部分主要在链路上,不在页面上。

五、这个站现在的短板

写作品就得写缺点,不然只是宣传页

短板影响要补的话
文章页是客户端渲染 搜索引擎抓到的只是空壳,只能靠 sitemap 与 llms.txt 补 发布时预渲染成静态页,或让云函数直接返回 HTML
单区域部署(海外) 国内访问 RTT 约 190 ms,TTFB 高于国内节点 换到国内加速区域(需备案),或做双区域
管理后台只有静态密钥 没有多用户、没有操作审计,密钥泄漏等于全开 接真正的身份认证,加操作日志
文章无草稿工作流 只有「发布 / 草稿」两态,没有版本历史 每次保存留一个版本键,可回滚

这套东西的价值不在技术新颖,而在边界清楚:什么放在边缘、什么放函数里、什么必须落盘、失败了降级到哪一步。想把这套用在你自己的项目上,或者看出哪里还能更好 —— 写信给我。

← 回到首页 写信聊聊 →
写信给我