Hono.js: Фреймворк наступного покоління для Node.js

pic

Чому варто вивчати Hono

pic

На ринку вже є багато бібліотек і фреймворків для 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

[pic

Зрештою, хочу представити платформу, яка чудово підходить для розгортання застосунків Hono: Leapcell.

Leapcell — це безсерверна платформа з наступними характеристиками:

  1. Підтримка кількох мов

    • Розробка на JavaScript, Python, Go або Rust.
  2. Безкоштовне розгортання необмеженої кількості проєктів

    • Платіть тільки за використання — немає запитів — немає витрат.
  3. Неперевершена ефективність витрат

    • Платіть за фактичне використання без плати за простоювання.
    • Наприклад: $25 підтримує 6.94 млн запитів при середньому часі відповіді 60 мс.
  4. Оптимізований досвід розробника

    • Інтуїтивно зрозумілий інтерфейс для легкого налаштування.
    • Повністю автоматизовані CI/CD пайплайни та інтеграція з GitOps.
    • Реальні метрики та логування для отримання корисної інформації.
  5. Простота масштабування та висока продуктивність

    • Автоматичне масштабування для обробки високої кількості запитів.
    • Нульові витрати на обслуговування — просто зосередьтеся на розробці.

Дізнайтеся більше в документації!

Twitter Leapcell: https://x.com/LeapcellHQ

Перекладено з: Hono.js: The Next-Gen Node.js Framework

Leave a Reply

Your email address will not be published. Required fields are marked *