理念
htmx 的问题意识的起点,是 Web 标准里四处武断的限制。把它们逐一移除,HTML 便足以承载现代交互。
动机
过去十几年,前端工程把「界面」的重心整个搬进了浏览器:虚拟 DOM、状态管理、构建管线、 hydration……而 HTTP 与 HTML 这两个平台最原初的能力,反倒被框死在两个标签里。htmx 的立场是:不必另立王国,把 HTML 本身补齐即可。
通过移除这些武断的限制,htmx 将 HTML 完善为真正的超文本。
四大限制
README 连发四问,正是 htmx 要拆掉的四堵墙:
- 为什么只有 <a> 和 <form> 才能发起 HTTP 请求?——htmx:任何标签都可以,hx-get 放在 <div> 上照样生效。
- 为什么只有 click 和 submit 事件才能触发它们?——htmx:hx-trigger 支持任意事件:keyup、mouseenter、load、revealed、every 2s,乃至你自定义的事件。
- 为什么只能用 GET 和 POST?——htmx:hx-post、hx-put、hx-patch、hx-delete 一应俱全。
- 为什么只能替换*整个*页面?——htmx:响应的 HTML 片段可以精准交换进文档的任何位置,由 hx-target 与 hx-swap 说了算。
限制一旦移除,你会发现许多原先需要整层框架的功能——级联下拉、无限滚动、行内编辑、乐观更新——只消几个属性就能完成。
超文本与 HATEOAS
htmx 的理论根基可追溯到 Fielding 的 REST 学位论文中的 HATEOAS(Hypermedia As The Engine Of Application State,超文本即应用引擎):客户端不需要预知应用的流转逻辑,服务器返回的超媒体里自带着下一步可用的动作。这恰是早期 Web 的样貌——浏览器只是忠实地渲染文档、跟随链接。
AJAX 出现后,我们获得了「不刷新页面」的自由,却也失去了这份简洁:状态机被复写进 JavaScript。htmx 试图两者兼得——以超文本的简洁获得现代交互的强大。
<!-- 浏览器问:这一项怎么办? -->
<li hx-get="/item/42/actions" hx-trigger="mouseenter"
hx-target="#menu" hx-swap="innerHTML">
服务器返回的 HTML 里,带着此刻可用的按钮和它们的路径
</li>谱系
htmx 是 Carlo Meranca 的 intercooler.js 的继任者——后者验证了「用 HTML 属性驱动交互」在真实项目中的可行性;htmx 脱离 jQuery、体量压到约 14 KB,并把这套模式一路凝练成 v4.x 的超文本协议(v4 为从零重写:冒号分层事件名、显式继承、扩展随包内置)。
它不是什么
- 不是前端框架——不接管渲染循环,页面骨架仍是你手写的 HTML;
- 不是模板语言——服务端用什么(Bun、Go、Rails、Laravel……)皆随意,只要它返回 HTML;
- 不是零 JavaScript 教条——hx-on、事件钩子与
htmx API都留了口子,需要时可随时下场。
v4 重大更新
htmx 4 是一次从零重写(ground-up rewrite),把「现代浏览器已原生具备」当作新前提,甩掉了历史包袱。对个人项目而言,它同时是简化与增强:
协议层:更统一、更 HTML
- 传输换
fetch():XHR 退役,流式响应(streaming)成为一等公民; - 事件名冒号分层:
htmx:afterRequest→htmx:after:request,命名空间一目了然; - 继承改显式:祖先属性不再自动向下继承,改用
:inherited后缀(如 hx-boost:inherited)——心智更清晰,hx-disinherit 随之退役; - 扩展随包内置:
dist/ext/一应俱全,引入脚本即生效,hx-ext 声明不再需要;htmax.js更是把核心与热门扩展打成一个文件。
能力层:更多活交给声明
- hx-status:XXX:按 HTTP 状态码分流换入(
422送错误框、5xx干脆不换),取代旧responseHandling配置; - hx-pending:乐观 UI——请求在途先换入占位,真响应到达再覆盖;
- hx-live:客户端响应式引擎——
data-*存态、hx-on 改态、表达式绑态,简单交互零服务器往返; - hx-swap='upsert':列表按 id 差异合并(更新·插入·保留),不再整块重绘;
- 新增动词 hx-query、元素级 hx-config、hx-morph-skip 冻结节点等。
一句话:v2 让你用 HTML 发请求,v4 让 HTML 长出更多原本要写 JS 才有的行为。本站专门辟了一整章 v4 新纪元 逐条展开——属性增删、事件改名、头协议、状态码语义与迁移顺序,件件配现场演示;演示 末四件则是其中的招牌四件套。
想立即动手?翻到下一章 入门,从一行 <script> 开始。