让 React 代码行数减少78%的 htmlx 有这么神?

boyanx2天前技术教程1

家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

前言

htmx 使开发者可以使Attribute直接在 HTML 中访问 AJAX、CSS Transitions、WebSocket 和SSE等前端常用事件,从而使得构建强大功能的现代用户界面更加简单。

htmx 库的代码体积很小,启动Gzip压缩后大约~12k,而且无其他依赖,可扩展,兼容 IE11 。更加出彩的是,与React 相比,代码库大小减少了 67%。

1.什么是 HTMX,为什么它很重要?

1.1 HTMLX的起源

Carson Gross 创建了一个前端库 intercooler.js,Slogan是“Ajax With Attributes”,intercooler.js的目标很简单,目的在于简化前端 Web 开发的复杂性。 intercooler.js 的新版本在2021年更新到了 2.0 版,作者正式命名为 htmx,也就是本文的主角。

1.2 HTMLX的目标

HTMX 试图通过使用网络的原始模型来创建应用程序,从而利用 HTML 的强大力量。 使用HTMX的时候,开发人员无需编写复杂的JS代码来实现类似的功能,借助于HTMLX属性即可实现动态内容和更新。比如:进度条、延迟加载、无限滚动、内联验证等。

HTMX 不同于 Vue.js 、 React、Angular 等前端框架,需要通过客户端请求服务端的数据并动态渲染页面。 使用 HTMX的时候,客户端发出请求,服务端将返回完整的 Html 并更新页面。 同时,可以将 HTMX 与任何服务器端技术集成,因为应用程序逻辑主要由后端处理。

2.HTMX典型示例

2.1 建立Websocket

如果想在 htmx 中建立一个 WebSocket 连接,可以使用 hx-ws 属性来完成:

<div hx-ws="connect:wss:/chatroom">
    <div id="chat_room">
        ...
    </div>
    <form hx-ws="send:submit">
        <input name="chat_message">
    </form>
</div>

connect 声明建立了连接,而 send 声明告诉表单在提交时将值提交到套接字socket。

2.2 建立服务端发送事件SSE

服务器发送事件是服务器向浏览器发送事件的一种方式。 它为服务器和浏览器之间的通信提供了比 websockets 更高级别的机制。

如果想让一个元素通过 htmx 响应服务器发送的事件,需要做两件事:

  • 定义 SSE 源。 为此,请在父元素上添加一个 hx-sse 属性,其中包含一个连接 <url> 声明,该声明指定将从中接收服务器发送事件的 URL。
  • 使用 hx-trigger="sse:<event_name>" 语法定义由服务器发送的事件触发的此元素的后代元素
<body hx-sse="connect:/news_updates">
    <div hx-trigger="sse:new_news" hx-get="/news"></div>
</body>

2.3 HTMX 同步请求

假设希望一个元素的请求替代另一个元素的请求,或者想要等到另一个元素的请求完成后再发送另外一个请求,可以使用 hx-sync 属性。 比如下面的代码:

<form hx-post="/article">
    <input id="title" name="title" type="text" 
        hx-post="/validate" 
        hx-trigger="change"
    >
    <button type="submit">提交</button>
</form>

在不使用 hx-sync 的情况下,当填写并提交表单时,它会同时触发对 /change 和 /validate 的两个并行请求。使用 hx-sync="closest form:abort" 后,将监视表单上的请求并在存在表单请求时停止输入请求,或者在输入请求运行时启动:

// 同步请求示例
<form hx-post="/article">
    <input id="title" name="title" type="text" 
        hx-post="/validate" 
        hx-trigger="change"
        hx-sync="closest form:abort"
    >
    <button type="submit">提交</button>
</form>

2.4 轮询

如果想让一个元素轮询给定的 URL 而不是等待一个事件,可以使用带有 hx-trigger 属性的 every 语法:

<div hx-get="/news" hx-trigger="every 2s"></div>


这相当于告诉 htmx 每 2 秒,向 /news 发出 GET 请求并将响应加载到 div。 如果想停止从服务器响应中进行轮询,可以使用 HTTP 响应码 286 进行响应,该元素将取消轮询。

2.5 负载轮询

另一种可用于在 htmx 中实现轮询的技术是“负载轮询”,其中元素指定加载触发器和延迟,并用响应替换自身:

<div hx-get="/messages"
    hx-trigger="load delay:1s"
    hx-swap="outerHTML"
>
</div>

负载轮询在轮询有终点的情况下很有用,在该点轮询终止,例如当您向用户显示进度条时。

3.HTMX vs. React对比

从Github数据来看,目前React的star已经达到了202k,而htmlx只有10.7k,这个差距确实还很大,但是考虑到React项目创建已经11年,而htmlx只有3年,能达到10.7k已经确实不易。

接下来看看NPM的周下载量数据。

React的周下载量达到了惊人的16,759,035,而htmlx只有17,679,这个差距就像上面star的差距一样明显。当然,正如上文所说,htmlx项目的创建时间相对较短,所以在知名度、生态方面肯定还没法和React同日而语,但是17,679的周下载量确实也表明已经囊括了很大一部分用户群。

然后回到大家可能都比较关心的代码体积上,bundlephobia的官方数据表明htmlx压缩后达到了37.8k(远大于React@18.2.0的6.4k),即使启动Gzip压缩后也达到了13.2k(远大于React@18.2.0的2.5k)。所以,可以从侧面反应出,htmlx通过属性的方式确实使得代码行数减少了,但是库本身的代码体积却在悄悄增大。

4.本文总结

从总体来看,HTMX 确实比较有意思,特别是已经习惯了jQuery用法的开发者,可以在下一个项目中尝试使用HTMX。 本文介绍了如何使用HTMLX建立Websocket 、建立服务端发送事件SSE 、HTMX 同步请求 、轮询 、负载轮询等示例。同时对比了React和htmlx的开发者相关数据。

因为笔者也没有在生产项目中使用、部署过HTMLX项目,所以很多探索也就点到为止,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。


参考资料

https://www.infoq.cn/article/veskosrskc9xgiyygyku

https://github.com/bigskysoftware/htmx

https://thenewstack.io/htmx-html-approach-to-interactivity-in-a-javascript-world/

https://htmx.org/docs/

标签: chatroom

相关文章

python实现微信群消息自动转发简明教程

基本思路是,用 Python 模拟微信网页版登陆,接收到群里消息后,对文本、图片、分享等各类消息类型分别处理,并转发至其他群。主要源头是使用itchat,itchat是一个开源的微信个人号接口,pyt...

为什么堂堂微信数据库表名、字段名起的如此随意?

1.微信数据库解密微信数据库在在哪个文件夹EnMicroMsg.db的父文件加密规则是md5("mm" + uin)这样就可以准确的获取到db文件的位置.uin的获取:/data/da...

500 份源码合集——GitHub 热点速览 v.21.02

作者:HelloGitHub-小鱼干GitHub 项目名,如同变量命名,一个好的项目名能让你一眼就知道它是什么。500-AI-Machine-learning-Deep-learning-Comput...

Jessi,晒度假海报_jessi,晒度假海报怎么画

本月12日,杰西在自己的instagram上写道:“The bullies entering The chatroom in 3……2…1”并上传了多张照片。公开的照片中是杰西穿着比基尼摆姿势的样子。...

linux下C++ socket网络编程——即时通信系统(含源码)

一:项目内容本项目使用C++实现一个具备服务器端和客户端即时通信且具有私聊功能的聊天室。目的是学习C++网络开发的基本概念,同时也可以熟悉下Linux下的C++程序编译和简单MakeFile编写二:需...

Vue3.0+Tornado6.1发布订阅模式打造异步非阻塞实时=通信聊天系统

“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。