Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
14 мая 2020 года
После двух лет разработки представлен первый значительный выпуск Deno 1.0, платформы для обособленного выполнения приложений на языках JavaScript и TypeScript, которая может быть использована для создания обработчиков, работающих на сервере. Платформу развивает Райан Даль ( Ryan Dahl), создатель Node.js. Как и в Node.js в Deno используется JavaScript-движок V8, который также применяется в браузерах на основе Chromium. При этом Deno не является ответвлением от Node.js, а представляет собой созданный с нуля новый проект. Код проекта распространяется под лицензией MIT. Сборки подготовлены для Linux, Windows и macOS.
Значительный номер версии связан со стабилизацией API в пространстве имён Deno, которые отвечают за взаимодействие приложений с ОС. Программные интерфейсы, которые пока не стабилизированы (Архивная копия от 20 октября 2020 на Wayback Machine), по умолчанию скрыты и доступны только при запуске в режиме "--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 (Архивная копия от 19 февраля 2020 на Wayback Machine)". Код с внешних ресурсов загружается и кэшируется на локальной системе, но никогда автоматически не обновляется (для обновления требуется явно запустить приложение с флагом "—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), но отдельно развивается прослойка (Архивная копия от 27 августа 2020 на Wayback Machine) для совместимости со стандартной библиотекой Node.js, по мере развития которой в Deno смогут запускаться всё больше приложений, написанных для Node.js.
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.