htmx 只是另一个 JavaScript 框架吗?老外都吵上了

2024-01-15 15:04
文章标签 java script 框架 老外 htmx

本文主要是介绍htmx 只是另一个 JavaScript 框架吗?老外都吵上了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对 htmx 最常见的批评之一通常来自第一次听说它的人,如下所示:

你抱怨现代前端框架的复杂性,但你的解决方案只是另一个复杂的前端框架。

这是一个很好的反对意见!对于你引入到项目中的任何第三方 (3P) 代码,你都有权提出疑问。即使你没有亲自编写 3P 代码,但只要将其纳入项目,你就必须了解它–如果你想升级它,就必须重新了解它。

让我们将这些批评分解成其组成部分,并确定htmx在其声称要解决的伤害中到底有多少沉迷其中。

库和框架的区别

一些 htmx 捍卫者向我们求助:“htmx 不是一个框架,它是一个库。”这可能是不正确的。

“框架”是一个口语术语——对于某些第三方代码从“库”演变为“框架”的程度没有硬性规定——但我们仍然应该尝试定义它。在这种情况下:

  • - 3P 代码,其 API 不会显着影响应用程序的其余部分
  • 框架 - 3P 代码,其 API 决定应用程序的整体结构

如果你更喜欢比喻:库是你添加到机器上的一个齿轮,框架是一个预先构建的机器,你可以通过自定义其齿轮来控制它。

这种区别虽然可能很模糊,但很重要,因为它描述了替换某些第三方代码的容易程度。例如,使用 CSV 解析库的 JavaScript 服务可能可以轻松地交换不同的 CSV 解析库;然而,使用 NextJS 框架的 JavaScript 服务可能在其整个使用寿命中都依赖于 NextJS,因为大量代码是在假设它与 NextJS 结构交互的情况下编写的。

因此,如果你的服务是在框架之上构建的,则其使用寿命与该框架的使用寿命相关。如果该框架被放弃,或被鄙视,或以其他方式不受欢迎,那么修改项目的难度将稳步增加,直到你放弃修改它,并最终将其完全封存。

这就是人们在问“htmx 只是另一个 JavaScript 框架吗?”时所担心的问题。他们希望确保自己不会致力于一个很快就会过时的系统,就像过去的许多 Web 开发框架一样。

那么:htmx是一个框架吗?它是否会很快被淘汰,在其迅速消亡后留下一系列无法​​维护的网站?

htmx(通常)是一个框架

对我们社区关于这个问题的持续争论表示歉意——我认为 htmx 显然是一个框架,至少在大多数用例中是这样。但这确实取决于你如何使用它。

无论你在项目中的何处使用 htmx,你都会在 HTML 中包含 htmx 属性(即 hx-posthx-target ),编写使用 htmx 格式数据调用的端点(使用某些请求标头),并从这些端点返回以 htmx 期望的方式格式化的数据(带有 hx-* 控件的 HTML)。所有这些属性以及标头和端点相互交互以创建一个系统,元素通过该系统通过网络请求进入和退出 DOM。

如果你使用 htmx 来处理网站的大量网络请求,那么在应用程序中包含 htmx 会对项目的结构产生重大影响,从构建前端标记的方式到端点进行的数据库查询。这是类似框架的行为,在这种情况下,htmx 不能轻易被替换。

你绝对可以以类似库的方式使用 htmx,为网页的几个部分添加动态功能。但你也可以用这种类似于库的方式编写 React,没有人会说 React 不是一个框架。我只想说,许多在应用程序中使用 htmx 的人都是为了满足 htmx 的需求,将其作为构建超媒体应用程序的框架。

如果能发挥 htmx 的优势,那么使用 htmx 构建程序的效果会更好。如果你真的坚持,可以发送 JSON 格式的表单体。但你不应该这样做!application/x-www-form-urlencoded 格式的表单体并编写一个可接受它们的端点会更简单。如果你真的坚持,你可以编写一个在多个不同客户端之间重复使用的端点。但你不应该这样做!将数据和超媒体 API 分离到不同的 URL 中会更简单。是的,htmx 可以作为一个库使用,但或许也可以让它成为你的框架。

然而,这并不意味着 htmx 只是另一个 JavaScript 框架,因为 htmx 具有其他框架没有的巨大优势:HTML。

htmx 用于编写 HTML

假设你使用 htmx 作为框架 - 它是 JavaScript 框架吗?从一种明显的意义上来说,是的:htmx 是用大约 4k 行 JS 实现的。但从另一个更重要的意义上来说,它不是:React、Svelte、Solid 等等,你写的 JS(X) 框架会转换成 HTML; htmx 只是让你编写 HTML。这就免去了可能会让你放弃其他框架的各种维护工作。

当你想要升级或更改某些依赖项,但你使用的框架与该更改不兼容时,代码库往往会陷入困境。 Java 是这里最臭名昭著的罪犯——生产中有数百万行 Java 永远不会离开 Java 8,因为升级 Spring 太难了——但 npm 包生态系统紧随其后。当你使用 htmx“框架”时,你永远不会遇到这个问题,因为 htmx 是一个零依赖、客户端加载的 JavaScript 文件,因此保证它永远不会与你的服务器所依赖的任何构建过程或依赖链发生冲突。

浏览器渲染 HTML,因此无需编译器或转译器即可使用 htmx。虽然许多 htmx 用户很乐意使用 JSX 渲染 API 响应,但 htmx 与经典模板引擎配合得很好,使其可移植到你喜欢的任何语言。不管你对 Django 和 Rails 有何看法,但它们在 2008 年和今天都很重要 — htmx 与它们无缝集成。这是 htmx 驱动开发的一个反复出现的主题:htmx 与新旧开发工具都能很好地配合,因为所有这些工具的共同点是 HTML,而 htmx 是用于编写 HTML 的。

推动用户主要通过 HTML 而不是 JS 来定义其应用程序的行为有太多优点,本文无法一一介绍,因此我将重点谈谈人们最痛恨的 JavaScript 成名之作:“churn”。根据你编写 React 应用程序的时间,你可能在编写表单时使用了受控类组件、react Hooks 或这种实验性的 <form> 扩展。这确实让人抓狂,尤其是如果你和我一样,最初是通过类组件学习如何制作网络表单的。

然而,无论你是何时编写的 htmx 应用程序,htmx 表单的行为都是以与普通 HTML 表单大致相同的方式定义的:使用 <form>。随着 htmx 增加了额外的网络功能,你终于可以使用 PUT 请求并控制响应的去向,但在所有其他方面–验证、输入、标签、自动完成–你都只能使用默认的 <form> 元素行为。

最后,因为 htmx 只是在一个非常狭窄的域中扩展 HTML(网络请求和 DOM 替换),所以你编写的大多数“htmx”只是普通的旧 HTML。当你可以访问复杂的状态管理机制时,实现自定义可折叠 div 变得非常容易;如果不这样做,你可能会停下来足够长的时间来搜索 <details> 元素。每当问题可以通过本机 HTML 元素解决时,代码的寿命就会大大提高。这是一种学习 Web 开发的不太陌生的方式,因为只要 HTML 存在,你的大部分知识就将保持相关性。

在这方面,htmx 比 React 更像 jQuery(htmx 的前身 intercooler.js 是 jQuery 扩展),但它通过使用声明性的、基于 HTML 的界面对 jQuery 进行了改进:jQuery 让你转到 <script> 标签来指定AJAX行为,htmx只需要一个简单的 hx-post 属性。

简而言之,虽然 htmx 可以用作框架,但与 JavaScript 框架相比,它与 Web 语义的偏差要小得多,并且将受益于这些语义的改进,而无需用户进行额外的工作,这要归功于 Web 的出色性能向后兼容性保证。如果你想建立一个持续很长时间的网站,这些品质使 htmx 成为比许多同时代网站更好的选择。

注:尽管卡森(Carson)同意这一分析,认为这篇文章没有逻辑缺陷,并允许我在他的网站上发表,但他仍然坚持认为 htmx 是一个库。

这篇关于htmx 只是另一个 JavaScript 框架吗?老外都吵上了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609291

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在