Как развернуть приложение Bun?
Bun – это среда выполнения JavaScript, разработанная для того, чтобы быть быстрой, легкой и простой в использовании. Она написана на языке Zig и работает на JavaScriptCore, движке JavaScript, на котором работает Safari.
В Bun встроены совместимые с Node.js менеджер пакетов, прогонщик тестов и бандлер. Он также предоставляет минимальный набор высоко оптимизированных API для выполнения общих задач, таких как запуск HTTP-сервера и запись файлов.
В этой статье вы создадите простой веб-интерфейс с помощью Bun и развернете его на Back4app с помощью контейнеров Back4app. Продолжайте читать, чтобы узнать больше о том, как разместить приложение Bun.
Contents
Преимущества Bun
С момента анонса Bun, еще до выхода V1 в сентябре 2023 года, Bun становится все более популярным в сообществе JavaScript. Вот некоторые из причин.
Скорость
Bun написан на Zig, низкоуровневом языке программирования, предназначенном для системного программирования и ориентированном на производительность, безопасность и читабельность. Предназначен для современной альтернативы C & C++.
Кроме того, в отличие от Node.js и Deno, которые используют движок V8 JavaScript в Chrome, здесь применяется движок JavaScriptCore, на котором работает Safari.
Помимо Zig и JavaScript Core, Bun использует ряд других технологий, таких как собственный аллокатор памяти, оптимизированный для JavaScript, и компилятор just-in-time (JIT), оптимизирующий код по мере его выполнения.
В целом, сочетание Zig, JavaScript Core и других оптимизаций делает Bun очень быстрой средой выполнения JavaScript по сравнению с другими средами выполнения.
Совместимость с Node.js
Bun разработан как замена Node.js, и поэтому он совместим со всеми API Node.js.
В нем также есть все встроенные модули Node.js, такие как crypto, fs, path и т. д. Вы можете проверить доступные и недоступные модули Node.js в документации Bun.js.
Кроме того, Bun является npm-совместимым менеджером пакетов. Это означает, что вы можете использовать Bun для установки и управления пакетами Node.js с помощью Bun.
Поддержка TypeScript из коробки
Bun имеет встроенную и бесшовную поддержку TypeScript, что делает его отличным выбором, если вы предпочитаете или требуете TypeScript в своих проектах.
TypeScript, расширенная и статически типизированная версия JavaScript, представляет расширенные возможности языка и статическую типизацию для улучшения разработки JavaScript.
При использовании Bun нет необходимости в дополнительной настройке, а также в дополнительных процедурах установки или сборки для включения функциональности TypeScript.
Ограничения Bun
Несмотря на свои преимущества, Bun имеет определенные ограничения, которые необходимо учитывать, прежде чем использовать его в своем проекте.
Ограниченные ресурсы
Bun появился относительно недавно, поэтому сообщество разработчиков пока невелико. Ресурсов, посвященных разработке Bun-js, не так много, поэтому вам может быть сложно разобраться с тем, как использовать среду исполнения.
Тем не менее, документация Bun является исчерпывающей и служит ценным справочным материалом. Если у вас возникнут трудности, вы также можете обратиться за помощью через канал Discord.
Поддержка Windows
В настоящее время Bun обеспечивает ограниченную поддержку операционной системы Windows. На момент написания статьи под Windows поддерживается только среда выполнения.
Программа запуска тестов, менеджер пакетов и бандлер все еще находятся в разработке и, как таковые, не работают под Windows. Продолжайте читать, чтобы узнать, как разместить приложение Bun.
Создание приложения для Bun
Прежде чем использовать Bun, его нужно установить.
Чтобы установить Bun на macOS, WSL и Linux, выполните следующую команду:
curl -fsSL https://bun.sh/install | bash
Настройка среды разработки
Чтобы создать новый проект Bun, выполните следующую команду:
bun init
Выполнение приведенной выше команды инициализирует пустой проект Bun в вашем каталоге проектов.
В этом уроке вы создадите простой API с помощью Elysia, одного из самых быстрых HTTP-серверных фреймворков Bun (согласно их бенчмаркам).
Выполните приведенную ниже команду, чтобы установить Elysia и другие зависимости, необходимые для этого проекта:
bun add elysia knex dotenv pg
Другие зависимости, установленные в команде, включают:
- Knex, построитель запросов. Вы будете использовать эту зависимость, чтобы упростить взаимодействие с базой данных.
- dotenv, этот пакет поможет вам управлять переменными окружения в вашем проекте.
- pg (драйвер базы данных Postgres) для взаимодействия с базой данных postgres.
Затем инициализируйте knex в своем проекте, выполнив команду:
knex init
Приведенная выше команда создает файл knexfile.js
. Этот файл содержит параметры конфигурации для вашей базы данных.
Замените код в файле на блок кода ниже:
require("dotenv").config();
export const development = {
client: "pg",
connection: process.env.DATABASE_URL,
migrations: {
directory: "./db/migrations",
}
};
Затем создайте файл db.js
в корневом каталоге проекта и добавьте в него блок кода, приведенный ниже.
const knex = require("knex");
const knexFile = require("./knexfile.js");
const environment = process.env.NODE_ENV || "development";
export default knex(knexFile[environment]);
Затем создайте файл .env
и добавьте в него данные о подключении к базе данных или URI.
Например:
DATABASE_URL = <YOUR_DATABASE_URI>
Замените “YOUR_DATABASE_URI” на URL вашей базы данных.
Примечание: Убедитесь, что вы добавили свой файл .env
в файл .gitignore
, чтобы не фиксировать конфиденциальную информацию в системе контроля версий.
Создание модели базы данных
Чтобы создать модель базы данных с помощью Knex, вы создадите файл миграции и напишете команду create SQL с помощью Knex.
Выполните приведенную ниже команду, чтобы создать первую миграцию:
knex migrate:make blog
Затем замените код в сгенерированном файле миграции на блок кода, приведенный ниже:
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export function up (knex) {
return knex.schema.createTable("blog", (table) => {
table.increments("id").primary();
table.string("title").notNullable();
table.string("content").notNullable();
table.string("author").notNullable();
table.timestamp("created_at").defaultTo(knex.fn.now());
});
}
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
export function down (knex) {
return knex.schema.dropTable("blog");
}
Наконец, запустите приведенный ниже блок кода, чтобы выполнить файл миграции:
knex migrate:latest
Приведенная выше команда выполняет файл миграции, который вы создали ранее, создавая таблицу Blog в вашей базе данных.
Создание сервера Bun-Elysia
В этом шаге вы создадите простой сервер API.
Откройте файл index.ts
и добавьте блок кода, приведенный ниже:
//index.ts
const { Elysia } = require("elysia");
let db = require("./db");
db = db.default;
const app = new Elysia();
В приведенном ниже блоке кода вы импортировали Elysia и создали экземпляр фреймворка Elysia (app).
Создание обработчиков маршрутов
Далее вы создадите обработчики маршрутов для вашего приложения. Созданные вами обработчики будут предназначены для следующих маршрутов:
- POST /posts/create-new-post
- GET /posts
- GET /posts/:id
- PATCH /posts/:id/update-post
- DELETE /posts/:id/delete-post
Добавьте приведенный ниже блок кода в файл index.ts
, чтобы создать обработчик для “/posts/create-new-post”:
app.post("/posts/create-new-post", async (context) => {
try {
//Extract the title, content and author from the request body
const { title, content, author } = context.body;
//Insert the post into the database
const post = await db("blog").insert({
title,
content,
author,
});
//Send response to the client
return new Response(JSON.stringify(post));
} catch (error: any) {
//Send error to the client
return new Response(error.message, { status: 500 });
}
});
Блок кода выше – это обработчик маршрута для конечной точки, которая добавляет новые посты в вашу базу данных.
Добавьте приведенный ниже блок кода в ваш файл index.ts
, чтобы создать обработчик, который получает все ваши посты “/posts”:
app.get("/posts", async (context) => {
try {
//Get all posts from the database
const posts = await db.select("*").from("blog");
//Send response to the client
return new Response(JSON.stringify(posts));
} catch (error: any) {
//Send error to the client
return new Response(error.message, { status: 500 });
}
});
Добавьте приведенный ниже блок кода в ваш файл index.ts
, чтобы создать обработчик, который получает один пост по id “/posts/:id”:
app.get("/posts/:id", async (context) => {
//Extract the id from the request params
const { id } = context.params;
//Get the post from the database
const post = await db("blog").where({ id });
//If the post is not found, send a 404 response
if (post.length === 0) {
return new Response("Post not found", { status: 404 });
}
//Send response to the client
return new Response(JSON.stringify(post));
});
Добавьте приведенный ниже блок кода в файл index.ts
, чтобы создать обработчик, который обновляет один пост с данными в полезной нагрузке по id “/posts/:id/update-post”:
app.patch("/posts/:id/update-post", async (context) => {
//Extract the id from the request params
const { id } = context.params;
//Extract the title and content from the request body
const { title, content } = context.body;
//Update the post in the database
const post = await db("blog").where({ id }).update(
{
title,
content,
},
["id", "title", "content"]
);
//Send response to the client
return new Response(JSON.stringify(post));
});
Добавьте приведенный ниже блок кода в файл index.ts
, чтобы создать обработчик, удаляющий один пост по id “/posts/:id/delete-post”:
app.delete("/posts/:id/delete-post", async (context) => {
//Extract the id from the request params
const { id } = context.params;
//Delete the post from the database
const post = await db("blog").where({ id }).del();
//Send response to the client
return new Response(JSON.stringify(post));
});
Наконец, добавьте приведенный ниже блок кода, чтобы установить PORT для вашего приложения.
app.listen(3000, () => {
console.log("Server running on port 3000");
});
Выполните приведенную ниже команду, чтобы запустить ваше приложение:
bun --watch index.ts
Развертывание приложения Bun на контейнерах Back4app
Развертывание приложения Bun требует нескольких шагов.
Шаг 1: Напишите Dockerfile
Чтобы создать Dockerfile, выполните приведенную ниже команду в терминале.
touch Dockerfile
Выполнение приведенной выше команды создает Dockerfile в корневом каталоге вашего проекта.
Затем откройте свой Dockerfile и добавьте в него блок кода, приведенный ниже:
FROM oven/bun
WORKDIR /app
COPY package.json .
COPY bun.lockb .
RUN bun install
COPY . .
EXPOSE 3000
CMD ["bun", "index.ts"]
В приведенном выше Dockerfile первая строка, FROM oven/bun
, указывает базовый образ для использования. Этот образ представляет собой предварительно собранный образ, содержащий среду выполнения Bun и все ее зависимости.
Следующая строка, WORKDIR /app
, задает рабочий каталог для образа. Это каталог, в который будет скопирован и запущен код приложения.
Следующие две строки, COPY package.json .
и COPY bun.lockb .
, копируют файлы package.json
и bun.lockb
из текущей директории в образ. Эти файлы необходимы среде выполнения Bun для установки зависимостей приложения.
Следующая строка, RUN bun install
, устанавливает зависимости приложения с помощью среды выполнения Bun.
Следующая строка, COPY ...
, копирует весь текущий каталог в образ. Сюда входит код приложения и любые другие необходимые файлы.
Следующая строка, EXPOSE 3000
, открывает порт 3000
из контейнера для внешнего мира. Это порт, который будет прослушивать приложение.
Последняя строка, CMD ["bun", "index.ts"]
, задает команду, которая будет выполняться при запуске контейнера. Эта команда запустит среду выполнения Bun и запустит файл index.ts
приложения.
Наконец, разместите свой код на GitHub.
Шаг 2: Создайте приложение Back4app
Следующим шагом для размещения приложения Bun будет создание нового приложения на Back4App. Сначала войдите в свою учетную запись Back4App или зарегистрируйтесь, если у вас ее еще нет. Войдя в систему, вы окажетесь на панели Back4App.
Нажмите на кнопку “NEW APP” и выберите опцию“Containers as a Service“.
В качестве следующего шага для размещения приложения Bun подключите свой аккаунт GitHub к аккаунту Back4app. Подключение аккаунта позволит Back4app получить доступ к репозиториям на вашем аккаунте.
Вы можете разрешить доступ ко всем репозиториям в вашей учетной записи или к определенным репозиториям. Выберите приложение, которое вы хотите развернуть, в данном случае приложение, которое вы создали в этом уроке, и нажмите кнопку Выбрать.
После нажатия кнопки Select вы попадете на страницу конфигурации, где вам нужно будет заполнить подробную информацию о вашем приложении, например, PORT и переменные окружения.
После заполнения данных нажмите кнопку Create App (Создать приложение ). Это запустит процесс развертывания. Развертывание должно пройти успешно, и вы получите URL-адрес для доступа к вашему приложению, но если это не удастся, вы можете воспользоваться интеграцией Back4app ChatGPT, чтобы решить проблемы, возникшие с вашим Dockerfile.
Кроме того, вы можете вручную устранить ошибки развертывания, используя подробные журналы и руководство по устранению неполадок Back4app.
Заключение
В этой статье вы узнали о среде выполнения Bun JavaScript, ее преимуществах и очевидных ограничениях. Вы также узнали, как создать приложение Bun, используя Elysia, Knex и PostgreSQL.
Наконец, вы изучили контейнеры Back4app и способы развертывания приложений Bun на этой платформе.
При использовании Bun важно учитывать, что он все еще находится на ранней стадии развития и в будущем в него могут быть внесены некоторые существенные изменения.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Что такое Bun?
Bun — это среда выполнения JavaScript, разработанная для быстрой и эффективной работы. Она построена на основе движка JavaScriptCore и использует ряд оптимизаций (преимуществ использования языка низкого уровня Zig), чтобы сделать ее быстрее.
Как развернуть приложение Bun?
– Создайте приложение Bun.
– Напишите Dockerfile.
– Отправьте свое приложение Bun на GitHub.
– Откройте учетную запись Back4app или войдите в существующую учетную запись.
– Создайте новое приложение «CaaS» на Back4app.
– Предоставьте Back4app доступ к приложению, которое вы хотите развернуть.
– Выберите приложение и заполните данные конфигурации.
– Нажмите «Развернуть».