续费通知寄来时,我决定放手。
threadkeeper.io 是我的第一个想法,也是我的第一个网站。2025年8月,我买下了这个域名——大约六周前,我刚在一个社区大学的AI夏令营里,写着像 ccc-ai-pdf-project 这样的文件名,并在自己的README里把它描述为一个初学者Python项目。然后我上线了一个域名、一个博客、一个CLI工具,还有一份宣言。
![]()
在它过期之前,我回去看了最后一眼。带着点怀旧情绪。五分钟,最多。
然后我试着找源代码在哪里,结果发现它哪里都不在。
网站托管在 Spaceship 上。我是在浏览器里直接搭建的,从未放进版本控制。一次都没有。没有可克隆的仓库,没有本地文件夹,没有备份。我的第一个网站在世界上唯一的副本,就是运行在一台只剩四天期限的服务器上的那个。
那个网站顶部的青色标语写着:"没有上下文,不要提交。"
而我从未提交过它。
我没有自己网站的源代码
所以第一件事不是怀旧,而是抢救。
我在服务器下线之前,把全部八个页面和所有资源都拉了下来:着陆页、博客、三篇文章、Dr. Kahlo 页面,以及我为 AWS 黑客马拉松构建的 Ariadne Clew 复盘应用。一共19个文件。sitemap.xml 声称有四个页面——这足以说明2025年的我有多不信任自己的站点地图。其余的文件是我顺着链接一个个找出来的。
现在这个存档已经公开,每个原始文件都附有 SHA-256 哈希值,任何人都可以验证抢救过程中没有任何内容被改动:
earlgreyhot1701d.github.io/threadkeeper-archive
它现在被提交了。迟到了一年。
我给文件起名 dom_js.js,眼睛都没眨一下
这是当我终于能读到自己的代码时,发现的第一件事。
Ariadne Clew 应用有七个 JavaScript 模块。其中两个用了蛇形命名加后缀:api_js.js、dom_js.js、main_js.js。另外四个是驼峰命名、没有后缀:utils.js、theme.js、exportMarkdown.js、dragDrop.js。
两种命名规范。一个文件夹。七个文件。
再看一眼 dom_js.js。这个名字读起来就是"dom,js,点js"。后缀重复了扩展名。我完全知道这是怎么来的,因为2025年我一直在这么干:聊天窗口里的代码块被标成 dom_js,然后你用标签加 .js 保存,因为能用就继续往下走了。
这个文件名就是一张收据。它记录着这些文件是从对话里复制出来的,而不是在项目里创建的。
一行代码让页面上每个按钮都失效了
main_js.js 以六个 import 语句开头。第三个是这样的:
import { getElement, getValue, ... } from './dom.js';
而服务器上的文件叫 dom_js.js。
ES 模块在执行任何代码之前,会先解析整个 import 图。一个文件缺失,模块就不会运行。没有部分执行,也不会回退到那五个解析成功的 import。
那个页面上的每一个事件监听器都住在 main_js.js 里。表单提交、复制按钮、导出按钮、主题切换、拖拽——
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.