intercooler.js 到 htmx 迁移指南

本指南的目的是:

开始之前

值得注意 Intercooler 的目标方法与 htmx 的做法之间的区别。

Intercooler 试图为其大部分功能提供自定义 HTML 属性。这体现在其较长的属性列表中,其中许多可以描述为便利性或客户端焦点性质。

htmx 遵循保持核心小巧的方法,提供较少的可用属性,主要集中在内容加载和交换上。

这种能力主要通过两种方式增强:

  1. 扩展。htmx 扩展框架允许通过自定义扩展/插件实现特定功能。例如 Intercooler 中内置的依赖机制,在 htmx 核心中不存在,但可以通过 扩展 获得。还有其他扩展可以实现 Intercooler 无法原生支持的新行为,例如 preload 扩展

  2. 使用 htmx 事件系统与原生 JavaScript、alpine.js 或 hyperscript。Hyperscript 是一种小型、开放的脚本语言,设计用于嵌入 HTML 中,灵感来自 HyperTalk,是 htmx 的配套项目。

htmx 还包含 Intercooler 中不存在的功能。这超出了本指南的范围。

最后,值得注意的是,这仍然是一个进行中的工作,可能会随时间变化。

迁移信息

本指南的其余部分以一系列表格形式呈现,每个表格尝试将 Intercooler 的以下常见功能区域映射到 htmx 的等效功能:

属性

注意:对于某些 Intercooler 属性(主要是客户端特定的属性,例如 ic-action 和相关属性),没有直接的 htmx 等效功能。相反,有一个称为 hyperscript 的小型表达性语言可用(参见 http://hyperscript.org),设计用于嵌入 HTML 中,并作为 htmx 的无缝伴侣。它允许您实现与一些特别是客户端焦点的 Intercooler 属性相同的行为,但以更灵活和开放的方式。

有关实际示例,请参见 htmx 关于 hyperscript 的文档,以及更多关于 hyperscipt 背后的哲学。

Intercoolerhtmx
ic-action无。使用 Hyperscript,例如 <button _="on click add .clicked">添加"clicked"类到我</button>。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-action-target无。使用 Hyperscript 目标表达式,例如 <div _="on click set .button.style.color to 'red'">将所有按钮设为红色</div>
ic-add-class无。使用 Hyperscript,例如 <button _="on click add .clicked">添加"clicked"类到我</button>。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-append-from无。可以通过使用例如 hx-get 和 hx-swap 值为 beforeend 实现等效功能
ic-attr-src无。无直接等效功能存在(待确认)
ic-confirmhx-confirm
ic-delete-fromhx-delete
ic-depshx-trigger="path-deps" 配合 path-deps="/foo/bar"。(需要 path-deps 扩展)
ic-disable-when-doc-hidden无。无直接等效功能存在(待确认)
ic-disable-when-doc-inactive无。无直接等效功能存在(待确认)
ic-enhancehx-boost
ic-fix-ids无。无直接等效功能存在(待确认)
ic-get-fromhx-get
ic-global-include无。hx-include 可用于实现类似功能
ic-global-indicator无。hx-indicator 可用于实现类似功能
ic-history-elthx-history-elt
ic-includehx-include
ic-indicatorhx-indicator
ic-limit-children无。无直接等效功能存在(待确认)
ic-local-vars无直接等效。hx-vars 可用于辅助。
ic-on-beforeSend无。使用 Hyperscript 配合事件(例如 htmx:beforeRequest)。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-on-beforeTrigger无。使用 Hyperscript 配合事件(例如 htmx:beforeRequest)。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-on-complete无。使用 Hyperscript 配合事件(例如 htmx:afterRequest)。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-on-error无。使用 Hyperscript 配合事件(例如 htmx:afterRequest)。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-on-success无。使用 Hyperscript 配合事件(例如 htmx:afterRequest)。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-patch-tohx-patch
ic-pause-polling无。可以使用类似 load polling 的技术
ic-poll无。可以通过定时触发加载实现等效功能,例如 <div hx-get="/news" hx-trigger="every 2s"></div>。参见 关于轮询的文档
ic-poll-repeats无。可以通过定时触发加载实现等效功能,例如 <div hx-get="/news" hx-trigger="every 2s"></div>。参见 关于轮询的文档
ic-post-errors-to无。可以通过事件捕获错误并通过 htmx.logger 机制 记录
ic-post-tohx-post
ic-prepend-from可以使用 hx-swap 属性 值为 beforeend 实现相同结果
ic-prompthx-prompt
ic-push-urlhx-push-url
ic-push-params在 htmx 中,GET 请求的参数会自动推送
ic-put-tohx-put
ic-remove-after无。参见 htmx 关于 hyperscript 的文档 获取使用 hyperscript 实现的示例
ic-remove-class无。使用 Hyperscript,例如 <button class="red" _="on click remove .red">移除"red"类从我</button>。参见 htmx 关于 hyperscript 的文档 和 hyperscript 文档 获取更多示例
ic-replace-target可以使用 hx-swap 属性 值为 outerHTML 实现相同结果
ic-scroll-offset无。无直接等效功能存在
ic-scroll-to-target参见 hx-swap 属性上的 scroll 和 show 修饰符
ic-select-from-responsehx-select
ic-src无。使用 hx-get 配合触发器或 path-deps 扩展
ic-sse-srchx-sse
ic-style-src无。无直接等效功能存在(待确认)
ic-swap-stylehx-swap
ic-switch-class无。参见 htmx 关于 _hyperscript 的文档 获取使用 _hyperscript 和 htmx:beforeOnLoad 事件 实现的示例
ic-targethx-target
ic-transform-response无。client-side-templates 扩展 支持通过模板引擎如 mustache、handlebars 或 nunjucks 进行 JSON 响应转换
ic-transition-duration无。可以通过 htmx 的交换机制和 CSS 过渡 实现等效功能
ic-trigger-delay使用 hx-trigger 配合 修饰符
ic-trigger-from使用 hx-trigger 配合 from: 子句
ic-trigger-onhx-trigger
ic-verb无。默认情况下 htmx 发送实际的 http 方法。但您可以通过 method-override 扩展 将所有非 GET 方法改为 POST

请求参数

Intercoolerhtmx
ic-request无。使用 HX-Request 头
_method无。使用 method-override 扩展及其提供的 X-HTTP-Method-Override 头
ic-element-id无
ic-element-name无
ic-target-id无。使用 HX-Target 头
ic-trigger-id无。使用 HX-Trigger 头
ic-trigger-name无。使用 HX-Trigger-Name 头
ic-current-url无。使用 HX-Current-URL 头
ic-prompt-value无。使用 HX-Prompt 头

请求头

Intercoolerhtmx
X-IC-RequestHX-Request
X-HTTP-Method-OverrideX-HTTP-Method-Override

响应头

Intercoolerhtmx
X-IC-TriggerHX-Trigger, HX-Trigger-After-Settle, HX-Trigger-After-Swap。参见 文档 获取更多详情
X-IC-RefreshHX-Refresh
X-IC-RedirectHX-Redirect
X-IC-Script无。无直接等效功能存在(待确认)
X-IC-CancelPolling无。响应 HTTP 响应码 286 以取消 轮询。
X-IC-ResumePolling无。无直接等效功能存在
X-IC-SetPollInterval无。如果使用 加载轮询,响应包含不同加载间隔的内容。
X-IC-Open无。无直接等效功能存在(待确认)
X-IC-PushURLHX-Push
X-IC-Remove无。无直接等效功能存在(待确认)
X-IC-Title无。无直接等效功能存在(待确认)
X-IC-Title-Encoded无。无直接等效功能存在(待确认)
X-IC-Set-Local-Vars无。无直接等效功能存在(待确认)

事件

注意:所有 htmx 事件 都以驼峰式和短横线式触发。

Intercoolerhtmx
log.ic无。通过 htmx.logger 实现等效功能。参见 事件 & 日志 文档
beforeAjaxSend.ichtmx:configRequest
beforeHeaders.ic无。无直接等效功能存在(待确认)
afterHeaders.ic无。无直接等效功能存在(待确认)
beforeSend.ichtmx:beforeRequest
success.ichtmx:afterOnLoad
after.success.ic近似等效:htmx:beforeSwap
error.ichtmx:sendError 或 htmx:sseError 或 htmx:responseError 或 htmx:swapError 或 htmx:onLoadError(待确认)
complete.ichtmx:afterRequest
onPoll.ic无直接等效。使用 加载轮询 时,可以使用 [htmx:load 事件]
handle.onpopstate.ichtmx:historyRestore(待确认)
elementAdded.ichtmx:load
pushUrl.ic待定
beforeHistorySnapshot.ichtmx:beforeHistorySave

JavaScript API 方法

Intercoolerhtmx
Intercooler.refresh(eltOrPath)PathDeps.refresh()(需要 path-deps 扩展)
Intercooler.triggerRequest(elt, handler)htmx.trigger()
Intercooler.processNodes(elt)htmx.process()
Intercooler.closestAttrValue(elt, attr)htmx.closest() 可与任何选择器一起使用
Intercooler.verbFor(elt)无。无直接等效功能存在(待确认)
Intercooler.isDependent(elt1, elt2)无。无直接等效功能存在(待确认)
Intercooler.getTarget(elt1)无。无直接等效功能存在(待确认)
Intercooler.processHeaders(elt, xhr)无。无直接等效功能存在(待确认)
Intercooler.ready(func(elt))htmx.onLoad()
LeadDyno.startPolling(elt)无。无直接等效功能存在(待确认)
LeadDyno.stopPolling(elt)无。无直接等效功能存在(待确认)

元标签

Intercoolerhtmx
<meta name="intercoolerjs:use-data-prefix" content="true"/>无。您可以简单地使用 data- 前缀而无需指定元标签。htmx 会自动识别这样的 htmx 属性:<a data-hx-post="/click">点击我!</a>
<meta name="intercoolerjs:use-actual-http-method" content="true"/>无。默认情况下 htmx 发送实际的 http 方法。但您可以通过 method-override 扩展 将所有非 GET 请求的动词改为 POST