Deno nədir? NodeJS sonu gəldi?

Bahlul Hasanli
5 min readMar 25, 2021

NodeJS-in həyatımızda başqa bir yeri var. Artıq JavaScripti tək client tərəfdə deyil, həmçinin server tərəfdə də, aktiv formada istifadə edə bilirik. JavaScript ekosisteminin özəyini təşkil edir desək yalan olmaz. NodeJS demək olar hazırda bütün proyektlərimizdə istifadə edirik. REST servislər yazarkən, static veb proyektlər hazırlayarkən və ya ən sadəsi npm (Node Package Manager) istifadə edərək digər kitabxanaları proyektlərimizə əlavə edərkən. Hər şey əla və super desək də, sonradan bir “əmma” ortaya çıxır. NodeJS yaradıcısı Ryan Dahlın 2018-ci ildə təşkil olunan JS Conf EU-dakı çıxışı, NodeJS-in mənfi tərəflərini gün üzünə çıxardı. Hamılıqla istifadə etdiyimiz NodeJS-in mənfiləri nələr idi? Bir neçə bənddə bunu izah etməyə çalışacam.

1. Promise problemi

NodeJS ilk major versiyası 2009-cu ilin may ayının 27-də yayımlanmışdı. Təxminən bundan bir ay sonra promise əlavə edildi. Lakin bir müddət keçəndən sonra promise bir dəfəlik ləğv olundu. Buna səbəb kimi Ryan Dahl aşağıdakı formada açıqlama vermişdi.

“Mən də daxil olmaqla bir çox insan, diskdəki bir fayla daxil olmaq üçün aşağı səviyyəli bir kod interfeysi istəyir. Məhz buna görə, Promise strukturunda olduğu kimi, fayllara giriş prosesindən sonra avtomatik olaraq yeni bir JS obyekti yaratmaq lazım deyil. Digər tərəfdən, Promise quruluşunu istəyənlər də var. Ancaq sadəlik üçün promise əvəzinə callback quruluşundan istifadə edəcəyik və JS kitabxanaları üçün daha yaxşı abstraksiya qatları yaratmaq üçün çalışacağıq.”

Qısaca izah etmək lazım gələrsə, bir ədəd faylı oxumaq üçün promise quruluşu belə olacaqdı.

Ancaq readFile() əlavə obyekt return etməməsi üçün bunu callback strukturuna keçirdirlər.

Ryan Dahl başqa bir açıqlamasında “Node-dakı promise strukturu bəlkə də, NodeJS ekosistemini daha da sürətləndirə bilərdi. Bunu reallaşdırmadan dəqiq nəsə demək olmaz. Digər tərəfdən promise strukturunun ləğv edilməsi daha yaxşı oldu. Çünki bunun sayəsində mövcud NodeJS ekosistemi özünə məxsus abstrakt qatlar hazırlaya bildi. Ancaq hazırda istifadə olunan async API günü-gündən köhnəlməyə başlayır. Sözün düzünü desəm Promise strukturunu ləğv etmək düşüncəsiz hərəkət idi. Gərək promise ləğv etməsəydim” deyə bildirmişdi.

2. Təhlükəsizlik

JavaScript kodunu işə salan V8 engine, Python-na görə daha yaxşı sandbox təqdim edir. Amma Node-un özü belə desək təhlükəsiz olmaması onun ən böyük mənfilərindən biridir. Təhlükəsiz olmaması deyəndə nə nəzərdə tutulur? Proyektə əlavə edilən istənilən kod sistem daxilində istədiyi yerdən çağırış edə bilir (Məsələn: diski birbaşa icazəsiz oxuya bilər və ya network ilə bağlı çağırışlar). Ryan Dahl bununla bağlı açıqlamasında demişdi “NodeJS-in bu formada təhlükəsiz olmaması, vəziyyəti daha da qəlizləşdirmiş, server tərəfində runtime-ın müəyyən vəziyyətlərdə təhlükəsiz olması əldən qaçan fürsətə çevrilmişdi.”

3. package.json

Bildiyiniz kimi package.json faylı, yüklədiyimiz JS kitabxanalarını özündə saxlayır. Npm tərəfindən yaradılan bu paket faylı, Node tərəfdə require() funksiyası ilə birlikdə dəstələnməkdədir. Npm hazırda Node ilə birlikdə qurulu vəziyyətdə sistemimizə yüklənir.

Lakin modullar import edilən zaman istifadə olunan require(“moduleName”) funksiyası müəyyən bir path yolunu göstərmədiyi üçün sonradan modullar arasında problemlər çıxmağa başlaya bilər. Bu ən çox private modullar olan zaman baş verə biləcək problemlərdən biridir. Yüklənən bütün modullar node_modules qovluğunun içərisində yer alır. Buda bir müddət sonra şişməyə başlaya bilər. Hətta Gigabyte səviyyəsinə çata bilir. NodeJS default olaraq node_modules ilə işlədiyi üçün bu problemi aradan qaldırmaq artıq mümkünsüz kimi görsənir.

4. index.js

Ryan Dahl, index.js faylını serverlərdə default olaraq işləyən index.html faylına bənzər formada hazırlayıb. Bu faylda lazımsız formada modul yükləmə sistemini qarışıq vəziyyətə gətirib, çıxarır.

Məhz bu problemləri aradan qaldırmaq üçün Ryan Dahl, Deno adında yeni bir runtime hazırladı.

Bəs Deno nədir?

Deno-nun rəsmi ilk logosu

Deno, JavaScript və TypeScript proyektləri hazırlamaq üçün modern və təhlükəsiz runtime təqdim edir. V8 JavaScript matorunu istifadə edir və sürətli olması üçün Rust dilində yazılmışdır.

Yaxşı, bəs bunun əsas xüsusiyyətləri nələrdir? deyə sual verə bilərsiniz. Bir balaca səbrli olun və başladıq 🙃

1. Hər şeydən əvvəl təhlükəsizlik

Default olaraq təhlükəsiz runtime-dır. İcazə verilmədiyi müddətcə, faylları oxumaq və ya network çağırışları etmək mümkün olmur.

Deno-nu sistemə quraşdırlma qaydası sadədir.

Shell (Mac, Linux):

curl -fsSL https://deno.land/x/install/install.sh | sh

PowerShell (Windows):

iwr https://deno.land/x/install/install.ps1 -useb | iex

2. TypeScript default olaraq gəlir

Deno, TypeScript kodunu işə salmaq üçün əlavə compiler alətinə ehtiyac duymur. Yəni .ts fayllarını işə salmaq üçün tsc alətini işlətməyə ehtiyac qalmır. Deno yazılan kodun .js yoxsa .ts olduğunu bilir və ona görə işləyir.

3. Modul sistemi çox rahatdır

NodeJS-ə görə Deno-nun modul sistemi çox sadə və bir o qədər də, rahatdır. Deno-da modullar URL vasitəsiylə proyektə əlavə edilir. URL-də yer alan modul proyektə yüklənir və ardınca əlavə edilir. Yəni təkrar-təkrar proyektə yükləyib, əlavə etməyinizə ehtiyac qalmır. Yox əgər modulun proyektə təzədən yüklənməsini istəsəniz —reload commandını işə salmağınız kifayət edir.

Aşağıdakı nümunədə Deno testing modulunu proyektə əlavə edirik.

import { assertEquals } from “https://deno.land/std/testing/asserts.ts”;assertEquals(“hello”, “hello”);assertEquals(“world”, “world”);console.log(“Asserted!”);

Yaxşı, bəs Deno həqiqətən NodeJS ola biləcək?

Deno təəssüflər olsun ki, hal-hazırda birbaşa npm modullarını dəstəkləmir. Qısaca izah etmək lazım gələrsə, hər hansı bir npm paketini deno proyektinizə daxil edə bilmirsiniz. Buna görə hazırda NodeJS əvəz edəcək gücdə deyil. Deno indiki vəziyyətdə v1 versiyasındadır. Və böyük kütlə tərəfindən istifadə olunmur. Böyük ehtimal ki, gələcək vaxtlarda Deno aktiv formada istifadə ediləcək deyə düşünürəm.

--

--