使用 HTMX 和 Bun 进行全栈 Web 开发

2024-04-06 16:52

本文主要是介绍使用 HTMX 和 Bun 进行全栈 Web 开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将 HTMX 放在前端,Bun 放在后端,然后将它们与 Elysia 和 MongoDB 连接起来,形成快速便捷的技术栈,使开发 Web 应用程序变得轻而易举。

Bun 和 HTMX 是目前软件领域最有趣的两个事情。 Bun 是一个速度极快的一体化服务器端 JavaScript 平台,而 HTMX 是一种 HTML 扩展,用于创建简单而强大的界面。在本文中,我们将使用这两个出色的工具来开发一个全栈应用程序,该应用程序使用 MongoDB 进行数据存储,并使用 Elysia 作为其 HTTP 服务器。

技术栈

本文的重点是技术栈的四个主要组成部分如何相互作用。这四个组成部分分别是 Bun、HTMX、Elysia 和 MongoDB。这种架构提供了一个快速部署的设置,易于配置并且灵活变化。

  • Bun 是一个 JavaScript 运行时、打包器、包管理器和测试运行器
  • Elysia 是一个高性能 HTTP 服务器,基于 Bun 构建
  • HTMX 提供了一种向 HTML 添加细粒度交互性的新颖方法
  • MongoDB 是旗舰级 NoSQL 面向文档的数据存储

请注意,本文有两个部分。后续我们将合并 Pug、HTMX 模板引擎,用它来开发一些奇特的前端交互。

安装和设置

您需要安装 Bun.js,这很容易做到。我们还将在我们的开发机器上将 MongoDB 作为服务与 Bun 一起运行。安装这些软件包后,bun -vmongod -version 命令都可以在命令行中运行。

接下来,让我们开始一个新项目:

bun create elysia iw-beh

这告诉 bun 使用 Elysia 模板创建一个新项目。 Bun 中的模板是使用 create 命令快速启动项目的便捷方法。Bun 可以像 Node.js 一样工作,无需任何配置。

现在,进入新目录 cd iw-beh,并按原样运行项目 bun run src/index.js

最后一个命令告诉 bun 运行 src/index.js 文件。src/index.js 文件是启动 Elysia 服务器的代码:

import { Elysia } from "elysia";const app = new Elysia().get("/", () => "Hello Elysia").listen(3000);console.log(`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);

在此文件中,我们导入 Elysia 并使用它实例化一个新服务器,该服务器侦听端口 3000 并在根目录下有一个 GET 端点。该端点返回一个文本字符串「Hello Elysia」,其工作原理与 Express 的相似。如果您访问 localhost:3000,您会收到一条简单的问候语。

现在我们已经运行了 Elysia,让我们添加 static 插件。 Elysia 有几个用于处理常见场景的插件。在本例中,我们希望从磁盘提供一些 HTML。 static 插件正是我们所需要的:

bun add @elysiajs/static

现在,运行 static 插件的 Elysia 服务器应该提供 iw-beh/public 目录中的所有内容。如果我们在其中放置一个简单的 HTML 文件并访问 localhost:3000/public,我们将看到它的内容。

HTMX 的魔力

接下来,让我们向 index.html 添加一个 HTMX 页面。这是 HTMX 主页上的一个简单示例:

<script src="https://unpkg.com/htmx.org@1.9.10"></script><button hx-post="/clicked"hx-trigger="click"hx-target="#parent-div"hx-swap="outerHTML">Click Me!
</button>

该页面显示一个按钮。单击时,该按钮将调用 /clicked 服务器,并且该按钮将替换为响应中的任何内容。那里还什么都没有,所以目前它什么也没做。

但请注意,所有这些仍然是 HTML。我们正在进行 API 调用并执行细粒度的 DOM 更改,而无需任何 JavaScript。这项工作是由我们刚刚导入的 htmx.org 库中的 JavaScript 完成的,但重点是我们不必担心它。

HTMX 提供了一种 HTML 语法,只需使用三个元素属性即可完成这些操作:

  • hx-post 在 AJAX 请求触发时提交帖子
  • hx-target 告诉 hx-post 哪些事件执行 AJAX 请求
  • hx-swap 表示 AJAX 事件发生时要做什么

Elysia 和 MongoDB

现在让我们在 Elysia 中创建一个端点,它将向 MongoDB 写入一些内容。首先我们将为 Bun 添加 MongoDB 驱动程序:bun add mongodb

接下来,像这样修改 src/index.ts

import { Elysia } from 'elysia'
import { staticPlugin } from '@elysiajs/static'
const { MongoClient } = require('mongodb')const app = new Elysia().get('/', () => 'Hello Elysia').get('/db', async () => {const url ='mongodb://127.0.0.1:27017/quote?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0'const client = new MongoClient(url, { useUnifiedTopology: true })try {await client.connect()const database = client.db('quote')const collection = database.collection('quotes')const stringData = 'Thought is the grandchild of ignorance.'const result = await collection.insertOne({ quote: stringData })console.log(`String inserted with ID: ${result.insertedId}`)} catch (error) {console.error(error)} finally {await client.close()}return 'OK'}).use(staticPlugin()).listen(3000)console.log(`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`,
)

在这段代码中,我们添加了一个 /db 端点,它与 MongoDB 通信。现在它只是将一条引用写入到 quote 数据库中的 quotes 集合内。您可以直接通过访问 localhost:3000/db 来测试这一点。然后您可以验证数据是否已存储在 MongoDB 中:

$ mongoshtest> use quote
switched to db quote
quote> db.quotes.find()
[{_id: ObjectId("65ba936fd59e9c265cc8c092"),quote: 'Thought is the grandchild of ignorance.',author: 'Swami Venkatesananda'}
]

创建 HTMX 表格

现在我们从前端连接到数据库,让我们创建一个表来输出现有的报价。作为快速测试,我们将向服务器添加一个端点:

.get("/quotes", async () => {const data = [{ name: 'Alice' }, { name: 'Bob' }]let html = '<ul>'for (const item of data) {html += `<li>${item.name}</li>`}html += '</ul>'return html
})

然后在我们的 index.html 中使用它:

<ul id="data-list"></ul>
<button hx-get="/quotes" hx-target="#data-list">Load Data</button>

现在,当您加载 /public/index.html 并单击按钮时,就会显示从服务器发送的列表。从端点发出 HTML 与常见的 JSON 模式不同。我们在这里遵守 RESTful 原则,HTMX 有用于处理 JSON 端点的插件,但这更习惯使用。

在我们的端点中,我们只是手动创建 HTML。在真实的应用程序中,我们可能会使用某种 JavaScript 框架来使事情更易于管理。

现在,我们可以从数据库中检索数据:

.get("/quotes", async () => {const url ='mongodb://127.0.0.1:27017/quote?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0'const client = new MongoClient(url, { useUnifiedTopology: true })try {await client.connect()const database = client.db('quote')const collection = database.collection('quotes')const quotes = await collection.find().toArray()// Build the HTML table structurelet html = '<table border="1">'html += '<tr><th>Quote</th><th>Author</th></tr>'for (const quote of quotes) {html += `<tr><td>${quote.quote}</td><td>${quote.author}</td></tr>`}html += '</table>'return html} catch (error) {console.error(error)return 'Error fetching quotes'} finally {await client.close()}
})

在此端点中,我们检索数据库中所有现有的报价并将它们作为简单的 HTML 表返回。在实际应用程序中,我们会将数据库连接工作提取到一个中心位置。

如果您查看到目前为止应用程序的服务器和客户端,您会发现我们只做了最少的工作。HTMX 在这里简化的最重要的事情是提交表单。hx-post 属性取代了从表单中取出数据、将其编组为 JSON 并使用 fetch() 或类似内容提交的所有工作。

总结

随着事情变得越来越复杂,我们开始不得不依赖客户端中的 JavaScript,即使使用 HTMX。例如,内联行编辑。我们可能希望使用 JavaScript 执行的某些操作(例如将新行直接插入表中)可以通过 HTMX 交换来完成。HTMX 允许您使用简单的语法做很多事情,然后在必要时回退到 JavaScript。

最大的心理变化是从服务器生成 HTMX。您可以选择多种 HTML 或 JavaScript 模板引擎,使这一切变得更加容易。一旦我们习惯使用 HTMX,一切都会变得轻而易举。本质上我们已经从技术栈中消除了整个 JSON 转换层。

我们刚刚通过组合 Bun、Elysia、HTMX 和 MongoDB 进行了简单的演示模版,但您至少应该对这个技术栈有一个感觉,这些组件可以很好地协同工作。Bun、Elysia 和 MongoDB 安静地完成自己的工作,而如果您更习惯 JSON API,则 HTMX 需要多考虑一下。

这篇关于使用 HTMX 和 Bun 进行全栈 Web 开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi