Представен е новият вариант Deno 1.28, платформа за изпълнение на приложения на JavaScript и TypeScript, която може да се използва за създаване на сървърни обработчици. Платформата е разработена от Райан Дал (Ryan Dahl), създател на Node.js. Както в Node.js, в Deno се използва JavaScript двигателят V8, който също е интегриран в браузерите, базирани на Chromium. Въпреки това, Deno не е разклонение на Node.js, а представлява нов проект, създаден от нулата. Кодът на проекта е разпространен под лицензия MIT. Компилациите са подготвени за Linux, Windows и macOS.
Проектът Deno е създаден с цел да предостави на потребителите по-сигурна среда и да се отстранят концептуалните грешки, допуснати в архитектурата на Node.js. За да се увеличи безопасността, обвивката около двигателя V8 е написана на езика Rust, който помага да се избегнат много уязвимости, произтичащи от нискоуровневната работа с паметта. За обработка на заявки в неблокиращ режим се използва платформата Tokio, също написана на Rust. Tokio позволява създаването на високо производителни приложения на базата на събитийно-ориентирана архитектура, поддържаща многопоточност и асинхронна обработка на мрежови заявки.
Ключовата промяна в новия вариант е стабилизацията на съвместимостта с пакетите, разположени в репозитория NPM, което позволява използването на над 1.3 милиона модули, създадени за платформата Node.js. Например, в приложенията, базирани на Deno, сега могат да се използват модули за организиране на постоянен достъп до данни, като Prisma, Mongoose и MySQL, а също и фреймворки за работа на фронтенд, като React и Vue. Някои NPM модули все още не са съвместими с Deno, например, поради зависимости от специфични за Node.js елементи на околната среда, като файла package.json. Освен това, в момента е невъзможно да се използва командата „deno compile“ с NPM модули. В бъдещи версии се предвижда отстраняване на подобни несъвместимости и ограничения.
Поддръжката на предишната Deno моделна система, основаваща се на системата за модули ECMAScript и Web API, е запазена на същото ниво, а за импортиране на NPM модули използва познатата за Deno схема на зареждане, базирана на URL адреси. За достъп до NPM модули е предвиден специален URL префикс „npm:“, който може да се използва аналогично на обикновените Deno модули. Например, за импортиране на NPM модул може да се посочи ‘import { chalk } from „npm:chalk@5“;’, а за стартиране на NPM скрипт от командния ред — „deno run —allow-env —allow-read npm:create-vite-extra“.
Използването на NPM пакети в Deno е значително по-лесно, отколкото в Node.js, тъй като няма нужда от предварително инсталиране на модули (модулите се инсталират при първото стартиране на приложението), не се използва файл package.json, и по подразбиране не се използва директорията node_modules (модулите се кешират в обща директория, но има възможност за връщане към старата функционалност с опцията „—node-modules-dir“).
В приложения, основаващи се на NPM, се запазва възможността за използване на механизмите за контрол на достъпа, изолация и активиране на разширени функции за сигурност, предоставени от Deno. За да се предотвратят атаки чрез подозрителни зависимости, Deno по подразбиране блокира всички опити за достъп до системата от зависимости и извежда предупреждение при открити проблеми. Например, при опит на модул за достъп до запис в /usr/bin/ ще се появи искане за потвърждение на операцията: deno run npm:install-malware ⚠️ ┌ Deno изисква достъп до запис в /usr/bin/. ├ Изисквано от `install-malware` ├ Стартирайте отново с —allow-write, за да игнорирате това предупреждение. └ Позволете? [y/n] (y = да, позволи; n = не, откажи) >
От неподобрените в NPM подобрения в новата версия се споменава обновление на V8 движка до версия 10.9, автоматично разпознаване на файлове с блокажи, стабилизиране на API Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() и Deno.uid(), добавяне на нов нестабилен API Deno.Command() за стартиране на команди (универсална замяна на Deno.spawn, Deno.spawnSync и Deno.spawnChild).
Основни характеристики на Deno:
- Ориентация за сигурност в конфигурацията по подразбиране. Обращенията към файлове, мрежовите възможности и достъпът до променливи от среда по подразбиране са блокирани и изискват явно включване. Приложенията по подразбиране се стартират в изолирани среда за тестване и не могат да получат достъп до системни функции без предоставяне на явни права;
- Вградена поддръжка на TypeScript освен JavaScript. За проверка на типове и генериране на JavaScript се използва собствен компилатор TypeScript, което води до намаление на производителността в сравнение с парсинга на JavaScript в V8;
- Runtime-ът се предлага под формата на един самостоятелен изпълним файл ("deno"). За стартиране на приложения с Deno е достатъчно да изтеглите един изпълним файл за вашата платформа, с размер около 30 МБ, който няма външни зависимости и не изисква специална инсталация в системата. В същото време deno не е монолитно приложение, а представлява колекция от crate-пакети на Rust (deno_core, rusty_v8), които могат да се използват поотделно;
- При стартиране на програмата, а също така за зареждане на модули, може да се използва адресиране чрез URL. Например, за стартиране на програмата welcome.js може да се използва командата "deno https://deno.land/std/examples/welcome.js". Кодът от външни ресурси се зарежда и кешира на локалната система, но никога не се обновява автоматично (за обновяване е необходимо явно да се стартира приложението с флага "—reload");
- Ефективна обработка на HTTP мрежови заявки, платформата е проектирана за създаване на високопроизводителни мрежови приложения;
- Възможност за създаване на универсални уеб-приложения, които могат да се изпълняват както в 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 файл.
Източник: opennet.ru
