最近我一直在想一个问题:现在的 Web 开发是不是太重了?
想做个简单的 Demo?先 npm init,再装 Webpack,配 Babel,装 React,装 Tailwind,装 ESLint……等你把环境搭好,我想做的那个灵感早就跑没影了。
于是,我决定搞点事情。我想做一个真正的极简全栈应用:
- ❌ 不需要 Node.js 环境
- ❌ 不需要构建工具 (Webpack/Vite)
- ❌ 不需要
node_modules(那 200MB 的黑洞) - ✅ 只要一个
index.html - ✅ 只要一个后端二进制文件 这就是我们今天的主角:Inspiration Collector (灵感收集器)。
🎯 成果展示:它长这样
这是一个深色模式优先的笔记应用,支持:
- 📝 实时记录灵感
- 🔐 用户登录/注册(数据隔离)
- 🎨 随机莫兰迪色卡片
- ✨ 悬浮对话气泡输入框
- 🌙 深夜护眼模式 最疯狂的是?整个前端代码就在一个 HTML 文件里,不到 200 行逻辑代码。
🛠️ 技术栈:这次我真的没装依赖
为了实现这个”疯狂”的想法,我选择了一套**「流浪地球」式技术栈**:
| 角色 | 技术 | 为什么选它? |
|---|---|---|
| 前端框架 | Alpine.js | Vue 的轻量替代,直接写在 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 行呢? 😉