06.07.2020

Автор Node.js представил защищённую JavaScript-платформу Deno 1.0


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

Значительный номер версии связан со стабилизацией API в пространстве имён Deno, которые отвечают за взаимодействие приложений с ОС. Программные интерфейсы, которые пока не стабилизированы, по умолчанию скрыты и доступны только при запуске в режиме «—unstable». По мере формирования новых версий подобные API постепенно будут переводиться в разряд стабильных. API в глобальном пространстве имён, включающий такие общие функции как setTimeout() и fetch(), по возможности приближен к API обычных web-браузеров и развивается в соответствии с Web-стандартами для браузеров. Предоставляемые Rust API, которые применяется непосредственно в коде платформы, а также интерфейс для разработки плагинов к Deno runtime, пока не стабилизированы и продолжают развиваться.

Ключевыми мотивами создания новой JavaScript-платформы стало желание устранить концептуальные ошибки, допущенные в архитектуре Node.js, и предоставить пользователям более защищённое окружение. Для повышения безопасности обвязка вокруг движка V8 написана на языке Rust, позволяющем избежать многих уязвимостей, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей и выход за границы буфера. Для обработки запросов в неблокирующем режиме применяется платформа Tokio, также написанная на языке Rust. Tokio позволяет создавать высокопроизводительные приложения на основе событийно-ориентированной архитектуры (Event-driven), поддерживающие многопоточность и обработку сетевых запросов в асинхронном режиме.

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

  • Ориентация на безопасность в конфигурации по умолчанию. Обращения к файлам, сетевые возможности и доступ к переменным окружения по умолчанию блокированы и требуют явного включения. Приложения по умолчанию запускаются в изолированных sandbox-окружениях и не могут получить доступ к системным возможностям без предоставления явных полномочий;
  • Встроенная поддержка языка TypeScript помимо JavaScript. Для проверки типов и генерации JavaScript задействован штатный компилятор TypeScript, что приводит к проседанию производительности по сравнению с разбором JavaScript в V8. В будущем планируется подготовить собственную реализацию системы проверки типов TypeScript, которая позволит на порядок поднять производительность обработки TypeScript;
  • Runtime поставляется в форме одного самодостаточного исполняемого файла («deno»). Для запуска приложений при помощи Deno достаточно загрузить для своей платформы один исполняемый файл, размером около 20 Мб, не имеющих внешних зависимостей и не требующий какой-то особой установки в систему. При этом 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»;
  • В состав интегрирована система инспектирования зависимостей (команда «deno info») и утилита для форматирования кода (deno fmt);
  • Все скрипты приложения могут быть объединены в один JavaScript файл.

Отличия от Node.js:

  • Deno не использует пакетный менеджер npm и не привязывается к репозиториям, адресация модулей осуществляется через URL или по файловому пути, а сами модули могут размещаться на любом сайте;
  • В Deno не используется «package.json» для определения модулей;
  • Различие API, все асинхронные действия в Deno возвращают promise;
  • Deno требует явного определения всех необходимых полномочий для файлов, сети и переменных окружения;
  • Все ошибки, не снабжённые обработчиками, приводят к завершению выполнения приложения;
  • В Deno применяется система модулей ECMAScript и не поддерживается require();
  • Встроенный HTTP-сервер Deno написан на TypeScript и работает поверх нативных TCP-сокетов, а HTTP-сервер Node.js написан на Си и предоставляет привязки для JavaScript. Разработчики Deno сосредоточили усилия на оптимизации всего слоя TCP-сокетов и предоставление более общего интерфейса. HTTP-сервер Deno обеспечивает меньшую пропускную способность, но гарантирует предсказуемые низкие задержки. Например, в тесте простое приложение на базе Deno HTTP server смогло обработать 25 тысяч запросов в секунду с максимальной задержкой в 1.3 миллисекунд. В Node.js аналогичное приложение обработало 34 тысячи запросов в секунду, но задержки колебались от 2 и 300 миллисекунд.
  • Deno не совместим с пакетами для Node.js (NPM), но отдельно развивается прослойка для совместимости со стандартной библиотекой Node.js, по мере развития которой в Deno смогут запускаться всё больше приложений, написанных для Node.js.
  • Источник: https://www.opennet.ru/opennews/art.shtml?num=52947

Добавить комментарий