Введение
Bun, недавно представленная среда выполнения JavaScript, обладающая превосходной скоростью, недавно представила свою первую версию. Он поддерживает Typescript «из коробки», и с его помощью можно запускать существующие проекты node.js. Bun предлагает средство запуска тестов, которое также работает быстрее по сравнению с существующими фреймворками, такими как Jest. В отличие от Node.js, который работает на движке Chrome v8, Bun работает на JavaScriptCore Safari. В этом блоге я настрою Bun и создам различные типы конечных точек API, буду читать файлы с помощью Bun.

Начиная
Чтобы начать работу с Bun, вы можете начать процесс установки в системах Linux и Mac, выполнив следующую команду. Для пользователей Windows стоит отметить, что Bun предоставляет экспериментальную встроенную сборку.
Использование Curl:
curl -fsSL https://bun.sh/install | bash
Использование доморощенного пива
brew tap oven-sh/bun # for macOS and Linux brew install bun
Вы можете использовать разные методы, следуя официальной документации.
Для начала создайте пустой каталог и запустите «bun init», аналогичный «npm init». Это создаст шаблонную структуру с помощью Typescript. Затем мы добавим пакет под названием Elysia, который представляет собой платформу Bun, похожую на Express, но гораздо более быструю по сравнению с ним. Вы можете установить Elysia, используя следующую команду.
bun add Elysia
Приложение Todo
Давайте начнем и создадим базовое приложение задач с Баном и Элизией. Создайте сервер с помощью Elysia и при желании вы можете добавить «dev: npm run — watch index.ts» к сценариям в package.json. Это запустит index.ts в режиме просмотра и будет отслеживать изменения аналогично nodemon, но опять же намного быстрее, чем nodemon.
// index.ts
import { Elysia } from "elysia";
const app = new Elysia()
.get("/", () => "Hey there! This is Elysia")
.listen(3000);
console.log(
`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);
Сервер должен быть запущен, как только вы запустите «bun run dev», и вы должны увидеть следующее, если запустите его в браузере.

Теперь, когда мы настроили базовый маршрут, давайте немного его реорганизуем, чтобы сервер можно было использовать для создания нескольких конечных точек API. Создайте новый каталог под названием «data» и добавьте файл JSON для хранения задач.
// ./data/todo.json
[
{
"id": 1,
"title": "Buy Groceries",
"description": "Buy groceries for the week"
},
{
"id": 2,
"title": "Do Laundry",
"description": "Do laundry before the weekend"
},
{
"id": 3,
"title": "Presentation",
"description": "Create presentation for the meeting"
}
]
Создайте маршрут, который возвращает задачи из этого файла JSON.
// index.ts
import { Elysia } from "elysia";
import TASKS from "./data/todo.json";
const app = new Elysia();
app.get("/", () => {
return "Hey there! This is Elysia";
});
app.get("/todo", ({ query, set }) => {
if (query?.id) {
const id = parseInt(query.id as string);
const todo = TODOS.find((todo) => todo.id === id);
if (todo) return new Response(JSON.stringify(todo));
set.status = 404;
return "Task not found";
}
return new Response(JSON.stringify(TODOS));
});
app.listen(3000);
console.log(
`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);
Давайте расширим это, чтобы создать дополнительные маршруты, которые выполняют базовые операции CRUD с нашими данными. Кроме того, давайте продолжим и определим тип объекта задачи.
// ./types/todo.ts
export type Todo = {
id: number;
title: string;
description: string;
};
// index.ts
import { Elysia } from "elysia";
import todos from "./data/todo.json";
import { Todo } from "./types/todo";
const app = new Elysia();
const TODOS: Todo[] = todos;
app.get("/", () => {
return "Hey there! This is Elysia";
});
app.get("/todo", ({ query, set }) => {
if (query?.id) {
const id = parseInt(query.id as string);
const todo = TODOS.find((todo) => todo.id === id);
if (todo) return new Response(JSON.stringify(todo));
set.status = 404;
return "Task not found";
}
return new Response(JSON.stringify(TODOS));
});
app.post("/todo", ({ body, set }) => {
const todo = {
id: TODOS.length + 1,
...(body as Omit<Todo, "id">),
};
TODOS.push(todo);
set.status = 201;
return todo;
});
app.put("/todo", ({ query, body, set }) => {
if (!query?.id) {
set.status = 400;
return "Missing id";
}
const todo = body as Partial<Todo>;
const id = parseInt(query.id as string);
const index = TODOS.findIndex((todo) => todo.id === id);
if (index === -1) {
set.status = 404;
return "Task not found";
}
TODOS[index] = {
...TODOS[index],
title: todo.title ?? TODOS[index].title,
description: todo.description ?? TODOS[index].description,
};
return new Response(JSON.stringify(TODOS[index]));
});
app.delete("/todo", ({ query, set }) => {
if (!query?.id) {
set.status = 400;
return "Missing id";
}
const id = parseInt(query.id as string);
const index = TODOS.findIndex((todo) => todo.id === id);
if (index === -1) {
set.status = 404;
return "Task not found";
}
TODOS.splice(index, 1);
set.status = 204;
return "Task deleted";
});
app.listen(3000);
console.log(
`🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}`
);
Давайте рассмотрим некоторые другие возможности Bun, такие как файловый ввод-вывод. Bun будет лениво загружать файлы и не будет читать их при инициализации. Чтобы немного изучить это, давайте изменим наш исходный файл json на .txt и загрузим его с помощью Bun.file().
const foo = Bun.file("./data/todo.txt");
const TODOS: Todo[] = JSON.parse(await foo.text());
Это загружает файл, а затем мы анализируем его в JSON для использования в существующих маршрутах. Мы можем загрузить файл, используя другие методы, такие как ArrayBuffer или ReadableStream.
Заключение
В целом, Bun предоставляет относительно комплексную альтернативу Node.js, поддерживая уже существующие проекты Node.js. Несмотря на то, что его рекламируют как значительно более быстрый, чем Node.js, команда советует использовать его в первую очередь в более простых проектах, таких как бессерверные функции. Для получения дополнительной информации о Bun и Elysia прочтите их официальную документацию.
Не стесняйтесь аплодировать и комментировать, если вам понравилась эта статья. Следуйте за мной, чтобы увидеть больше такого контента.