Доступна платформа Deno 2.0, развиваемая автором Node.js

Опубликован выпуск платформы Deno 2.0, предназначенной для обособленного выполнения серверных приложений на языках JavaScript и TypeScript с использованием движка V8, применяемого в браузерах на основе Chromium. Проект Deno развивает Райан Даль (Ryan Dahl), создатель Node.js, с целью предоставления более защищённого окружения и устранения концептуальных ошибок, допущенных в архитектуре Node.js. Для повышения безопасности обвязка вокруг движка V8 написана на языке Rust, а для обработки запросов в неблокирующем режиме применяется платформа Tokio. Код проекта распространяется под лицензией MIT. Сборки подготовлены для Linux, Windows и macOS.

При подготовке новой ветки основное внимание было уделено совместимости со старой инфраструктурой JavaScript и расширению спекта поддерживаемых JavaScript-проектов без ущерба обеспечению безопасности. Среди изменений:

  • Реализована обратная совместимость с Node.js и npm, позволяющая запускать немодифицированные приложения, созданные для Node.js. Поддержка Node.js также даёт возможность постепенно переводить существующие проекты с Node.js на использование Deno или подключать к Deno-проектам зависимости из NPM через указание спецификатора "npm:" при импорте пакетов в deno.json.
  • Добавлена встроенная поддержка файла package.json и каталога с модулями node_modules, применяемых в Node.js.
  • Обеспечена поддержка приватных NPM-репозиториев, определённых через файлы ".npmrc".
  • Добавлена поддержка популярных JavaScript-фреймворков, таких как Next.js, Astro, Remix, Angular, SvelteKit и QwikCity.
  • Добавлена поддержка рабочих пространств npm (workspace) и моно-репозиториев (monorepo) с раздельной обработкой зависимостей.
  • Добавлены новые команды управления пакетами: "deno install" для установки зависимостей, "deno add" для добавления пакетов в package.json или deno.json, "deno remove" для удаления пакетов. Отмечается, что "deno install" работает примерно на 15 быстрее npm при отсутствия пакетов в кэше и на 90% быстрее при наличии пакета в кэше (поддерживается как node_modules, так и собственный глобальный кэш).
  • Стабилизирована стандартная библиотека.
  • Обеспечен длительный цикл поддержки (LTS).
  • Представлен JSR - репозиторий с JavaScript- и TypeScript-библиотеками, которые можно использовать в различными JavaScript Runtime.
  • В команде "deno fmt" появилась возможность форматирования контента в форматах HTML, CSS и YAML.
  • В команду "deno lint" добавлена поддержка специфичных для Node.js правил и исправлений.
  • В команде "deno test" реализована возможность запуска тестов, созданных с использованием node:test.
  • В команде "deno task" реализована поддержка запуска скриптов через package.json.
  • В команде "deno compile" появилась возможность заверения кода цифровой подписью.
  • В команде "deno serve" реализовано распараллеливания операций HTTP-серверов с задействованием нескольких ядер CPU.
  • В команде "deno coverage" появилась поддержка сохранения отчётов в формате HTML.
  • Проведена оптимизация производительности.

Основные особенности Deno:

  • Ориентация на безопасность в конфигурации по умолчанию. Обращения к файлам, сетевые возможности и доступ к переменным окружения по умолчанию блокированы и требуют явного включения. Приложения по умолчанию запускаются в изолированных sandbox-окружениях и не могут получить доступ к системным возможностям без предоставления явных полномочий;
  • Встроенная поддержка языка TypeScript помимо JavaScript. Для проверки типов и генерации JavaScript задействован штатный компилятор TypeScript, что приводит к проседанию производительности по сравнению с разбором JavaScript в V8;
  • Runtime поставляется в форме одного самодостаточного исполняемого файла ("deno"). Для запуска приложений при помощи Deno достаточно загрузить для своей платформы один исполняемый файл, размером около 40 МБ, не имеющий внешних зависимостей и не требующий какой-то особой установки в систему. При этом deno не является монолитным приложением, а представляет собой коллекцию crate-пакетов на Rust (deno_core, rusty_v8), которые могут использоваться по отдельности;
  • При запуске программы, а также для загрузки модулей можно использовать адресацию через URL. Например, для запуска программы welcome.js можно использовать команду "deno https://deno.land/std/examples/welcome.js". Код с внешних ресурсов загружается и кэшируется на локальной системе, но никогда автоматически не обновляется (для обновления требуется явно запустить приложение с флагом "--reload");
  • Эффективная обработка в приложениях сетевых запросов по HTTP, платформа рассчитана на создание высокопроизводительных сетевых приложений;
  • Возможность создания универсальных web-приложений, которые могут выполниться как в Deno, так и в обычном web-браузере;
  • Наличие стандартного набора модулей, использование которых не требует привязки к внешним зависимостям. Модули из стандартной коллекции прошли дополнительный аудит и проверку на совместимость;
  • Кроме runtime платформа Deno также выполняет роль пакетного менеджера и позволяет внутри кода обращаться к модулям по URL. Например, для загрузки модуля можно указать в коде "import * as log from "https://deno.land/std/log/mod.ts". Файлы, загруженные с внешних серверов по URL, кэшируются. Привязка к версиям модулей определяются через указания номеров версий внутри URL, например, "https://unpkg.com/liltest@0.0.5/dist/liltest.js";
  • Ориентация на использование Web-стандартов, поддержка Promise, fetch и ECMAScript-модулей.
  • Совместимость с пакетами, размещёнными в репозитории NPM и созданными для платформы Node.js.
  • В состав интегрирована система инспектирования зависимостей (команда "deno info") и утилита для форматирования кода (deno fmt);
  • Все скрипты приложения могут быть объединены в один JavaScript-файл.