Deno 1.35: быстрый и удобный способ создания веб-серверов

(Первоначально опубликовано на deno.com/blog.)

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

Сегодняшний второстепенный релиз приближает нас к этому видению:

Помимо вышеупомянутых функций, этот выпуск также включает в себя множество других улучшений и исправлений ошибок:

Deno.serve() теперь работает стабильно

Долгожданный новый API веб-сервера, Deno.serve(), теперь стабилен. Он предлагает гораздо более простой API при значительном повышении производительности.

Deno.serve() позволяет разработчикам настроить веб-сервер с помощью одной строки кода:

Deno.serve((req) => new Response("hello world"));

Сравните его с более ранним API, Deno.serveHttp(), который требовал установки асинхронного итератора для соединений и последующей обработки HTTP-событий (в асинхронном IIFE):

async function handleHttp(conn: Deno.Conn) {
  (async () => {
    for await (const r of Deno.serveHttp(conn)) {
      r.respondWith(new Response("Hello World"));
    }
  });
}
for await (const conn of Deno.listen({ port: 8000 })) {
  handleHttp(conn);
}

Deno.serve() использует стандартные веб-объекты Запрос и Ответ для бесшовного взаимодействия с fetch(), веб-потоками и другими стандартными API.

Кроме того, Deno.serve() обеспечивает ощутимые преимущества в производительности. В наших тестах сервер hello-world, созданный с помощью Deno.serve(), показал вдвое большую пропускную способность, чем аналогичный сервер Node.js, с меньшей задержкой хвоста и более эффективным использованием памяти.

Любой пакет npm, использующий модуль node:http, будет использовать этот API внутри, чтобы получить те же преимущества в производительности. Вот сравнение работы сервера «hello-world» express в Node.js и Deno:

Эти тесты проводились для Node 18.12.1 на чистом металлическом процессоре Intel Xeon E-2378G с тактовой частотой 2,80 ГГц и Ubuntu 22.04.

Для получения дополнительной информации об этом новом API обратитесь к Документации Deno.serve() и Руководству Deno.

Улучшения совместимости npm и Node.

Совместимость Deno с npm позволяет вам использовать готовые пакеты с минимальными рисками цепочки поставок.

В этом месяце мы значительно улучшили совместимость модулей http, https и zlib. Полный список изменений встроенного модуля Node.js включает:

  • fs.FileHandle
  • http.ClientRequest.upgrade
  • http.IncomingMessageForClient.complete
  • http2
  • https.createServer
  • process.reallyExit
  • v8.setFlagsFromString
  • zlib.brotliCompress
  • zlib.brotliCompressSync
  • zlib.brotliDecompress
  • zlib.brotliDecompressSync
  • zlib.createBrotliCompress
  • zlib.createBrotliDecompress

В каждом выпуске добавляется поддержка все большего количества пакетов npm. Вот список долгожданных пакетов, которые теперь работают с Deno благодаря улучшениям ранее упомянутых API:

В следующем месяце мы сосредоточим наши усилия на том, чтобы заставить работать @grpc/grpc-js, google-cloud-node и различные драйверы БД. Если вы обнаружите, что пакет не работает, сообщите о проблеме в denoland/deno репозиторий.

Deno Изменения API

Следующие API были добавлены в пространство имен Deno:

  • Deno.AtomicOperation
  • Deno.errors.FilesystemLoop
  • Deno.errors.IsADirectory
  • Deno.errors.NetworkUnreachable
  • Deno.errors.NotADirectory
  • Deno.InspectOptions.breakLength
  • Deno.InspectOptions.escapeSequences
  • Deno.KV.enqueue

Кроме того, для этих API больше не требуется флаг --unstable:

  • Deno.ConnectTlsOptions.alpnProtocols
  • Deno.ListenTlsOptions.alpnProtocols
  • Deno.serve
  • Deno.StartTlsOptions.alpnProtocols

Вы можете узнать больше об этих API, посетив Справочник по API.

Изменения веб-API

В этом выпуске добавлена ​​поддержка API Headers.getSetCookie() и ReadableStream.from(), а URLSearchParams.delete() и URLSearchParams.has() теперь поддерживают параметр value.

Улучшения языкового сервера

Этот выпуск значительно улучшает качество жизни LSP, устраняя давнюю проблему с автоматическим импортом пакетов npm и карт импорта.

Автозаполнение для спецификаторов npm: теперь работает:

Так же как и автозаполнение для спецификаторов карты импорта:

Изменения в стандартной библиотеке

Переписать semver

В этом выпуске модуль semver стандартной библиотеки был переписан с нуля, чтобы уменьшить внутреннюю сложность и очистить общедоступные интерфейсы. Модуль начинался как порт npm:semver, но у него было много нежелательных характеристик, таких как; класс SemVer с отслеживанием состояния или чрезмерно перегруженные API.

В этом выпуске каждый экземпляр semver становится неизменяемым простым объектом JavaScript. Большинство API теперь принимают только один набор типов ввода. Старые интерфейсы поддерживаются тегами @deprecated JSDoc. Таким образом, ваш редактор укажет, что их нужно обновить. Старые интерфейсы планируется удалить в [email protected].

import { lte, parse } from "https://deno.land/[email protected]/semver/mod.ts";

lte(parse("1.2.3"), parse("1.2.4"));

lte("1.2.3", "1.2.4"); // This is deprecated now

Спасибо Justin Chase, Jesse Jackson, Max Duval, Asher Gomez, Tim Reichen за внесенные изменения.

Добавление html/entities

В этом релизе добавлен новый стандартный модуль html. В настоящее время модуль имеет API escape и unescape, которые экранируют/не экранируют специальные символы HTML в заданных строках.

import {
  escape,
  unescape,
} from "https://deno.land/[email protected]/html/entities.ts`";

escape("<html>"); // => "&lt;html&gt;"
unescape("&lt;html&gt;"); // =>  "<html>"

escape экранирует 5 символов, &, <, >, " и ' по умолчанию. unescape обрабатывает эти 5 плюс &apos;, &nbsp;, а также десятичные и шестнадцатеричные объекты HTML по умолчанию. Существует также возможность включения обработки всех известных объектов HTML. См. документацию модуля для более подробной информации.

Спасибо Lionel Rowe за эту функцию.

Добавление http/user_agent

В этом релизе добавлен http/user_agent. Модуль определяет типы ОС, ЦП, устройства и браузера из заданной строки агента пользователя. Модуль сильно вдохновлен npm:ua-parser-js.

import { UserAgent } from "https://deno.land/[email protected]/http/user_agent.ts";

const ua = new UserAgent(
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
);
console.log(ua.os); // => { name: "Linux", version: "x86_64" }
console.log(ua.cpu); // => { architecture: "amd64" }
console.log(ua.engine); // => { name: "Blink", version: "51.0.2704.103" }
console.log(ua.browser); // => { name: "Chrome", version: "51.0.2704.103", major: "51" }

Спасибо Kitson Kelly за эту функцию.

V8 11.6 и TypeScript 5.1.6

Наконец, Deno v1.35 поставляется с V8 11.6 и TypeScript 5.1.6.

Посмотрите на Fresh 1.2, последний выпуск нашей веб-инфраструктуры нового поколения.