Чому варто вивчати Hono
На ринку вже є багато бібліотек і фреймворків для Node.js. Я раніше використовував Nest.js для деяких малих проєктів. Він має велику кількість функцій і дозволяє швидко реалізувати проєкти. Однак для моїх маленьких проєктів багато з цих функцій є надмірними, а високий рівень інкапсуляції залишає мало свободи при написанні коду.
З випадкової нагоди я натрапив на Hono в інтернеті. Прочитавши його документацію, я дізнався про такі переваги:
- Неймовірно швидкий 🚀 — Маршрутизатор RegExpRouter дійсно швидкий. Він не використовує лінійні цикли. Просто швидкий.
- Легкий 🪶 — Пресет
hono/tiny
важить менше 12 кБ. Hono не має залежностей і використовує лише стандартні Web API. - Підтримка кількох середовищ 🌍 — Підходить для Cloudflare Workers, Fastly Compute@Edge, Deno, Bun, Lagon, AWS Lambda або Node.js. Однаковий код працює на всіх платформах.
- Можливості 🔋 — Hono має вбудовані middleware, користувацькі middleware, сторонні middleware та допоміжні функції. Це все-в-одному.
- Приємний DX 🛠️ — Має дуже чисте API та відмінну підтримку TypeScript. Тепер у нас є "типи".
Варіанти використання
Hono — це простий фреймворк для вебзастосунків, подібний до Express, але без фронтенду. Він дозволяє створювати більші застосунки, коли комбінується з middleware. Ось кілька прикладів використання:
- Створення веб-інтерфейсів
- Проксі-сервер для бекенду
- CDN фронтенди
- Edge-застосунки
- Базові сервери для бібліотек
- Повноцінні стек-застосунки
Чудово, давайте почнемо вивчати його.
Hello World
https://hono.dev/docs/getting-started/basic
Ви можете змінювати порт, налаштувавши port
.
import { Hono } from 'hono';
const app = new Hono();
app.get('/', (c) => {
return c.text('Hello Hono!');
});
export default app;
Для виконання:
npm run dev
Щоб отримати доступ:
http://localhost:8787
Маршрути
HTTP методи
app.get('/', (c) => c.text('GET /'));
app.post('/', (c) => c.text('POST /'));
app.put('/', (c) => c.text('PUT /'));
app.delete('/', (c) => c.text('DELETE /'));
Ієрархічні маршрути
const apiRoutes = app
.basePath("/api")
.route("/expenses", route1)
.route("/", route2);
Попередній basePath("/api")
додає префікс /api
до всіх маршрутів.
export const route1 = new Hono()
.post("/", async (c) => {
return c.json({ });
});
Ви можете отримати доступ до цього маршруту за адресою http://localhost:8787/api/expenses.
Запити
Отримання параметрів запиту та запитів
app.get('/posts/:id', (c) => {
const page = c.req.query('page');
const id = c.req.param('id');
return c.text(`You want see ${page} of ${id}`);
});
Перегляньте результат: http://localhost:8787/posts/1?page=12
Отримання вмісту тіла запиту
app.put("/posts/:id{[0-9]+}", async (c) => {
const data = await c.req.json();
return c.json(data);
});
Відповіді
Окрім text()
, є багато інших методів, таких як json()
, html()
, notFound()
, redirect()
, і так далі, щоб повернути різні типи даних у відповіді.
можна безпосередньо повертати JSX за допомогою html()
.
JSX
import type { FC } from 'hono/jsx';
const app = new Hono();
const Layout: FC = (props) => {
return (
{props.children}
);
};
const Top: FC<{ messages: string[] }> = (props: {
messages: string[]
}) => {
return (HTTP Methods
Hello Hono!
{props.messages.map((message) => { return
{message}!!
; })}
); }; app.get('/', (c) => { const messages = ['Good Morning', 'Good Evening', 'Good Night']; return c.html(); }); export default app; ``` Просто змініть розширення файлу на `.tsx`, і ви зможете безпосередньо писати JSX, дуже схоже на React.
## Валідація
Валідація реалізована через `zod` та `@hono/zod-validator`, щоб перевіряти, чи відповідають запити від клієнта вказаному формату даних.
**Встановлення**: `yarn add zod @hono/zod-validator`
Наприклад, якщо потрібно перевірити, що в запиті дані повинні бути у форматі:
`account: string; password: string`
import { z } from "zod";
import { zValidator } from "@hono/zod-validator";
const loginSchema = z.object({
account: z.string(),
password: z.string(),
});
app.post("/login", zValidator("json", loginSchema), async (c) => {
// виконуємо дії
const user = c.req.valid("json");
return c.json({ });
});
```
Дізнатися більше можна в документації zod
. І IDE може безпосередньо показувати підказки типів для user
.
Leapcell: Розширена безсерверна платформа для хостингу Nodejs
[
Зрештою, хочу представити платформу, яка чудово підходить для розгортання застосунків Hono: Leapcell.
Leapcell — це безсерверна платформа з наступними характеристиками:
-
Підтримка кількох мов
- Розробка на JavaScript, Python, Go або Rust.
-
Безкоштовне розгортання необмеженої кількості проєктів
- Платіть тільки за використання — немає запитів — немає витрат.
-
Неперевершена ефективність витрат
- Платіть за фактичне використання без плати за простоювання.
- Наприклад: $25 підтримує 6.94 млн запитів при середньому часі відповіді 60 мс.
-
Оптимізований досвід розробника
- Інтуїтивно зрозумілий інтерфейс для легкого налаштування.
- Повністю автоматизовані CI/CD пайплайни та інтеграція з GitOps.
- Реальні метрики та логування для отримання корисної інформації.
-
Простота масштабування та висока продуктивність
- Автоматичне масштабування для обробки високої кількості запитів.
- Нульові витрати на обслуговування — просто зосередьтеся на розробці.
Дізнайтеся більше в документації!
Twitter Leapcell: https://x.com/LeapcellHQ
Перекладено з: Hono.js: The Next-Gen Node.js Framework