htmx

理念

htmx 的问题意识的起点,是 Web 标准里四处武断的限制。把它们逐一移除,HTML 便足以承载现代交互。

动机

过去十几年,前端工程把「界面」的重心整个搬进了浏览器:虚拟 DOM、状态管理、构建管线、 hydration……而 HTTP 与 HTML 这两个平台最原初的能力,反倒被框死在两个标签里。htmx 的立场是:不必另立王国,把 HTML 本身补齐即可

通过移除这些武断的限制,htmx 将 HTML 完善为真正的超文本。

四大限制

README 连发四问,正是 htmx 要拆掉的四堵墙:

  1. 为什么只有 <a><form> 才能发起 HTTP 请求?——htmx:任何标签都可以,hx-get 放在 <div> 上照样生效。
  2. 为什么只有 clicksubmit 事件才能触发它们?——htmx:hx-trigger 支持任意事件:keyup、mouseenter、load、revealed、every 2s,乃至你自定义的事件。
  3. 为什么只能用 GET 和 POST?——htmx:hx-posthx-puthx-patchhx-delete 一应俱全。
  4. 为什么只能替换*整个*页面?——htmx:响应的 HTML 片段可以精准交换进文档的任何位置,由 hx-targethx-swap 说了算。
限制一旦移除,你会发现许多原先需要整层框架的功能——级联下拉、无限滚动、行内编辑、乐观更新——只消几个属性就能完成。

超文本与 HATEOAS

htmx 的理论根基可追溯到 Fielding 的 REST 学位论文中的 HATEOAS(Hypermedia As The Engine Of Application State,超文本即应用引擎):客户端不需要预知应用的流转逻辑,服务器返回的超媒体里自带着下一步可用的动作。这恰是早期 Web 的样貌——浏览器只是忠实地渲染文档、跟随链接。

AJAX 出现后,我们获得了「不刷新页面」的自由,却也失去了这份简洁:状态机被复写进 JavaScript。htmx 试图两者兼得——以超文本的简洁获得现代交互的强大。

HATEOAS 的一例 · 响应即动作
<!-- 浏览器问:这一项怎么办? -->
<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:afterRequesthtmx: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-confighx-morph-skip 冻结节点等。
一句话:v2 让你用 HTML 发请求,v4 让 HTML 长出更多原本要写 JS 才有的行为。本站专门辟了一整章 v4 新纪元 逐条展开——属性增删、事件改名、头协议、状态码语义与迁移顺序,件件配现场演示;演示 末四件则是其中的招牌四件套。

想立即动手?翻到下一章 入门,从一行 <script> 开始。

静态快照 · 部分演示需动态服务器