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.rhkb.cn/news/147885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单片机】14-I2C通信之EEPROM

1.EEPROM概念 1.EEPROM 1.1 一些概念 &#xff08;1&#xff09;一些概念&#xff1a;ROM【只读存储器---硬盘】&#xff0c;RAM【随机访问存储器--内存】&#xff0c;PROM【可编程的ROM】&#xff0c;EPROM【可擦除ROM】&#xff0c;EEPROM【电可擦除ROM】 1.2 为什么需要EE…

接口测试入门实践

简单接口搭建(表单/REST) 五步教会你写接口 首先要安装flask包: pip install flask 从flask中导入Flask类和request对象: from flask import Flask, request从当前模块实例化出一个Flask实例:appFlask(__name__)编写一个函数来处理请求 从请求对象中获取数据:arequest.values.…

LeetCode【121. 买卖股票的最佳时机】

你才不是什么小人物&#xff0c;你在我这里&#xff0c;是所有的天气和心情。 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一…

【Leetcode】滑动窗口合集

这里写目录标题 209.长度最小的子数组题目思路代码 3. 无重复字符的最长子串&#xff08;medium&#xff09;题目思路 11. 最大连续 1 的个数 III题目思路 1658. 将 x 减到 0 的最⼩操作数题目思路代码 904. 水果成篮题目思路代码 438.找到字符串中所有字母的异位词题目思路代码…

二十八、高级IO与多路转接之select

文章目录 一、五种IO模型&#xff08;一&#xff09;阻塞IO:&#xff08;二&#xff09;非阻塞IO:&#xff08;三&#xff09;信号驱动IO:&#xff08;四&#xff09;IO多路转接:&#xff08;五&#xff09;异步IO: 二、高级IO重要概念&#xff08;一&#xff09;同步通信 vs 异…

【STL】用哈希表(桶)封装出unordered_set和unordered_map

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

pytorch_神经网络构建1

文章目录 pytorch简介神经网络基础分类问题分析:逻辑回归模型逻辑回归实现多层神经网络多层网络搭建保存模型 pytorch简介 为什么神经网络要自定义数据类型torch.tensor? tensor可以放在gpu上训练,支持自动求导,方便快速训练,同时支持numpy的运算,是加强版,numpy不支持这些 为…

python二次开发CATIA:导出Excel格式BOM

BOM是英文Bill of Material的缩写&#xff0c;中文翻译为“物料清单”&#xff0c;也称为产品结构表或产品结构树。它是计算机可以识别的产品结构数据文件&#xff0c;也是ERP的主导文件。BOM使系统识别产品结构&#xff0c;也是联系与沟通企业各项业务的纽带。ERP系统中的BOM的…

多线程经典代码案例及手动实现

目录 一.线程和多线程 二. 多线程的经典的代码案例 1.单例模式 2.阻塞队列 (1)概念介绍 (2)生产者消费者模型 (3)手动实现阻塞队列 (4)代码解释及问题分析 3.定时器 (1)概念介绍 (2)思路分析 (3)手动实现定时器 (4)代码解释及问题分析 问题一:优先级 问题二 :忙等…

基于SSM的电动车上牌管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的电动车上牌管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringM…

Java基本数据类型和变量

目录 一、基本数据类型 1.1 整型 1.1.1 byte 1.1.2 short 1.1.3 int 1.1.4 long 1.2 浮点型 1.2.1 float 1.2.2 double 1.3 字符型 1.4 布尔型 二、变量 2.1 变量的概念 2.2 语法格式 2.3 整型变量 2.3.1 整型变量 2.3.2 长整型变量 2.3.3 短整型变量 2.3.…

MySQL之DQL

DQL是数据查询语言 SELECT语句 语法&#xff1a; SELECT {*,列名&#xff0c;函数等} FROM 表名;SELECT *&#xff1a;表示匹配所有列 FROM :提供数据源 例如:查询student表的所有记录 SELECT * FROM student;例如&#xff1a;查询学生姓名和地址&#xff1a; SELECT Stud…

学信息系统项目管理师第4版系列16_资源管理过程

1. 组建项目团队&#xff0c;建设项目团队和管理项目团队属于执行过程组 1.1. 【高22上选21】 1.1.1. 【高21上选25】 1.2. 3版 2. 【高19上案三】 2.1. 【高18上案三】 2.2. 【高23上案一】 3. 规划资源管理 3.1. 定义如何估算、获取、管理和利用团队以及实物资源的过…

mstsc无法保存RDP凭据, 100%生效

问题 即使如下两项都打勾&#xff0c;其还是无法保存凭据&#xff0c;特别是连接Ubuntu (freerdp server)&#xff1a; 解决方法 网上多种复杂方法&#xff0c;不生效&#xff0c;其思路是修改后台配置&#xff0c;以使mstsc跟平常一样自动记住凭据。最后&#xff0c;如下的…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…

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…

2023/10/4 -- ARM

今日任务&#xff1a;QT实现TCP服务器客户端搭建的代码&#xff0c;现象 ser&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);server new QTcpSe…

免费、丰富、便捷的资源论坛——Yiove论坛,包括但不限于阿里云盘、夸克云盘、迅雷云盘等等

引言 目前资源的数量达到了60000&#xff0c;六万多的资源意味着在这里几乎可以找到任何你想要的资源。 当然&#xff0c;资源并不是论坛的全部&#xff0c;其中还包括了技术交流、福利分享、最新资讯等等。 传送门&#xff1a;YiOVE论坛 - 一个有资源有交流&#xff0c;有一…

PCL 计算点云中值

目录 一、算法原理2、主要函数二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 计算点云坐标的中值点,首先对点云坐标进行排序,然后计算中值。如果点云点的个数为奇数…

计组—— I/O系统

&#x1f4d5;&#xff1a;参考王道课件 目录 一、I/O系统的基本概念 1.什么是“I/O”&#xff1f; ​编辑2.主机如何和I/O设备进行交互&#xff1f; 3.I/O控制方式 &#xff08;1&#xff09;程序查询方式 &#xff08;2&#xff09;程序中断方式 &#xff08;3&#x…