Deno экосистема

Deno — современный runtime для JavaScript и TypeScript, созданный Райаном Далем, автором Node.js. Основные принципы Deno включают безопасность по умолчанию, встроенную поддержку TypeScript, модульную систему без центрального менеджера пакетов и минимализм. Эти особенности делают его удобной платформой для разработки веб-приложений, API и серверных сервисов.

Fresh — это фреймворк для построения веб-приложений на Deno, ориентированный на производительность и простоту. Он использует рендеринг на сервере и минималистичную архитектуру компонентов. Основные аспекты взаимодействия Fresh с Deno и его экосистемой описаны ниже.


Модули и импорт

В Deno отсутствует традиционный npm. Все зависимости подключаются через URL или локальные файлы. Синтаксис импорта выглядит следующим образом:

import { serve } from "https://deno.land/std@0.203.0/http/server.ts";

Ключевые моменты:

  • Версионирование через URL гарантирует стабильность проекта.
  • Стандартная библиотека (std) содержит утилиты для работы с HTTP, файловой системой, форматом данных и т.д.
  • Модули можно кешировать локально, и Deno автоматически проверяет их актуальность при запуске.

Безопасность по умолчанию

Deno запускает скрипты в изолированной среде. Доступ к файловой системе, сети или окружению требует явного разрешения:

deno run --allow-net --allow-read server.ts

Параметры:

  • --allow-net — разрешение на сетевые запросы.
  • --allow-read — доступ к файловой системе.
  • --allow-env — доступ к переменным окружения.
  • --allow-write — возможность записывать данные.

Такой подход предотвращает непреднамеренные изменения системы и повышает безопасность приложений.


Fresh и серверный рендеринг

Fresh строит страницы с SSR (Server-Side Rendering), что обеспечивает:

  • Быструю загрузку.
  • SEO-дружелюбность.
  • Меньшее потребление клиентских ресурсов.

Структура проекта Fresh включает:

  • routes/ — файлы с маршрутами, где каждая страница является модулем.
  • components/ — переиспользуемые UI-компоненты.
  • islands/ — интерактивные компоненты, рендерящиеся на клиенте по мере необходимости.

Пример простого маршрута:

import { h } from "preact";
import { Handlers } from "$fresh/server.ts";

export const handler: Handlers = {
  GET(req, ctx) {
    return ctx.render({ message: "Hello from Fresh!" });
  },
};

export default function HomePage({ data }) {
  return <h1>{data.message}</h1>;
}

Ключевые особенности:

  • ctx.render передаёт данные в компонент.
  • Маршруты и компоненты используют Preact для виртуального DOM.
  • SSR интегрируется напрямую с Deno без промежуточного сборщика.

Работа с API и серверными функциями

Fresh позволяет создавать API-эндпоинты в рамках маршрутов:

export const handler: Handlers = {
  POST: async (req) => {
    const data = await req.json();
    return new Response(JSON.stringify({ received: data }), {
      headers: { "Content-Type": "application/json" },
    });
  },
};

Особенности работы с API:

  • Каждая функция обработчика — отдельный модуль.
  • Типизация через TypeScript обеспечивает автодополнение и проверку данных.
  • Нет необходимости в отдельном роутере: маршруты формируются по структуре файлов.

Интеграция с сторонними библиотеками

Deno поддерживает модули через URL, включая популярные библиотеки:

  • oak — middleware для построения REST API.
  • deno-postgres — работа с PostgreSQL.
  • std — встроенные утилиты для работы с HTTP, буферами и временем.

Импорт осуществляется напрямую, без установки через менеджер пакетов:

import { Client } from "https://deno.land/x/postgres@v0.21.2/mod.ts";

Это упрощает управление зависимостями и исключает конфликты версий.


Тестирование и отладка

Deno имеет встроенные инструменты:

  • deno test — выполнение модульных тестов.
  • deno lint — статический анализ кода.
  • deno fmt — автоматическое форматирование.
  • deno bundle — сборка проекта в один файл для деплоя.

Пример теста:

import { assertEquals } from "https://deno.land/std@0.203.0/testing/asserts.ts";

Deno.test("Сумма чисел", () => {
  const sum = 2 + 3;
  assertEquals(sum, 5);
});

Сборка и деплой

Fresh не требует отдельного сборщика. Проект можно запускать напрямую:

deno run -A --watch main.ts

Для деплоя можно использовать:

  • Deno Deploy — облачная платформа с автоматическим SSR и CDN.
  • Docker — контейнеризация без Node.js.
  • Облачные провайдеры с поддержкой Deno.

Взаимодействие с фронтендом

Fresh поддерживает гибридную модель:

  • SSR для первичной загрузки страниц.
  • Интерактивные компоненты на клиенте (islands).
  • Минимизация клиентского JavaScript за счёт рендеринга только необходимых частей.

Пример интерактивного компонента:

import { useState } from "preact/hooks";

export default function Counter() {
  const [count, setCount] = useState(0);
  return (
    <button onCl ick={() => setCount(count + 1)}>
      Счётчик: {count}
    </button>
  );
}

Этот компонент загружается только при взаимодействии пользователя, экономя ресурсы.


Экосистема инструментов Deno

  • Deno Land — официальный реестр модулей.
  • Deno Deploy — хостинг серверных приложений.
  • Third-party modules — библиотеки для баз данных, аутентификации, графики, тестирования.
  • Deno CLI — мощный инструмент для запуска, форматирования, сборки и тестирования проектов.

Экосистема строится вокруг модульности и безопасности, что делает её удобной для современных веб-приложений и API.


Fresh на Deno сочетает минимализм с высокой производительностью, гибкой маршрутизацией и встроенной поддержкой TypeScript, обеспечивая современный подход к созданию веб-приложений и серверных сервисов.