一个独立开发者,用 17 万行 TypeScript,走过的 5 个月

73 阅读12分钟

引子

从 2025 年 5 月 9 日上线,到今天 10 月 8 日,正好 5 个月。

我认真翻了一下部署记录,发现上线比我自己记得的还要早。 这 5 个月里,我开发了十几个工具,写下了 175,747 行 TypeScript 代码; 但我没有写过一篇工具教程,也没有发过一篇真正意义上的推广文案。

不是不想写,也不是没时间写。 恰恰相反,我的时间几乎全部都用在了她身上: 我为她换过三次 UI,设计无数个 icon 和配色;我重写过主站导航,反复调试 SEO 结构;我一个人调起整个 PDF 渲染与合并管线,从服务端到客户端,从 Gotenberg 到 pdf-lib,从 blob 到 worker,从 lighthouse 38 分一路拉到 RES 100。

我不是不想对外介绍她,而是一直觉得——她还不够好,还不值得介绍。

她就像一个还未长大的孩子,一点点学会走路,一点点换上新衣, 我只想静静地看着她长大,不急着把她推向人群,不急着博取眼球。

但今天,我突然想写点什么了。不是教程,不是宣传,而是像之前一样,写一点自己的心情,一点阶段性的记忆。

就当是,给这 5 个月,写下一份 “成长存档” 吧。

RES100.png


她的成长轨迹:从泥沼中站起来的自己

说实话,我不算什么技术高手。 准确地说,我只是一个在中国某个角落的小公司里,靠着微弱意志撑过几年职场的普通开发者。

我曾经待过的那家公司,环境极差,甚至称得上肮脏至极: 伪造资料、合作诈骗、操纵收购……那些所谓的“老板”连基本的做人底线都没有。 我受够了,也不愿与那样的体制为伍,最后选择了离开。

也正因为这种环境,我所接触到的技术,几乎停留在十几年前的年代。 Spring MVC、JSP、单体部署、裸跑Tomcat、手动打包、没有CI/CD、没有容器、没有云、没有现代协作。 那种脱节感,就像活在另一个时间层。


🧭 后来我下定了一个决心:转型

我开始观察世界:为什么我在的地方这么落后,而别人却已经走得那么远? 我发现世界上所有主流的 SaaS、工具平台、开发框架……几乎全都在使用 TypeScript

我想,既然我是独立开发者,选择一门前后端通吃的全栈语言,总归是对的。 TypeScript 又与 Java 有很多共通点,接口、泛型、类型系统我都能理解,于是我就入坑了。一发不可收拾。


🛠 技术路线走了很多弯路,也都是必须的

最初的后端我没用 NestJS,而是东拼西凑: express + apollo server + graphql,而且还是最原始的 SDL 风格 schema。 我第一次接触 GraphQL,只是照着教程写,根本没想过类型安全。

直到后来看到了 Code First 的世界,接触到 Pothos,一下子被“类型驱动开发”这个理念吸引。

数据库也是AI教我的,告诉我:用 Prisma 吧。 我就从原始 MySQL 开始迁移,一点点适应、学习,接触事务、关系、字段设计、约束、迁移……

中途当然也踩了无数坑。比如队列系统、缓存、事件机制……以前完全没接触。 再后来,AI又告诉我:“别用 express 了,试试 NestJS 吧。

我打开了 NestJS 官网,一眼就被击中。 这就是我理想中的后端框架啊!

于是,我花了整整 8 天,从零开始,按照官方文档,一步步将原来的系统迁移到了 NestJS。 现在,我的后端已经进化到了:

NestJS + Apollo Server + Prisma + BullMQ + JWT + Passport + ioredis + CASL Ability + 本地任务队列 + 自动降级 + Serverless fallback...

总之,从一个只能写 controller 的人,慢慢成长为了能设计策略架构、任务调度、能力流水线的独立开发者。


🎨 再说体验、SEO、UI/UX

最初的 Lighthouse 分数是 38, GSC 连首页都不愿收录,每次都说“出了点问题”, Bing 搜索结果没有卡片,没有图,没有 meta,没有收录,什么都没有。

那时候真的很沮丧,我调结构、调路由、重构布局,连 meta tag 的顺序都研究了无数遍。

终于有一天,Lighthouse Desktop + Mobile 同时破百, GSC 开始正常抓取和展示, Bing 的搜索结果也终于带上了卡片图。

你知道吗,那一刻我没有大喊成功, 我只是长长地吐了一口气, 告诉自己:她,终于被世界看见了。

QQ截图20251008221453.png


🧩 工具本体,也从“练手玩具”走到了“性能顶尖”

从第一行 MUI 代码开始,写的是图片二进制转换——练手的、凑数的。 后来是文本格式化、BMI计算器、二维码生成。

再后来,我构建了图片处理套件(压缩、裁剪、调整大小、加水印……) 再到今天——PDF 工具的开山之作:Merge PDF

她已经可以流畅处理上百份 Office 文件、合并上千页 PDF、完成排序、旋转、复制的复杂操作——性能超过国际大厂,页面无一白屏、无一崩溃。


🧘 这一路,我自己也说不清到底熬了多少个夜

从 copy 别人的代码,到理解架构思想; 从只会三层结构,到开始研究 DDD 领域建模、任务系统; 从手写文件名,到自动化命名、统一事件处理、异步队列调度、进度跟踪、异常兜底……

从一个什么都不懂的 Java Web 工程师, 变成了能独自一人架起 NextJS + NestJS + Azure + Gotenberg + Vercel + Railway + Cloudflare 的独立开发者。

我曾一度动摇,怀疑,崩溃,甚至想过放弃。

但我也记得,那些凌晨三点的调试日志、无数次白屏的原因追踪、GA 的一位用户出现时的感动……

都没有白费。


我的转变:从 Java 到 AiMuo,从生存到创造

我已经很久没有写过一行 Java 代码了。

这并不是刻意决裂,而更像是一段温柔而坚定的告别。 就像初恋一样,Java 陪我走过了许多年,陪我加过无数个夜班,写下过一个又一个项目。

但现在回头看,那些年写下的代码,似乎从来没有孕育出过真正有意义的东西。

而 TypeScript,不一样。

是它陪我,一行一行,亲手孕育出 AiMuo 这个小家伙。 她现在还很弱小,就像一个刚出生的婴儿,连五官都没发育完整,但她是我见过最美的存在。 我真的相信——她未来一定会惊艳世界。


🧠 对世界的重新思考,对用户的重新理解

这一路走来,我无数次问自己一个问题:

“一个好工具,究竟是什么样的?” “到底什么才是真正对用户有帮助的产品?”

是选项越多越好吗?是参数丰富吓人吗? 当然不是。

用户很单纯,他们只是想完成一件事: 压一张图、合并几个文件、转一份格式、生成一个二维码。

我们开发者该做的,不是给他们复杂的选择,而是带给他们简单的结果。

这也是我一直强调的「石头架构」: 我们不堆叠繁复的电子元件,不追求界面花哨炫技, 我们选择最原始、最可靠、最简洁的形态——石头。

石头不会骗人,它是这个世界的基石。 一个真正好的工具,就该像一颗石头:简单、稳定、可依赖


🛠 对产品的敬畏:每一行代码都应该有它的意义

我始终心怀敬畏。 不仅是对产品,更是对每一行代码,每一个注释,每一次命名。

我总觉得,如果这行代码没有存在的意义,那它就不应该存在。 产品不是堆出来的,它是打磨出来的。

QQ截图20251008222909.png


🎯 从万能百宝箱的幻想,到专注解决“一件小事”的觉醒

一开始,我的想法很简单: 造出无数个小工具,靠 SEO 吸引用户,接入 Google Ads 实现变现。

目标很务实,也很“流量生意”的思路。 但越做,我越觉得,那不是 AiMuo 应该有的样子。

钱很重要,服务器要钱、CDN要钱、生活也要钱。 但就算不靠工具站赚钱,也不能失去工具的灵魂。

后来我明白了: 人无完人,产品也没有万能的产品。

我们只需要把一件小事做到极致,足矣。 哪怕只是合并一份 PDF,压缩一张图,只要能让用户舒心,能让他们用完想推荐,那就已经值得我花所有时间去打磨。


🧭 开始思考:每个工具的边界在哪里?AiMuo的边界在哪里?

我开始不再追求“多”,而是追求“深”。 我开始思考每一个工具的边界,思考它的核心能力、用户最频繁的路径、最关键的按钮应该长什么样子。

我也开始思考 AiMuo 的边界。 她不该只是一个无边无际、什么都能点一点的“百宝箱”。

她应该是某个垂直领域的专家。

我希望她成为一位真正懂 PDF 的工具匠人—— 处理合并、拆分、压缩、转换、编辑,每一步都精致、稳定、私密、流畅。

而不是一个泛泛而谈的“万金油”。


你问我现在的目标是什么?

很简单:

让 AiMuo 成为解决 PDF 难题的首选工具站。

不靠炫技,不靠噱头,只靠真正的体验、真正的价值、真正的信任。

image.png


未来的预告:她将成为一位真正的专家

过去这五个月,我们埋头打地基,做基础能力,建稳架构、磨 UI、跑性能、修兼容。

而现在,她的第一条成长曲线已经初步成型:PDF 能力,正在逐步展开。


🧱 很快,AiMuo 将支撑起所有常用的 PDF 基础能力:

  • 拆分 PDF:按页、按范围、按书签,精准拆解
  • 压缩 PDF:自动分辨率检测、质量控制,极致瘦身
  • 转换 PDF:Word、Excel、PPT、JPG、PNG 双向互转
  • 🧩 编辑、加密、解密、裁剪、水印……也都在路上

她不再是一个“可以处理 PDF 的工具网站”, 她会是一个“生来就为 PDF 而存在的专家”。


🤖 更重要的是,我们会赋予她AI 能力

  • 让大模型成为她的左膀右臂
  • 理解用户的意图,自动识别操作意图:拆?转?合并?提取?
  • 智能识别文档结构、提取关键信息、生成总结内容、分类排序……

我们不追逐AI的噱头,我们只希望—— 当用户迷茫时,有人站出来告诉他们:“你可以这么做,我来帮你。”


🧳 而图片、文本等其他工具,将悄悄退居幕后

  • 它们不会消失,而是会以子站的形式,继续为需要的人服务;
  • 也许有一天,它们会拥有自己的名字,自己的身份;
  • 但 AiMuo 主站的定位,将不再是“全能工具百宝箱”——

她会是一个专注 PDF 的专家型品牌,就像“小而美”的手工匠人, 不迎合潮流,但每一个功能都扎实、靠谱、好用。


🎓 我们也会开始“教”

过去我们一直在“造工具”,未来我们也要开始“传工具”——

  • 一篇篇图文教程、使用技巧、实战案例
  • 一条条视频动图、操作演示、最佳实践
  • 一步步教大家如何与 AiMuo 更好地互动

我们会说话、会倾听、会回应每一位愿意给我们时间的用户。


🌱 我们的目标,从不是流量,而是信任

我们不奢望一上线就爆红; 但我们希望:每一个来过的人,都愿意再回来一次。

未来还有很多路要走,还有很多坑要填,很多功能要补,很多细节要打磨。

但我们会一件件做,慢慢做,不急不躁,不为了炫耀,只为了靠近真实的用户需求。


等待的意义

我一直在等。

不是在等什么惊天动地的奇迹,不是在等流量暴涨,不是在等“被看见”。

而是在等一个她终于准备好的时候。


我理解的等待,是一种对美好的信仰。

  • 一颗种子需要等待四季更替,才能长成参天大树;
  • 一位母亲需要十月怀胎,才能迎来一个新的生命;
  • 人类文明也经历了千百年混沌,才逐步诞生出今天的秩序;
  • AI,也是在数十年冷寂与孤独中,才走到了今天这一步。

世上所有真正美好的东西,都是等待来的,而不是急出来的。


等待,并不是无所作为。

它不是坐着空想,而是在沉默中耕耘,在黑夜中雕刻,在无人知晓的时刻里,一锤一锤打磨。

就像这 5 个月,我一行一行写下了 17 万多行代码,删掉了几倍的废稿,跑过无数次测试,调整过每一个像素、每一个交互、每一个文案。

不是为了完美,而是为了配得上那个等待的理由。


我越来越相信一句话:

你相信什么,你就是什么。

如果你相信工具应该“简单到零学习成本”,你就会创造出这样的产品; 如果你相信用户不是弱者,而是信任你的人,你就不会用套路去对待他们; 如果你相信“慢工出细活”,那么哪怕没有掌声,你也愿意打磨每一处细节。

等待,从来不是为了结果。 等待,是因为你心里有某种笃定。


今天,我终于愿意写下这篇文章。 不是因为她已经完美了,不是因为她一切准备就绪了, 而是因为——

她终于可以穿上那件礼服,走出去,向世界打个招呼了。

“你好,我叫 AiMuo, 我可能还不够强大,但我愿意尽我所能, 帮你合并一份文件、压缩一张图、解决一件小事。”


她还小,还会犯错,还需要不断成长。 但她已经走到了灯光之下,不再是只属于深夜和命令行的影子。

她值得被看见。 你也值得被看见。