Deno 1.35: быстрый и удобный способ создания веб-серверов
(Первоначально опубликовано на deno.com/blog.)
Видение Deno состоит в том, чтобы максимально упростить программирование, поэтому среда выполнения поставляется с надежным набором инструментов, встроенной поддержкой TypeScript и веб-стандартными API, так что вы можете пропустить настройку и изучение нового набора API и быть продуктивным немедленно.
Сегодняшний второстепенный релиз приближает нас к этому видению:
- быстрый и удобный способ создания веб-серверов,
Deno.serve()
, теперь стабилен - улучшение поддержки npm с добавлением долгожданных пакетов
Помимо вышеупомянутых функций, этот выпуск также включает в себя множество других улучшений и исправлений ошибок:
Deno
Изменения API- Изменения веб-API
- Улучшения языкового сервера
- Изменения в стандартной библиотеке
- V8 11.6 и TypeScript 5.1.6
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>"); // => "<html>" unescape("<html>"); // => "<html>"
escape
экранирует 5 символов, &
, <
, >
, "
и '
по умолчанию. unescape
обрабатывает эти 5 плюс '
,
, а также десятичные и шестнадцатеричные объекты 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, последний выпуск нашей веб-инфраструктуры нового поколения.