一个让我怀疑人生的重构决定
去年年底,我看着我们那个用Next.js 15构建的SaaS后台,陷入了沉思。200多个组件文件,47个API路由,状态管理用Zustand,缓存用TanStack Query,表单用React Hook Form —— 这还只是一个"中等复杂度"的后台管理系统。
团队里新来的实习生花了整整两周才搞清楚一个页面的数据流。我说:“我们重构吧。”
然后我做了一个全团队都反对的决定:用HTMX。
三个月后,C端用户反馈页面"突然变快了",NPS从32升到了58。代码行数从12万行缩减到3.5万行。最让我震惊的是,新同事入职第二天就能独立提交PR。
HTMX到底是什么?一句话解释
HTMX是一个让你在HTML标签里直接写AJAX请求的库。你不需要写一行JavaScript就能实现SPA的交互体验。
<button hx-post="/api/click" hx-swap="outerHTML">
点击我
</button>
就这么简单。点击按钮,发POST请求,服务器返回HTML片段,自动替换按钮。不用Redux,不用useEffect,不用处理loading状态。
HTMX在2025年成为GitHub增长最快的开源项目之一,2026年Q1的npm下载量同比增长了470%。它不是一个新概念,它是"超媒体"这个被遗忘的Web原生设计模式的回归。
为什么SSR没解决它承诺的问题
Next.js的SSR(服务端渲染)确实解决了一些问题:首屏加载快了,SEO好了。但它带来了三个新问题:
第一,复杂性爆炸。 你写好服务端逻辑,还要写客户端逻辑,还要处理"什么时候在服务端渲染、什么时候在客户端水合"。一个简单的表单提交,你需要:
- 一个API Route Handler
- 一个React Server Component
- 一个Client Component(因为表单需要交互)
- 一个Server Action
- 一套状态管理来处理loading/error/success
第二,水合(Hydration)是性能杀手。 即使你的页面在服务器端渲染好了,浏览器仍然需要下载整个React运行时、解析JS、执行水合。在慢速设备上,用户看到页面后还要等2-4秒才能交互。HTMX没有这个问题 —— 服务器返回的就是真实的HTML,浏览器直接渲染,零水合开销。
第三,调试地狱。 “这个错误是在服务器端还是客户端发生的?“这个问题让我们的on-call工程师崩溃了无数次。HTMX的调试极其简单:打开浏览器开发者工具,看Network面板,请求和响应一目了然。
实测数据:HTMX vs Next.js SSR
我们在同一套业务逻辑上做了A/B测试(后端都是Go,只换前端):
| 指标 | Next.js SSR | HTMX |
|---|---|---|
| 首屏加载时间 (LCP) | 2.1s | 0.6s |
| 交互响应时间 (INP) | 180ms | 65ms |
| JS Bundle大小 | 347KB | 14KB(HTMX) |
| 前端代码行数 | 120,000 | 35,000 |
| 新成员上手时间 | 14天 | 2天 |
HTMX版本的交互响应时间只有Next.js版本的三分之一。原因很简单:HTMX不需要客户端路由、虚拟DOM diff、状态管理状态同步。它走的是浏览器原生HTTP请求-响应模型,浏览器本身就是最好的状态管理器。
HTMX的黑暗面:什么时候千万别用
我必须在摔坑之前告诉你:HTMX不是银弹。以下场景千万别用HTMX:
高交互性应用。 如果你在做在线文档编辑器、设计工具、游戏,HTMX会是一个灾难。这类应用需要大量客户端状态和实时渲染,HTMX的"服务器返回HTML"模式会带来大量不必要的网络往返。
离线优先应用。 HTMX本质上是服务端驱动的,没有网络就没有页面更新。如果你的应用需要在离线状态下正常工作,PWA + Service Worker + 客户端渲染才是正确的选择。
SEO要求极高的C端页面。 HTMX的页面是动态加载的,搜索引擎爬虫不一定能正确渲染。虽然2026年Google的爬虫对JS支持已经相当好了,但HTMX的动态内容仍然不如纯SSR友好。
团队不熟悉服务端渲染。 HTMX要求你的后端能返回HTML片段,而不是JSON。如果你的后端团队习惯了"纯API"模式,切换成本会很高。
我们是怎么迁移的:一个可复用的策略
我们没有一次性重写整个应用,而是用了"绞杀者模式”:
- 保留后端API不变。 Go后端继续提供JSON API,同时新增一个HTML渲染层(用Go的html/template)。
- 页面逐个迁移。 从最简单的列表页开始,然后是表单页,最后是复杂的仪表盘。
- 用Alpine.js补位。 对于需要客户端交互的地方(如模态框、下拉菜单),我们用Alpine.js(14KB)而不是React,保持前端轻量。
- 监控和回滚。 每个页面迁移后,对比旧版和新版的关键指标,发现退化立即回滚。
一个金句收尾
2026年的前端世界,React生态像一个装备齐全的瑞士军刀 —— 强大但沉重。HTMX像一个锋利的菜刀 —— 只做一件事,但做得极其好。
选什么工具,取决于你是在野外求生还是在厨房做饭。大多数SaaS后台,其实只需要一把菜刀。