Введение

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 прочтите их официальную документацию.

Не стесняйтесь аплодировать и комментировать, если вам понравилась эта статья. Следуйте за мной, чтобы увидеть больше такого контента.