Deno 2.9 вышел, и главная фича — deno desktop. Это новый способ собирать нативные десктопные приложения из веб-стека. Никакого Electron или Tauri, никакой лишней обвязки. На выходе — один бинарник. Ты просто указываешь на скрипт, и рантайм сам поднимает webview с UI, бэкенд крутится на Deno, а компилируется всё в один исполняемый файл.
Из коробки доступны нативные API: Deno.BrowserWindow для управления окном, Deno.Tray для иконки в трее, Deno.Dock на macOS. Есть два бэкенда для рендеринга: webview по умолчанию (использует встроенный движок ОС) и cef (встраивает Chromium). Для сборки под все платформы достаточно одной команды — --all-targets делает бинарники под Windows, macOS и Linux на любой машине.
Ещё deno desktop умеет автоматически детектить веб-фреймворк в папке — поддерживаются Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start и Vite SSR. Режим --hmr включает hot reload.
Производительность в 2.9 серьёзно подтянули. Холодный старт упал с 34 до 17 миллисекунд — почти в два раза. Потребление памяти под нагрузкой теперь держится стабильно около 62 MB вне зависимости от нагрузки: на реальном Deno.serve выигрыш в 2.2 раза по RSS, на больших ответах — в 3.1 раза. Пропускная способность HTTP выросла на 11-27% в разных сценариях — за счёт нового собственного пути обработки HTTP/1.1 и переноса горячих участков из JavaScript в Rust.
Мигрировать существующий Node-проект на Deno теперь проще некуда. deno install умеет читать lock-файлы от npm, pnpm, yarn и Bun — он конвертирует их в deno.lock, перенося точные версии зависимостей. pnpm-воркспейсы тоже завозятся: он находит pnpm-workspace.yaml и встраивает его в конфиг. Для тулов, которые вызывают node напрямую (типа Turbopack), Deno подсовывает прослойку на PATH, которая перенаправляет вызовы на себя.
Появились новые команды для управления зависимостями: deno link и deno unlink (аналог npm link), и deno list — таблица с тем, от чего зависит проект. Также добавили опцию preferPackageJson, чтобы все команды работали через package.json, а не deno.json.
В тестовом раннере много вкусного. Встроенный t.assertSnapshot() для снапшот-тестов — не нужен внешний инструмент. Работает по --changed, чтобы гонять только затронутые тесты (с обходом графа модулей). Появились --retry и --repeats для флакающих тестов, пороговые значения покрытия, шардирование для CI (--shard) и параметризованные тесты через Deno.test.each.
deno compile получил --include-as-is для встраивания статики, опцию --bundle для минимизации бинарников (lodash с 11.6 MB упал до 1.5 MB), и --watch для пересборки при изменении кода.
Форматтер deno fmt переписали на новые движки. HTML, XML, SVG, CSS и SQL теперь форматируются без перестановок токенов и без падений на битом входе. Большой файл на 10 MB, который раньше не форматировался за 15 минут, теперь обрабатывается за десятую долю секунды. Добавили поддержку .editorconfig, настройки сортировки импортов и trailing commas в JSON.
В сторону Node.js-совместимости: целевая версия поднята до Node.js 26. Голые импорты вроде "fs" теперь работают без флагов. node:test получил mock.module() и mock.timers. Реализованы process.resourceUsage(), worker_threads.isInternalThread. NAPI теперь версии 10.
И наконец — Web Cryptography API. Deno 2.9 первым из рантаймов добавил пост-квантовые алгоритмы NIST: ML-KEM (ключевая инкапсуляция), ML-DSA и SLH-DSA (подписи). Все с JWK-сериализацией.