intercooler.js 到 htmx 迁移指南

本指南的目的是:

开始之前

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

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

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

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

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

  2. 使用 htmx 事件系统与原生 JavaScript、alpine.jshyperscript。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-gethx-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 属性上的 scrollshow 修饰符
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 的文档 获取使用 _hyperscripthtmx:beforeOnLoad 事件 实现的示例
ic-targethx-target
ic-transform-response无。client-side-templates 扩展 支持通过模板引擎如 mustachehandlebarsnunjucks 进行 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:sendErrorhtmx:sseErrorhtmx:responseErrorhtmx:swapErrorhtmx: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