第一个站点到期前四天,我才发现源码根本不存在
ccc-ai-pdf-project 这种命名的 Python 新手作业。六周后我上线了域名、博客、CLI、宣言——全在 Spaceship 的浏览器编辑器里点出来的,没建过 Git 仓库,没跑过 git commit,连个本地副本都没有。页面顶端青色字写着:"Don't commit without context."
讽刺的是,我连提交都没做过。
续费通知来了,决定放弃。怀旧心态点进后台看最后一眼,五分钟顶天。想把代码拉下来留个念想,这才发现:世界上唯一的副本就跑在即将关机的那台服务器上。

抢救现场:十九个文件,全靠手工拽下来
第一步不是怀旧,是抢救。把八个页面、所有静态资源全薅下来:落地页、博客、三篇文章、Dr. Kahlo 页面、还有一个 AWS 黑客松写的 Ariadne Clew 回顾应用。共 19 个文件。sitemap.xml 宣称只有四个页面——2025 年的我连站点地图都不信。
现归档在 GitHub Pages,每个文件附了 SHA-256,证明没动过一个字节:
earlgreyhot1701d.github.io/threadkeeper-archive迟到一年,总算有了版本控制。
文件名叫 dom_js.js,当时我竟没眨眼
能读代码后发现的第一个问题:Ariadne Clew 七个 JS 模块,两套命名规范混用。
- snake_case +
_js.js后缀:api_js.js、dom_js.js、main_js.js - camelCase 无后缀:
utils.js、theme.js、exportMarkdown.js、dragDrop.js
同一个文件夹,七个文件,两种风格。
盯着 dom_js.js 看两秒:"dom, js, dot js" —— 后缀把扩展名重复了一遍。原因我太清楚了:聊天窗口里代码块标 dom_js,存文件时顺手加个 .js,跑通了就不管了。文件名就是张收据,记录着「这些文件是从对话框里复出来的,不是在工程里写的」。
一行 import 错了,整页按钮全瘫
main_js.js 开头六个 import,第三个写着:
import { getElement, getValue, ... } from './dom.js';服务器上实际文件名:dom_js.js。
ES 模块会先解析完整依赖图再执行。缺一个文件,整个模块图直接不运行——没有部分执行,没有降级,那五个正常解析的 import 也白搭。
页面上所有交互全在 main_js.js 里绑定:表单提交、复制、导出、主题切换、拖拽、初始 UI 状态。全挂了。
左边页面渲染得漂漂亮亮,右边控制台一行红字:
Failed to load resource: the server responded with a status of 404 (dom.js)那是过期前几天我在自家浏览器里看到的现场。完美的静态页面,零交互。
以后再不敢裸奔上线了
现在回想,全是低级错误:没建仓库、没本地开发、没构建流程、没类型检查、连文件名大小写都不统一。但这也是唯一的路径——只有把东西真正推到生产环境、让它死在阳光下,下一次才会记得先 git init。
存档里还有完整的控制台堆栈和网络瀑布图,想看现场的可以自己翻。

dig +trace确认 NS 生效,别光看面帖子标题:第一个站点到期前四天,我才发现源码根本不存在