Введение
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 прочтите их официальную документацию.
Не стесняйтесь аплодировать и комментировать, если вам понравилась эта статья. Следуйте за мной, чтобы увидеть больше такого контента.