Після двох років розробки перший значний випуск , платформи для окремого виконання програм на мовах JavaScript і TypeScript, яка може бути використана для створення обробників, що працюють на сервері. Платформу розвиває Райан Даль (), творець Node.js. Як і в Node.js у Deno використовується JavaScript-движок , який також застосовується у браузерах на основі 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, що дозволяє уникнути багатьох уразливостей, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків і вихід за межі буфера. Для обробки запитів у неблокувальному режимі застосовується платформа , також написана мовою Rust. Tokio дозволяє створювати високопродуктивні програми на основі подієво-орієнтованої архітектури (Event-driven), що підтримують багатопоточність та обробку мережевих запитів в асинхронному режимі.
Основні Deno:
- Орієнтація на безпеку конфігурації за замовчуванням. Звертання до файлів, мережеві можливості та доступ до змінних оточення за замовчуванням блоковані та потребують явного включення. Програми за замовчуванням запускаються в ізольованих sandbox-оточеннях і не можуть отримати доступ до системних можливостей без надання явних повноважень;
- Вбудована підтримка мови TypeScript, крім JavaScript. Для перевірки типів та генерації JavaScript задіяно штатний компілятор TypeScript, що призводить до просідання продуктивності в порівнянні з розбором JavaScript в V8. У майбутньому планується підготувати власну реалізацію системи перевірки типів TypeScript, яка дозволить на порядок підняти продуктивність обробки TypeScript;
- Runtime поставляється у формі одного самодостатнього виконуваного файлу (deno). Для запуску програм за допомогою Deno достатньо для своєї платформи один виконуваний файл, розміром близько 20 Мб, які не мають зовнішніх залежностей і не потребує якоїсь особливої установки в систему. При цьому deno не є монолітним додатком, а є колекцією crate-пакетів на Rust (, ), які можуть використовуватись окремо;
- При запуску програми, а також для завантаження модулів, можна використовувати адресацію через URL. Наприклад, для запуску програми welcome.js можна використовувати команду "deno https://deno.land/std/examples/welcome.js". Код із зовнішніх ресурсів завантажується та кешується на локальній системі, але ніколи автоматично не оновлюється (для оновлення потрібно явно запустити програму з прапором «-reload»);
- Ефективна обробка у додатках мережних запитів по HTTP, платформа розрахована створення високопродуктивних мережевих додатків;
- Можливість створення універсальних web-додатків, які можуть виконатися як у Deno, так і у звичайному веб-браузері;
- Наявність використання яких не вимагає прив'язки до зовнішніх залежностей. Модулі зі стандартної колекції пройшли додатковий аудит та перевірку на сумісність;
- Крім 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.
Джерело: opennet.ru
