Independent Products

把个人产品网站做成 0 KB JavaScript:一次上线记录

Ronny Sight 上线中的一个具体取舍:静态页面、系统字体、本地素材,以及为什么构建产物没有脚本还不够。

2026年10月1日中文

Ronny Sight 的第一版,需要让人快速看懂两件事:这里在做什么产品,以及这些产品背后的思考。首页没有需要在浏览器里计算的数据,也没有必须登录后才能完成的动作。

这让一个选择变得很清楚:先把内容直接交给浏览器。

从页面的工作出发

产品介绍、文章和导航,都可以在构建时生成 HTML。Astro 负责把内容文件变成页面,Cloudflare Workers Static Assets 负责分发生成的文件。字体使用系统字体,图形使用 SVG,素材从本站加载。

第一版没有增加客户端框架,也没有为了一个产品卡片或导航按钮增加运行时依赖。这个选择来自页面当前的工作:访客需要阅读、判断,再进入产品或文章。

以后如果出现具体的交互需求,可以为那一个需求增加代码。现在先把阅读路径做好。

构建目录只是第一层证据

2026 年 10 月 1 日,第一轮视觉调整后的首页构建产物约为:

  • HTML:17.3 KB。
  • CSS:11.5 KB,gzip 后约 3.4 KB。
  • 客户端 JavaScript:0 KB。
  • 首屏不加载位图,不请求外部字体。

这些是当时构建产物的体积,后续增加文章和产品截图会改变部分数字。它们也不是访问速度:下载时间还受 DNS、TLS、缓存和网络路径影响。

一个容易漏掉的问题,是线上页面可能和构建目录不同。

最初部署后,构建目录里没有 JavaScript,生产页面却出现了 Cloudflare 自动加入的 Web Analytics 脚本。只检查源码或 dist/,会漏掉这一次变化。

最终通过静态响应头中的 Cache-Control: no-transform 阻止自动注入,再检查生产页面的网络请求和脚本列表。Cloudflare 的 Web Analytics FAQ 记录了这个行为。

这次最实用的经验,是把“构建没有脚本”和“访客实际收到的页面没有脚本”分别验证。

截图要提供证据,也要控制成本

首页的产品展示,先使用轻量抽象结构,随后接入已有产品素材。图片放在产品区,通过懒加载和明确尺寸,减少首屏依赖并提前留出空间。

FrameSight 的素材来自已有官网的比较工作区截图。LensMind 目前采用真实 SwiftUI 引导页的预览快照,并明确标注来源;它不能替代完整图库或分析结果的实机展示。

一张图片是否值得加载,应该看它帮助访客理解了什么。占用空间更少只是约束,真实地表达产品才是目的。

0 KB JavaScript 不是访问质量的结论

小页面、系统字体和本地素材,减少了跨境网络上需要完成的请求。它们不能保证中国大陆每条线路都能稳定访问。

大陆多运营商可达性、首字节时间和真实浏览器的 LCP,需要分别测量。海外节点能打开页面,也不能替代大陆用户的结果。网站上线与这些验证,是两件需要各自交付证据的工作。

这版网站保留了一条简单的验证路径:看构建产物,访问生产页面,检查桌面和手机布局,再核对实际资源请求。下一次增加功能或素材时,仍然用同一套问题检查它带来的价值和成本。