Hono——一个小型,简单且超快的Edges Web框架

Hono - [炎]在日语中的意思是火焰🔥 - 是一个小型,简单且超快的Edges Web框架。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly Compute@Edge,Deno,Bun,Vercel,Netlify,Lagon,AWS Lambda,Lambda@Edge和Node.js。

快,但不仅快。

文章目录

  • 快速入门
  • 特征
  • 用例
  • 谁在使用Hono?
  • 示例
  • 超快
  • Remix + Hono 示例
    • Session 会话管理
    • 静态资源
    • HTTPS Only
    • trailingSlash

快速入门

npm i --save hono

只需运行这个:

import { Hono } from 'hono'
const app = new Hono()app.get('/', (c) => c.text('Hono!'))export default app

特征

  • 超快 🚀 - 路由器 RegExpRouter 真的很快。不使用线性循环。快。
  • 轻量级 🪶 - hono/tiny 预设小于 12kB。Hono 的依赖关系为零,仅使用 Web 标准 API。
  • 多运行时 🌍 - 适用于Cloudflare Workers,Fastly Compute@Edge,Deno,Bun,Lagon,AWS Lambda或Node.js。相同的代码在所有平台上运行。
  • 能力🔋 - Hono 具有内置中间件、自定义中间件、第三方中间件和助手。包括电池。
  • 令人愉快的DX 🛠️ - 超级干净的API。一流的 TypeScript 支持。现在,我们有“类型”。

用例

Hono是一个简单的Web应用程序框架,类似于Express,没有前端。但它在 CDN Edge 上运行,允许您在与中间件结合使用时构建更大的应用程序。以下是一些用例示例:

  • 构建网络接口
  • 后端服务器代理
  • CDN 前端
  • 边缘应用
  • 库的基本服务器
  • 全栈应用

谁在使用Hono?

项目平台用途
cdnjs API 服务器Cloudflare Workers免费的开源 CDN 服务。Hono用于他们的API服务。
Polyfill.ioFastly Compute@Edge提供必要的浏览器填充的 CDN 服务。Hono被用作核心服务器。
UltraDeno一个 React/Deno 框架。Hono 用于内部服务器。
Deno BenchmarksDeno基于 V8 构建的安全 TypeScript 运行时。Hono用于基准测试。
Cloudflare 博客Cloudflare Workers文章中介绍的一些应用程序使用 Hono。

示例

使用 Hono 为 Cloudflare Workers 创建应用程序的演示。

超快

Hono是最快的,与Cloudflare Workers的其他路由器相比。

Hono x 402,820 ops/sec ±4.78% (80 runs sampled)
itty-router x 212,598 ops/sec ±3.11% (87 runs sampled)
sunder x 297,036 ops/sec ±4.76% (77 runs sampled)
worktop x 197,345 ops/sec ±2.40% (88 runs sampled)
Fastest is Hono
✨  Done in 28.06s.

查看更多基准测试: https://hono.dev/concepts/benchmarks

Hono 太小了。使用 hono/tiny 预设时,其大小在缩小时小于 12KB。有许多中间件和适配器,但它们仅在使用时才捆绑在一起。对于上下文,Express 的大小为 572KB。

$ npx wrangler dev --minify ./src/index.ts⛅️ wrangler 2.20.0
--------------------
⬣ Listening at http://0.0.0.0:8787
- http://127.0.0.1:8787
- http://192.168.128.165:8787
Total Upload: 11.47 KiB / gzip: 4.34 KiB

Remix + Hono 示例

安装包:

npm add remix-hono

然后创建你的 Remix 服务器:

import { logDevReady } from "@remix-run/cloudflare";
import * as build from "@remix-run/dev/server-build";
import { Hono } from "hono";
// You can also use it with other runtimes
import { handle } from "hono/cloudflare-pages";
import { remix } from "remix-hono/handler";if (process.env.NODE_ENV === "development") logDevReady(build);/* type your Cloudflare bindings here */
type Bindings = {};/* type your Hono variables (used with ctx.get/ctx.set) here */
type Variables = {};type ContextEnv = { Bindings: Bindings; Variables: Variables };const server = new Hono<ContextEnv>();// Add the Remix middleware to your Hono server
server.use("*",remix({build,mode: process.env.NODE_ENV as "development" | "production",// getLoadContext is optional, the default function is the same as heregetLoadContext(ctx) {return ctx.env;},}),
);// Create a Cloudflare Pages request handler for your Hono server
export const onRequest = handle(server);

现在,你可以添加 Hono 中间件了,比如基本的登录认证:

import { basicAuth } from "hono/basic-auth";server.use("*",basicAuth({ username: "hono", password: "remix" }),// Ensure Remix request handler is the last oneremix(options),
);

Session 会话管理

有三种常见方法来管理 Cloudflare 上的会话。

第一种,使用 Worker KV 持久化会话。

import { session } from "remix-hono/session";
// Install the `@remix-run/*` package for your server adapter to grab the
// factory functions for session storage
import { createWorkerKVSessionStorage } from "@remix-run/cloudflare";server.use("*",session({autoCommit: true,createSessionStorage(context) {return createWorkersKVSessionStorage({kv: context.env.MY_KV_BINDING,cookie: {name: "session",httpOnly: true,secrets: [context.SESSION_SECRET],},});},}),
);

现在,可以通过 getSessionStoragegetSession 方法来获取会话对象了。

注意:如果 autoCommit 设置为 false, 你需要手动调用 sessionStorage.getSession()

import { getSessionStorage, getSession } from "remix-hono/session";server.use("*",remix<ContextEnv>({build,mode: process.env.NODE_ENV as "development" | "production",// getLoadContext is optional, the default function is the same as heregetLoadContext(ctx) {let sessionStorage = getSessionStorage(ctx);let session = getSession(ctx);// Return them here to access them in your loaders and actionsreturn { ...ctx.env, sessionStorage, session };},}),
);

第二种,使用 workerKVSession 来替代。

import { workerKVSession } from "remix-hono/cloudflare";server.use("*",workerKVSession({autoCommit: true, // same as in the session middlewarecookie: {name: "session", // all cookie options as in createWorkerKVSessionStorage// In this function, you can access context.env to get the session secretsecrets(context) {return [context.env.SECRET];},},// The name of the binding using for the KVNamespacebinding: "KV_BINDING",}),
);

第三种,使用cookieSession

import { cookieSession } from "remix-hono/cloudflare";server.use("*",cookieSession({autoCommit: true, // same as in the session middlewarecookie: {name: "session", // all cookie options as in createCookieSessionStorage// In this function, you can access context.env to get the session secretsecrets(context) {return [context.env.SECRET];},},}),
);

静态资源

如果需要将 public 目录下的(除了 public/build 之外)资源通过服务提供,可以使用这样的中间件:

import { staticAssets } from "remix-hono/cloudflare";
import { remix } from "remix-hono/handler";server.use("*",staticAssets(),// Add Remix request handler as the last middlewareremix(options),
);

HTTPS Only

强制使用 HTTPS:

import { httpsOnly } from "remix-hono/security";server.use("*", httpsOnly());

trailingSlash

尾部 / 处理:

import { trailingSlash } from "remix-hono/trailing-slash";// By default, trailing slashes are disabled, so `https://company.tld/about/`
// will be redirect to `https://company.tld/about`
server.use("*", trailingSlash());
server.use("*", trailingSlash({ enabled: false }));// You can also enable trailing slashes, so `https://company.tld/about` will be
// redirect to `https://company.tld/about/` instead
server.use("*", trailingSlash({ enabled: true }));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148365.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 不均衡数据采样方法:imblearn 库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

CSS3与HTML5

box-sizing content-box&#xff1a;默认&#xff0c;宽高包不含边框和内边距 border-box&#xff1a;也叫怪异盒子&#xff0c;宽高包含边框和内边距 动画&#xff1a;移动translate&#xff0c;旋转、transform等等 走马灯&#xff1a;利用动画实现animation&#xff1a;from…

【C++进阶(七)】仿函数深度剖析模板进阶讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 模板进阶 1. 前言2. 仿函数的概念3. 仿函数的实…

背包问题

目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…

3种等待方式,让你学会Selenium设置自动化等待测试脚本!

一、Selenium脚本为什么要设置等待方式&#xff1f;——即他的应用背景到底是什么 应用Selenium时&#xff0c;浏览器加载过程中无法立即显示对应的页面元素从而无法进行元素操作&#xff0c;需设置一定的等待时间去等待元素的出现。&#xff08;简单来说&#xff0c;就是设置…

Unity实现设计模式——状态模式

Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口&#xff0c;然后根据它的不同状态封装其行为&#xff0c;这样就可以实现状态和行为的绑定&#xff0c;最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…

python二次开发CATIA:文字轮廓草图

CATIA V5 版本的草图中&#xff0c;并没有文字轮廓的创建命令。通常的做法是&#xff0c;再Drawing 文件中创建所需文本-->将 Drawing 文件另存为 dwg / dxf 格式-->打开另存的文件&#xff0c;文字已转为轮廓线条-->复制线条并粘贴到草图中。 本例中&#xff0c;基于…

day49数据库 索引 事务

一、索引 什么是索引&#xff1a;索引是数据库库中用来提高查询效率的技术&#xff0c;类似于目录 为什么要使用索引&#xff1a;如果不使用索引&#xff0c;数据会零散的保存在磁盘块中&#xff0c;查询数据需要遍历每一个磁盘块&#xff0c;直到找到数据为止&#xff0c;效率…

Python学习笔记之分支结构与循环结构

Python学习笔记之分支结构与循环结构 一、分支结构 使用关键字if、elif、else 练习1&#xff1a;使用分支结构实现分段函数求值 """分段函数求值""" x float(input("x "))if x > 1:y 3 * x - 5 elif x < -1:y 5 * x 3…

【数仓精品理论分析】能不能学大数据?

【数仓精品理论分析】能不能学大数据&#xff1f; 还能不能学大数据datapulse官网&#xff1a; 自身情况数据行业发展情况 还能不能学大数据 首先看到这个话题的时候&#xff0c;我是这样想的&#xff0c;能不能学大数据需要参考本人的自身情况【学历、年龄、决心、有没有矿或者…

12、Kubernetes中KubeProxy实现之iptables和ipvs

目录 一、概述 二、iptables 代理模式 三、iptables案例分析 四、ipvs案例分析 一、概述 iptables和ipvs其实都是依赖的一个共同的Linux内核模块&#xff1a;Netfilter。Netfilter是Linux 2.4.x引入的一个子系统&#xff0c;它作为一个通用的、抽象的框架&#xff0c;提供…

手机自动直播系统源码交付与代理加盟注意事项解析!

随着直播行业的不断发展&#xff0c;手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽&#xff0c;各类手机实景直播APP大批量涌现。因为创业和技术门槛低&#xff0c;市场需求高&#xff0c;所以成了最火热创业赛道。那么如果是不懂技术的人群&…

由Long类型引发的生产事故

事情原由 今天测试忽然在群里发了一个看似非常简单的线上问题&#xff0c;具体是&#xff1a;在后台通过订单编号(orderId)修改订单信息时&#xff0c;修改不成功 &#xff0c;修改前后的订单数据完全没有发生变化。第一眼看到这个问题的时候&#xff0c;我心想后台实现逻辑并不…

CSS 语法

CSS 实例 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素。 每条声明由一个属性和一个值组成。 属性&#xff08;property&#xff09;是您希望设置的样式属性&#xff08;style attribute&#x…

IDEA 配置 Maven(解决依赖下载缓慢)

IDEA 配置 Maven&#xff08;解决依赖下载缓慢&#xff09; 这一篇主要介绍 Maven 的基本用法。等我之后学习到框架知识时&#xff0c;会完善此部分内容。 一、Maven 简介 Maven 是专门用于管理和构建 Java 项目的工具&#xff0c;Apache Maven 是一个项目管理和构建工具&#…

lenovo联想台式机 拯救者 刃7000-28ICBR(90KX)原装出厂Windows10系统镜像

LENOVO联想拯救者(90KX)原厂WIN10系统 下载链接&#xff1a;https://pan.baidu.com/s/1beocPJSmnFbY4Y_ZQM2djA?pwd4d1n 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大…

QT、C++实现地图导航系统(mapSystem)

文章目录 地图导航系统项目应用背景技术栈选择数据处理算法实现界面实现源码展示成果展示源码下载 &#xff08;免费&#xff09; 地图导航系统 项目应用背景 电子地图导航系统的主要目的是为用户提供精确、实时的导航和位置信息&#xff0c;以帮助他们在城市或地区内轻松找到…

Golang 中的调试技巧

掌握有效的策略和工具&#xff0c;实现顺畅的开发 调试是每位开发人员都必须掌握的关键技能。它是识别、隔离和解决代码库中问题的过程。在 Golang 的世界中&#xff0c;掌握有效的调试技巧可以显著提升您的开发工作流程&#xff0c;并帮助您创建更可靠和健壮的应用程序。在本…

【面试经典150 | 矩阵】矩阵置零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a; O ( m n ) O(mn) O(mn) 空间复杂度方法二&#xff1a; O ( m n ) O(mn) O(mn) 空间复杂度方法三&#xff1a;仅使用2个额外变量的常量空间复杂度 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算…

【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…