Została zaprezentowana wersja Deno 1.28, platformy do izolowanego uruchamiania aplikacji w językach JavaScript i TypeScript, która może być wykorzystywana do tworzenia serwerowych ob handlerów. Platforma jest rozwijana przez Ryana Dahla, twórcę Node.js. Podobnie jak w Node.js, w Deno wykorzystywany jest silnik JavaScript V8, który znajduje zastosowanie w przeglądarkach opartych na Chromium. Deno nie jest jednak pochodną Node.js, lecz nowym projektem stworzonym od podstaw. Kod projektu jest rozpowszechniany na licencji MIT. Kompilacje są dostępne dla systemów Linux, Windows i macOS.
Projekt Deno został stworzony, aby zapewnić użytkownikom bardziej bezpieczne środowisko i wyeliminować błędy koncepcyjne w architekturze Node.js. W celu zwiększenia bezpieczeństwa, otoczka wokół silnika V8 została napisana w języku Rust, co pozwala uniknąć wielu podatności wynikających z niskopoziomowej pracy z pamięcią. Do przetwarzania zapytań w trybie nieblokującym wykorzystano platformę Tokio, która również została napisana w Rust. Tokio umożliwia tworzenie wydajnych aplikacji opartych na architekturze zdarzeniowej (Event-driven), wspierających multithreading oraz asynchroniczne przetwarzanie zapytań sieciowych.
Kluczową zmianą w nowej wersji jest stabilizacja kompatybilności z pakietami umieszczonymi w repozytorium NPM, co pozwala na korzystanie w Deno z ponad 1,3 miliona modułów stworzonych dla platformy Node.js. Na przykład, w aplikacjach opartych na Deno można teraz używać takich modułów do organizowania stałego dostępu do danych jak Prisma, Mongoose oraz MySQL, jak również frameworków do obsługi front-endów, takich jak React i Vue. Niektóre moduły NPM wciąż pozostają niekompatybilne z Deno, np. z powodu powiązań z elementami środowiska specyficznymi dla Node.js, takimi jak plik package.json. Również do tej pory niemożliwe jest korzystanie z komendy „deno compile” z modułami NPM. W przyszłych wydaniach planuje się usunięcie takich niekompatybilności i ograniczeń.
Wsparcie dla wcześniej zastosowanego modelu Deno opartego na systemie modułów ECMAScript oraz Web API zostało zachowane na tym samym poziomie, a do importu modułów NPM stosowana jest znana z Deno procedura ładowania oparta na URL. Do odwołań do modułów NPM przewidziany jest specjalny prefiks URL "npm:", który może być stosowany analogicznie do zwykłych modułów Deno. Na przykład, aby zaimportować moduł NPM, można napisać 'import { chalk } from "npm:chalk@5";', a do uruchomienia skryptu NPM z linii poleceń użyć 'deno run —allow-env —allow-read npm:create-vite-extra'.
Użycie pakietów NPM w Deno jest znacznie prostsze niż w Node.js, ponieważ nie ma potrzeby wcześniejszego instalowania modułów (moduły są instalowane przy pierwszym uruchomieniu aplikacji), nie używa się pliku package.json, a także domyślnie katalogu node_modules (moduły są buforowane w wspólnym katalogu, ale istnieje możliwość powrotu do starego zachowania za pomocą opcji '—node-modules-dir').
W aplikacjach opartych na NPM zachowano możliwość korzystania z mechanizmów zarządzania dostępem, izolacji i włączania rozszerzonych funkcji bezpieczeństwa dostarczonych w Deno. Aby przeciwdziałać atakom z wykorzystaniem wątpliwych zależności, Deno domyślnie blokuje wszelkie próby uzyskania dostępu do systemu z zależności i wyświetla ostrzeżenie o wykrytych problemach. Na przykład przy próbie dostępu modułu do zapisu w /usr/bin/ pojawi się prośba o potwierdzenie tej operacji: deno run npm:install-malware ⚠️ ┌ Deno prosi o dostęp do zapisu w /usr/bin/. ├ Zażądane przez `install-malware` ├ Uruchom ponownie z —allow-write, aby pominąć ten komunikat. └ Zezwolić? [y/n] (y = tak, pozwól; n = nie, odrzuć) >
W nowej wersji, spośród niezwiązanych z NPM ulepszeń, wspomniano o aktualizacji silnika V8 do wersji 10.9, automatycznym wykrywaniu plików z blokadami, stabilizacji API Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() i Deno.uid(), dodaniu nowego niestabilnego API Deno.Command() do uruchamiania poleceń (uniwersalna zamiana Deno.spawn, Deno.spawnSync i Deno.spawnChild).
Główne cechy Deno:
- Skoncentrowanie na bezpieczeństwie w konfiguracji domyślnej. Dostęp do plików, możliwości sieciowe i dostęp do zmiennych środowiskowych są domyślnie zablokowane i wymagają jawnego włączenia. Aplikacje domyślnie uruchamiane są w izolowanych środowiskach sandbox i nie mogą uzyskać dostępu do możliwości systemowych bez przyznania jawnych uprawnień;
- Wbudowane wsparcie dla języka TypeScript oprócz JavaScript. Do weryfikacji typów i generacji JavaScript wykorzystywany jest standardowy kompilator TypeScript, co prowadzi do spadku wydajności w porównaniu do analizy JavaScript w V8;
- Runtime jest dostarczany w formie jednego samowystarczalnego pliku wykonywalnego („deno”). Aby uruchomić aplikacje za pomocą Deno, wystarczy pobrać jeden plik wykonywalny odpowiedni dla swojej platformy, o rozmiarze około 30 MB, nie mający zewnętrznych zależności i nie wymagający szczególnej instalacji w systemie. Przy tym deno nie jest monolityczną aplikacją, lecz zestawem pakietów crate w Rust (deno_core, rusty_v8), które można wykorzystać oddzielnie;
- Podczas uruchamiania programu, a także do ładowania modułów można użyć adresacji przez URL. Na przykład, aby uruchomić program welcome.js, można użyć polecenia „deno https://deno.land/std/examples/welcome.js”. Kod z zewnętrznych źródeł jest pobierany i buforowany na lokalnym systemie, ale nigdy nie jest automatycznie aktualizowany (aby go zaktualizować, należy wyraźnie uruchomić aplikację z flagą „—reload”);
- Skuteczna obsługa żądań sieciowych HTTP w aplikacjach, platforma jest zaprojektowana do tworzenia wysokowydajnych aplikacji sieciowych;
- Możliwość tworzenia uniwersalnych aplikacji webowych, które mogą działać zarówno w Deno, jak i w zwykłej przeglądarce internetowej;
- Posiadanie standardowego zestawu modułów, których użycie nie wymaga powiązania z zewnętrznymi zależnościami. Moduły ze standardowej kolekcji przeszły dodatkowy audyt i sprawdzenie na zgodność;
- Oprócz runtime platforma Deno pełni również rolę menedżera pakietów i pozwala na odwoływanie się do modułów w kodzie przez URL. Na przykład, aby załadować moduł, można w kodzie użyć „import * as log from "https://deno.land/std/log/mod.ts". Pliki pobrane z zewnętrznych serwerów URL są buforowane. Powiązania z wersjami modułów określane są poprzez wskazanie numerów wersji w URL, na przykład „https://unpkg.com/liltest@0.0.5/dist/liltest.js”;
- W skład integracji wchodzi system inspekcji zależności (komenda „deno info”) oraz narzędzie do formatowania kodu (deno fmt);
- Wszystkie skrypty aplikacji mogą zostać połączone w jeden plik JavaScript.
Źródło: opennet.ru
