Back to Blog

极简主义的胜利:我是如何用「一个 HTML 文件」搞定全栈应用的 🚀

Archive

想试试超级轻量级的应用

Published on 12/16/2025

最近我一直在想一个问题:现在的 Web 开发是不是太重了? 想做个简单的 Demo?先 npm init,再装 Webpack,配 Babel,装 React,装 Tailwind,装 ESLint……等你把环境搭好,我想做的那个灵感早就跑没影了。 于是,我决定搞点事情。我想做一个真正的极简全栈应用

  • ❌ 不需要 Node.js 环境
  • ❌ 不需要构建工具 (Webpack/Vite)
  • ❌ 不需要 node_modules (那 200MB 的黑洞)
  • ✅ 只要一个 index.html
  • ✅ 只要一个后端二进制文件 这就是我们今天的主角:Inspiration Collector (灵感收集器)

🎯 成果展示:它长这样

这是一个深色模式优先的笔记应用,支持:

  • 📝 实时记录灵感
  • 🔐 用户登录/注册(数据隔离)
  • 🎨 随机莫兰迪色卡片
  • ✨ 悬浮对话气泡输入框
  • 🌙 深夜护眼模式 最疯狂的是?整个前端代码就在一个 HTML 文件里,不到 200 行逻辑代码。

🛠️ 技术栈:这次我真的没装依赖

为了实现这个”疯狂”的想法,我选择了一套**「流浪地球」式技术栈**:

角色技术为什么选它?
前端框架Alpine.jsVue 的轻量替代,直接写在 HTML 里,不需要编译!
样式Tailwind CSS通过 CDN 引入,写类名就完事了,不用写 CSS 文件。
后端/数据库PocketBase神器! 一个 Go 写的单文件二进制,自带 SQLite 和 Auth。
静态服务Python http.server别笑,它是解决 CORS 跨域的最快方案。

🚧 踩坑实录:极简路上的那些”坑”

别看现在很丝滑,过程简直是一部血泪史。

1. 那个该死的 required 属性

现象:一打开页面,控制台狂报错 An invalid form control with name='' is not focusable原因:我在登录模态框里加了个”确认密码”字段,登录时它被隐藏了,但 required 属性还在。浏览器试图验证一个看不见的输入框,直接崩了。 解决:用 Alpine.js 动态绑定 :required="!isLoginMode"

教训:HTML5 原生验证很好,但在 SPA 里要小心隐藏字段。

2. CORS 跨域地狱

现象:直接双击打开 index.html,API 请求全被浏览器拦截。 原因file:// 协议没有 CORS,浏览器不允许它访问 http://localhost:8090解决python3 -m http.server 8000

灵魂拷问:为什么 Python 能跑起 Server?其实它就是个超级简易的静态文件服务器,把你的文件夹变成网站。真正的后端是 PocketBase,Python 只是个”传菜的”。

3. PocketBase 的权限规则

现象:能注册登录,但存不进数据,报 400 错误。 原因:PocketBase 默认不信任任何人。 解决:配置 API Rules。 user = @request.auth.id —— 这行代码的意思是:“只有我自己能看我自己的数据”。


🤔 深度解析:为什么这套组合拳这么爽?

Q: 为什么不用 React/Vue?

A: 杀鸡焉用牛刀。 对于这种交互简单的工具,React 就像开着坦克去买菜。Alpine.js 让我像写 jQuery 一样写逻辑,但又有现代框架的响应式,爽爆了。

Q: 为什么不用 Firebase?

A: 太贵,太复杂。 配置 Firebase 要去 Google Cloud 控制台点半天。PocketBase 下载下来,./pocketbase serve,完事。数据就在本地 pb_data 文件夹里,随时能拷走。

Q: 这东西能上线吗?

A: 必须能。 丢到 Vercel 或 Netlify,它会自动识别 index.html。后端 PocketBase 丢到 Railway 或 Fly.io,一行命令的事。

📦 源码与体验

我把代码都开源了,真的只有一个文件,欢迎大家来喷(或者来夸): 👉 GitHub 仓库地址:[GitHub - LouisLau-art/inspiration-notes: 极简灵感收集器 - 单文件全栈应用] 本地运行只需要三步:

# 1. 下载 PocketBase
wget ... (去 GitHub)
# 2. 启动后端
./pocketbase serve
# 3. 启动前端
python3 -m http.server 8000

✍️ 写在最后

这次经历让我重新爱上了写代码。不是为了配置环境而写代码,是为了创造而写代码。 有时候,Less is More 不是一句口号,而是一种解脱。 如果你也厌倦了复杂的工程化,不妨试试这个”玩具”。毕竟,能用 200 行代码解决的问题,为什么要写 2000 行呢? 😉