当前位置: 首页 > news >正文

前端工作方式要换了?HTMX简介:无需JavaScript的动态HTML

HTMX允许你使用扩展的HTML语法代替 JavaScript 来实现交互性。HTMX 在标记中直接为你提供HTTP 交互,并支持许多其他交互需求,无需求助于 JavaScript。这是一个有趣的想法,可能最终会影响到web前端的工作方式。让我们看看如何使用HTMX以及它的吸引力。

什么是HTMX?

HTMX已经存在了一段时间,但它一直是一个不太为人知的项目。它最近被接受到 GitHub Accelerato r中可能会改变这一切。基本的想法是取代那些需要模板化的 JavaScript 和 HTML 交互的常见用例,仅使用HTML语法,而不是 JavaScript。许多交互与HTMX一起变得声明式。

这听起来很有前景,不是吗?每个web开发者都知道有很多常见的模板化用例。HTMX的创建者Carson Gross表示,他希望“完善HTML作为超文本,增加其表现力,使其成为更先进、现代web应用程序的有力竞争者。”

为了快速了解,看看这个HTMX演示。基本上,我们点击一个按钮来启用对用户对象的字段进行编辑。数据实际上是PUT到一个后端端点。你可以在图1中看到演示 —— 在你点击“显示”后注意底部框架中的网络交互。

88c3c7c9cdecde810276759de1f1ef7e.png

通常,无论你使用什么框架,这都需要某种形式的JavaScriptHTMX 将交互转变为两块标记:一个用于显示UI,一个用于编辑UI,如Listing 1所示。

Listing 1. HTMX中的用户更新

<div hx-target="this" hx-swap="outerHTML"><div><label>First Name</label>: Joe</div><div><label>Last Name</label>: Blow</div><div><label>Email</label>: joe@blow.com</div><button hx-get="/contact/1/edit" class="btn btn-primary">点击编辑</button>
</div>
<!-- 编辑: -->
<form hx-put="/contact/1" hx-target="this" hx-swap="outerHTML"><div><label>First Name</label><input type="text" name="firstName" value="Joe"></div><div class="form-group"><label>Last Name</label><input type="text" name="lastName" value="Blow"></div><div class="form-group"><label>Email Address</label><input type="email" name="email" value="joe@blow.com"></div><button class="btn">提交</button><button class="btn" hx-get="/contact/1">取消</button>
</form>

如果你看Listing 1中的标记,很容易看出发生了什么:hx-swap属性为编辑前的 div 提供HTML,outerHTML告诉框架它如何与内部的动态内容相关。可编辑版本作为一个表单元素到达,其中包含x-put属性,该属性标识PUT HTML方法和要使用的端点。

问题变成,HTMX如何实现这种“交换”和后续的PUT,而不做任何JavaScript呢?答案很简单:它使用服务器端渲染的HTML作为编辑标记,并将表单封装抽象到框架中。JavaScript 仍然在幕后工作。实际上,我们得到了一个更细粒度的 HTML 语法,它只能加载片段而不是整个页面,并且可以提交Ajax请求。

这是DRY原则在行动中的一个有趣的例子。即使使用像React这样的东西,从一个表单到另一个表单也有一定数量的模板代码。当然,HTMX并没有完全消除这一点,但它已经将工作转移到了服务器上。

HTMX的服务器端

现在,让我们考虑等式的服务器端。有许多使用HTMX的服务器端技术的例子,因为,正如Gross所说,HTMX是“后端不可知的。它不关心你使用什么后端,只要它产生HTML。” 为了了解它是如何工作的,让我们看一个使用Express和Pug HTML模板引擎的TODO示例。这个例子是经典TODO应用程序的实现。

首先,现有的待办事项从Express输出,命令如下:

res.render('index', { todos: filteredTodos, filter, itemsLeft: getItemsLeft() });

此命令使用内存中的待办事项集合,并使用一个Pug模板渲染它们,该模板是典型的格式,但它包括驱动HTMX交互的特殊hx-属性。例如,用于POST新待办事项的表单显示在Listing 2中。

Listing 2. 具有HTMX属性的表单POST
form(hx-post="/todos", hx-target="#todo-list", hx-swap="afterbegin", _="on htmx:afterOnLoad set #txtTodo.value to ''")input#txtTodo.new-todo(name="todo",placeholder='需要做什么?', autofocus='')

你可以在这里看到 afterbegin 属性如何工作,将新内容放在列表中的正确位置。on htmx脚本是 Hyperscript 的一个例子,这是一种简化的脚本语言。它经常与HTMX一起使用,但并不严格属于HTMX或需要使用它。实际上,on htmx在这里用于处理在创建新的待办事项后设置输入表单的值。

作为另一个例子,Listing 3显示了待办事项编辑的Pug模板。

Listing 3. 在PUG中编辑服务器端模板
form(hx-post="/todos/update/" + todo.id)input.edit(type="text", name="name",value=todo.name)

在Listing 3中,标记使用hx-post属性来指示发送已编辑待办事项的JSON的位置。从这些例子中得到的结论是我之前提到的:服务器负责提供HTML(带有HTMX标签)的适当大小的块,以填充前端为其各种交互所需的屏幕的不同部分。HTMX客户端将根据属性将它们放在它们应该在的位置,并处理发送由服务消费的适当数据。

负责接收数据的端点可以像典型的端点一样操作,区别在于响应应该是必要的HTMX。例如,在Listing 4中,你可以看到Express服务器如何处理POST以创建新的待办事项。

Listing 4. 处理待办事项创建
app.post('/todos', (req, res) => {const { todo } = req.body;const newTodo = { id: uuid(),name: todo, done: false };todos.push(newTodo);let template = pug.compileFile('views/includes/todo-item.pug');let markup = template({ todo: newTodo});template = pug.compileFile('views/includes/item-count.pug');markup  += template({ itemsLeft: getItemsLeft()});res.send(markup);
});

Listing 4 是一个典型的POST body处理器,它从表单数据中取出值并使用它创建一个新的业务对象(newTodo)。然后,它使用这些值填充Pug模板并将其发送回客户端,用作前端的Todo列表中的插入。

其他服务器端技术的例子包括使用HTMX与Java世界中的Spring Boot和Thymeleaf以及Python世界中的Spring Boot和Django。

使用HTMX的客户端模板

HTMX支持的这种模式的一个变种是使用客户端模板。这是一个在客户端运行的层,接受来自服务器的JSON,并在那里进行标记转换。当我问Gross关于使用带有 JSON的 RESTful 服务时,他指出这是可能的,但前提是REST通常被误解。

一个相反的问题是,我们如何向服务器提交JSON,而不是默认的表单编码?再次,有一个扩展可以做到这一点;即,JSON-ENC

结论

考虑HTMX会导致一堆想法同时到来。结论是这个概念和这个项目本身一样有益。作为一个成熟的项目的HTMX可能最终不会像今天这样工作,但它已经证明是一个有益的影响。最吸引人的是处理所有这些非常常见的Ajax风格的请求的想法,这通常意味着使用fetch()或类似的东西,只用一个HTML属性。这只是更简单、更干净,并且将一切都保持在一个地方。很明显标记做了什么。

我对服务器端标记生成持更加矛盾的态度。开发者习惯于为此目的处理JSON;引入标记只是在客户端创建中增加了一个步骤。我们已经看到了许多服务器端方法,它们总是似乎模糊了HTML、JavaScript和CSS的强大组合,这三者最终总是胜出。也许这次会不同。这是一个大的摆动。

当然,还有客户端模板选项,它使服务器成为一个熟悉的JSON发射器。我试图想象它在一个大型软件项目中是如何工作的。它会减少大规模项目中的总体复杂性吗?

Gross对复杂性有自己的想法。你可以看到他的想法在HTMX的设计中得到体现。这项技术希望通过将我们带回到Hypertext作为web应用程序的状态机制来简化事情。这个例子显示了这个想法的运作。使用JSON作为协议意味着使客户端更加智能、更加复杂,并使架构变得不那么自描述。

也许它都可以工作。如果我们避免了固有的复杂性,扩展了底层语言HTML,实际上处理现代需求,比如Ajax,我们可以回到一个更简单的时代。标记将再次成为中心数据描述符,并足以描述UI以及线上的数据。

欢迎长按图片加刷碗智为好友,定时分享 Vue React Ts 等。

fd31e2f96af6d1b6368f82a6e44269f5.png

最后:

vue2与vue3技巧合集

VueUse源码解读

82ffa521a4add873df400e8a69685da0.jpeg

相关文章:

前端工作方式要换了?HTMX简介:无需JavaScript的动态HTML

HTMX允许你使用扩展的HTML语法代替 JavaScript 来实现交互性。HTMX 在标记中直接为你提供HTTP 交互&#xff0c;并支持许多其他交互需求&#xff0c;无需求助于 JavaScript。这是一个有趣的想法&#xff0c;可能最终会影响到web前端的工作方式。让我们看看如何使用HTMX以及它的…...

动手学深度学习—使用块的网络VGG(代码详解)

目录 1. VGG块2. VGG网络3. 训练模型 1. VGG块 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 1.带填充以保持分辨率的卷积层&#xff1b; 2.非线性激活函数&#xff0c;如ReLU&#xff1b; 3.汇聚层&#xff0c;如最大汇聚层。 定义网络块&#xff0c;便于我…...

性能优化:JIT即时编译与AOT提前编译

优质博文&#xff1a;IT-BLOG-CN 一、简介 JIT与AOT的区别&#xff1a; 两种不同的编译方式&#xff0c;主要区别在于是否处于运行时进行编译。 JIT:Just-in-time动态(即时)编译&#xff0c;边运行边编译&#xff1a;在程序运行时&#xff0c;根据算法计算出热点代码&#xf…...

抖音同城榜:探索城市新潮流

随着科技的飞速发展&#xff0c;短视频已经成为了人们日常生活中不可或缺的一部分。作为短视频领域的佼佼者&#xff0c;抖音一直致力于为用户带来更丰富、更有趣的短视频内容。抖音同城榜应运而生&#xff0c;成为了最新、最热门的话题聚集地&#xff0c;吸引了大量潮流达人和…...

云表|低代码开发崛起:重新定义企业级应用开发

低代码开发这个概念在近年来越来越受到人们的关注&#xff0c;市场对于低代码的需求也日益增长。据Gartner预测&#xff0c;到2025年&#xff0c;75&#xff05;的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 那么&#xff0c;为什…...

【算法题】2906. 构造乘积矩阵

题目&#xff1a; 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元素 p[i][j] &#xff0c;它的值等于除了 g…...

机器学习基础之《回归与聚类算法(4)—逻辑回归与二分类(分类算法)》

一、什么是逻辑回归 1、逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单和高效&#xff0c;在实际中应用非常广…...

UWB安全数据通讯STS-加密、身份认证

DW3000系列才能支持UWB安全数据通讯&#xff0c;DW1000不支持 IEEE 802.15.4a没有数据通讯安全保护机制&#xff0c;IEEE 802.15.4z中指定的扩展得到增强&#xff08;在PHY/RF级别&#xff09;&#xff1a;增添了一个重要特性“扰频时间戳序列&#xff08;STS&#xff09;”&a…...

vue3中去除eslint严格模式

vue3中去除eslint严格模式 1、全局搜索&#xff1a;extends 2、一般在package.json或者vue.config.js中&#xff0c;直接删除掉vue/standard&#xff0c;重启项目。(在package.json文件中&#xff0c;编译不允许有注释&#xff0c;所以直接删掉)...

Win10如何彻底关闭wsappx进程?

Win10如何彻底关闭wsappx进程&#xff1f;在Win10电脑中&#xff0c;用户看到了wsappx进程占用了大量的系统资源&#xff0c;所以想结束wsappx进程&#xff0c;提升电脑的运行速度。但是&#xff0c;用户们不知道彻底关闭掉wsappx进程的方法&#xff0c;那么接下来小编就给大家…...

docker 安装 sftpgo

sftpgo 简介 sftpgo 是一个功能齐全且高度可配置的 SFTP 服务器&#xff0c;具有可选的 HTTP/S、FTP/S 和 WebDAV 支持。支持多种存储后端&#xff1a;本地文件系统、加密本地文件系统、S3&#xff08;兼容&#xff09;对象存储、Google 云存储、Azure Blob 存储、SFTP。 官…...

threejs (一) 创建一个场景

引入 npm install three import * as THREE from three;const scene new THREE.Scene();或者使用bootCDN复制对应的版本连接 <script src"https://cdn.bootcdn.net/ajax/libs/three.js/0.156.1/three.js"></script>基础知识 场景、相机、渲染器 通过…...

二分查找,求方程多解

1.暴力遍历&#xff1a; 解为两位小数&#xff0c;故0.001的范围肯定可以包含&#xff08;零点存在&#xff09; 2.均分为区间长度为1的小区间&#xff08;由于两解&#xff0c;距离不小于1&#xff09;&#xff0c;一个区间最多一个解 1.防止两边端点都为解 2&…...

代码随想录算法训练营第二十九天 | 回溯算法总结

​ 代码随想录算法训练营第二十九天 | 回溯算法总结 1. 组合问题 1.1 组合问题 在77. 组合中&#xff0c;我们开始用回溯法解决第一道题目&#xff1a;组合问题。 回溯算法跟k层for循环同样是暴力解法&#xff0c;为什么用回溯呢&#xff1f;回溯法的魅力&#xff0c;用递…...

运算方法和运算电路

一、逻辑门电路 1、逻辑门电路基础总结 2、异或运算妙用 3、逻辑常用公式 二、加法器&#xff08;重点&#xff09; 1、标志位的生成原理 2、加法器总结 三、多路门选择器&#xff0c;三态门...

计算机网络篇之TCP滑动窗口

文章目录 前言概述 前言 在网络数据传输时&#xff0c;若传输的原始数据包比较大&#xff0c;会将数据包分解成多个数据包进行发送。需要对数据包确认后&#xff0c;才能发送下一个数据包。在等待确认包的这个过程浪费了大量的时间&#xff0c;不过还好TCP引入了滑动窗口的概念…...

本地安装telepresence,访问K8S集群 Mac(m1) 非管理員

kubeconfig 一&#xff0e;安装telepresence 1.安装 Telepresence Quickstart | Telepresence &#xff08;1&#xff09;brew install datawire/blackbird/telepresence 2.配置 目录kubectl 将使用默认的 kubeconfig 文件&#xff1a;$HOME/.kube/config 创建文件夹&…...

今日思考(2) — 训练机器学习模型用GPU还是NUP更有优势(基于文心一言的回答)

前言 深度学习用GPU&#xff0c;强化学习用NPU。 1.训练深度学习模型&#xff0c;强化学习模型用NPU还是GPU更有优势 在训练深度学习模型时&#xff0c;GPU相比NPU有优势。GPU拥有更高的访存速度和更高的浮点运算能力&#xff0c;因此更适合深度学习中的大量训练数据、大量矩阵…...

8.3 C++ 定义并使用类

C/C语言是一种通用的编程语言&#xff0c;具有高效、灵活和可移植等特点。C语言主要用于系统编程&#xff0c;如操作系统、编译器、数据库等&#xff1b;C语言是C语言的扩展&#xff0c;增加了面向对象编程的特性&#xff0c;适用于大型软件系统、图形用户界面、嵌入式系统等。…...

Git学习笔记——超详细

Git笔记 安装git&#xff1a; apt install git 创建版本库&#xff1a; git init 添加文件到版本库&#xff1a; git add 文件 提交文件到仓库&#xff1a; git commit -m “注释” 查看仓库当前的状态信息&#xff1a; git status 查看修改内容和之前版本的区别&am…...

从malloc到memsafe_c:2026规范强制要求的4类API替换清单,不改业务逻辑也能通过ISO/IEC 17961合规审计

第一章&#xff1a;现代 C 语言内存安全编码规范 2026 成本控制策略在嵌入式系统、操作系统内核与高性能服务开发中&#xff0c;C 语言仍占据不可替代地位&#xff0c;但传统内存操作&#xff08;如裸指针算术、未校验的 malloc 返回值、strcpy 类危险函数&#xff09;已成为安…...

告别龟速!手把手教你给Termux换清华源,pkg update飞起来

告别龟速&#xff01;手把手教你给Termux换清华源&#xff0c;pkg update飞起来 每次在Termux里执行pkg update时&#xff0c;看着那缓慢的进度条一点点往前挪&#xff0c;是不是感觉时间仿佛被拉长了&#xff1f;作为Android上最强大的终端模拟器&#xff0c;Termux的官方源服…...

策略模式的思想的经典案例分析

我们先来假设一个场景&#xff1a;作为杂货店老板&#xff0c;你还需要根据不同季节或促销活动选择不同的定价策略。比如在淡季时&#xff0c;货物打9折销售。大批量采购时&#xff0c;提供85折优惠。实际上&#xff0c;这就是策略模式的思想。// 定义策略接口 interface Prici…...

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

R语言pls包实战&#xff1a;手把手教你用偏最小二乘(PLS)搞定高维数据回归&#xff08;附完整代码与数据标准化避坑指南&#xff09; 当你面对一份包含数十个自变量的数据集时&#xff0c;传统线性回归往往会陷入"维度诅咒"。这时偏最小二乘回归(PLS)就像一把瑞士军刀…...

ESB企业服务总线怎么选?2026国产ESB厂商盘点:能力与差异分析

在数字化转型深水区的2026年&#xff0c;“ESB&#xff08;企业服务总线&#xff09;是否已经过时”的争议从未停止。不少声音认为&#xff0c;iPaaS、云原生集成工具已完全替代ESB&#xff0c;但IDC最新报告显示&#xff0c;国内企业集成平台市场仍保持18%年增速&#xff0c;其…...

AI东风下新易盛市值一年涨10倍,146名员工凭股权激励坐拥35亿账面市值

新易盛市值一年涨10倍&#xff0c;员工股权激励大丰收从100亿到500亿&#xff0c;新易盛用了快十年&#xff1b;而从500亿到6000亿&#xff0c;仅用了一年时间。这家诞生于成都的光模块企业&#xff0c;去年4月至今股价翻近10倍&#xff0c;成为成都市值最高的公司。在2024年&a…...

SpringBoot + JAIN-SIP 实战:手把手教你搭建国标GB28181摄像头管理后台(附完整代码)

SpringBoot与JAIN-SIP构建国标GB28181平台实战指南 1. 国标视频监控平台的技术架构解析 GB28181标准作为国内视频监控领域的核心协议&#xff0c;定义了设备互联的完整规范体系。这套标准主要包含三个关键组成部分&#xff1a; SIP信令控制层&#xff1a;负责设备注册、会话…...

debian12安装GCC15

debian12安装GCC15 前几天想把boost里面的占位写替换成fmt::format&#xff0c;结果format非要依赖第三方库&#xff0c;还需要vcpkg&#xff0c;而且c的vcpkg包管理真的太烂了&#xff0c;和golang差距比天大&#xff0c;最后看到C20里面是有format包集成了&#xff0c;但是需…...

从仿真到实战:如何用VPI+Matlab复现一篇光通信顶会论文的DSP算法?

从仿真到实战&#xff1a;如何用VPIMatlab复现光通信顶会论文的DSP算法&#xff1f; 在光通信领域&#xff0c;学术论文中提出的数字信号处理&#xff08;DSP&#xff09;算法往往需要经过严格的仿真验证才能应用于实际工程。本文将带你深入探索如何利用VPI和Matlab联合仿真环境…...

GESP2023年6月认证C++三级( 第一部分选择题(1-8))

&#x1f3f0; 第一题&#xff1a;程序变身魔法1、&#x1f9d9;‍♂️老师说&#xff1a;你写了一段程序&#xff0c;就像写了一张“魔法咒语纸”。但是电脑看不懂人类语言&#xff0c;它只懂“机器语言”。2、❓问题&#xff1a;要让程序真正跑起来&#xff0c;需要哪一步&am…...