في الآونة الاخيرة ظهرت لدينا بيئة تشغيل جافاسربت (JavaScript Runtime Environment) تسمى Deno وقد تم تصميمها من نفس الشخص الذي أبتكر NodeJS، المبرمج العظيم ومهندس البرمجيات ريان داهل (Ryan Dahl).

ما هو دينو (Deno)؟

في 2018 صرح ريان بمؤتمر JSConf EU عن وجهة نظره الحالية في NodeJS في لقاء كان تحت اسم "عشر أخطاء ندمت أني أتقرفتها بشأن NodeJS" ذكر فيه بعض الأخطاء ومفاهيم برمجية خاطئة حصلت في فترة تطوير NodeJS والتي لا يمكن إصلاحها الآن! كون العديد من البرمجيات المبنية على NodeJS لا زالت تستند عليها وتستخدمها.

في الفقرة الأخيرة من اللقاء قام ريان بعرض Deno على العلن، وقام بمشاركة رابط مشروع غتهاب مع الحضور في المؤتمر وقام بتعريف Deno على أنه "Secure TypeScript Runtime" أي (مُشغل تايبسكربت آمن)، أشار ريان بأنه أعاد برمجة وهيكلة مشغل جافاسكربت جديد ليصلح الأشياء التي ندم عليها في NodeJS على حد قوله.

ولخص مميزات وفروقات Deno عن Node في:

1- الحماية

على عكس NodeJS الذي يسمح بتشغيل الكود البرمجي وحصوله على كافة الصلاحيات بشكل مباشر كالوصول إلى ملفات النظام، والوصول إلى الشبكة وغير ذلك... لا يعطي Deno تلك الصلاحيات بشكل مباشر، ويعتبر معزول بشكل افتراضي (Sandboxed Environment By Default) حيث يتبادل Deno الرسائل مع محرك جافاسكربت (V8 Engine) في بيئة معزولة، وعلى المبرمج أن يحدد أي الصلاحيات يجب أن تُعطى للبرنامج (الكود البرمجي) عند تشغيله على Deno.

يعزز هذا الحماية في حال تشغيل أكواد مكتبات طرف ثالث بحيث لا تحصل على كل الصلاحيات أو صلاحيات لا تحتاجها.

2- الإعتماد على نظام الوعود

ذكر ريان في اللقاء أنه قام في عام 2009 بإضافة نظام الوعود (promises) إلى NodeJS ولكن قام بإزالته في 2010، وبعد تبني مفهوم الوعود في جافاسكربت ومعايرتها في إصدارات ES2015 والأحدث، عبر ريان أن قراره كان غير سليم... وجعل Deno يستخدم هذا المفهوم منذ البداية.

يمكن هذا المبرمجين من استخدام مفهوم (async/await) بشكل فعال.

3- تبسيط نظام الوحدات

نظام الوحدات في NodeJS يعتبر معقد نسبيًا فعندما تم إبتكار NodeJS لم يكن هناك نظام وحدات مُوحد في جافاسكربت- في الوقت الحالي يوجد نظام وحدات ES Moudle- في ذلك الوقت اضطر فريق NodeJS إلى أبتكار نظامهم الخاص الذي سموه CommonJS وقد حصل سمعة سيئة خاصة مع مجلد node_module وملف packges.json ومع كل تعقيدات إدارة الحزم وحجمها الكبير.

وبما أن Deno أتى بعد أبتكار نظام وحدات ES Module فهو يستخدم نفس الفكرة والمفهوم الموجود في المتصفحات.

مثال على نظام وحدات جافاسكربت المعياري:

import { log } form "utility";  

log("Hamad");

هناك فكرة قيد التنفيذ شبيهة بـ pakage.json تدعى import-maps ويدعمها Deno حاليًا.

مثال على import-maps :

<script type="importmap">  
{  
  "imports": {  
    "moment": "/node_modules/moment/src/moment.js",  
    "lodash": "/node_modules/lodash-es/lodash.js"  
  }  
}  
</script>

*نظام وحدات جافاسكربت المعياري ES Module -يستخدم في المتصفحات وتدعمه الإصدارات الحديثة من Node بدأً من الإصدار 12 فما فوق-.

4- دعم TypeScript بشكل افتراضي

يدعم Deno الأكواد المكتوبة باستخدام TypeScript دون الحاجة إلى ترجمتها (compiling) إلى جافاسكربت عادية ويمكنه تشغيلها دون أي مشكلة، وبما أن العديد من مبرمجين JavaScript يستخدمون TypeScript في مشارعيهم تعد هذه خطوة جيدة.

5- تبسيط عملية البناء والبرمجة

ربط وحدات NodeJS مع بعضها البعض عملية مرهقة ومعقدة... ويظهر ذلك جليًا في أدوات بناء جافاسكربت التي جاءت لتسهل هذه العملية مثل Parcel وغيرها والتي تهدف إلى تبسيط عملية جمع الوحدات وتحويلها إلى ملف جافاسكربت واحد او أكثر قابل للتنفيذ.

يستطيع Deno إنشاء ملف جافاسكربت قابل للتنفيذ (standalone-executable).

نستنتج أن الإختلافات الجذرية هي نظام الوحدات (Modules system)، وطريقة العمل حيث أن NodeJS يعمل مباشرة في V8 Engine بينما يوفر Deno طريقة أخرى في تنفيذ جافاسكربت والتواصل مع V8 Engine وتركيز Deno على البقاء في مساحة آمنة، دعم تايبسكربت، الإعتماد على نظام وحدات معياري وموحد، التركيز على دعم نظام الوعود، تسهيل عملية البناء والنشر.

وخلال مراحل تصميم Deno تم التركيز على مُراعاة معاير الويب مع جافاسكربت (JavaScript Web API Standards) حتى لا يتم أرباك المبرمجين الجدد القادمين إلى Deno ولديهم خلفية في جافاسكربت.

التطورات وراء Deno

طور ريان Deno في بداية الأمر باستخدام لغة Go الشهيرة من قوقل -وهي نفس اللغة التي تم تطوير Docker من خلالها- ولكن في أواخر 2018 قام ريان والمجتمع القائم على تطوير Deno بالإنتقال إلى لغة Rust وذلك بسبب مخاوف من بعض المشاكل التي قد تحصل أثناء تطويره.

في 29 من مارس لعام 2021 حصل Deno على دعم بملايين الدولارات من قبل شركة موزيلا وعدة شركات أخرى، لضمان استمرار عملية التطوير.

Deno والحوسبة على الحافة (Edge)

تعد الحوسبة على الحافة Edge Computing أحد المفاهيم الحديثة... ويمكن تلخيص الفكرة ورائها بأنها تسمح لمراكز البيانات (Data center) الموزعة حول مناطق مختلفة، بإجراء بعض العمليات البرمجية.

في يونيو 2021 قام فريق Deno بالإعلان عن خدمة تسمى Deno Deploy في المرحلة التجريبية الأولى، وهي عبارة عن خدمة تسمح بتشغيل البرمجيات المكتوبة على Deno بأن تعمل على 25 مركز بيانات مختلف موزع حول العالم، الذي سوف يساعد على تخفيف الحمل وتسريع عمليات المعالجة التي سوف تتم على مراكز البيانات، تهدف الخدمة بشكل رئيسي إلى تمكين Deno والأستفادة منه في مراكز البيانات.

وفي أبريل 2022 أعلنت كل من Supabase و Netlify استخدمهم البنية التحتية (infrastructure) الخاصة بمشروع Deno Deploy وتمكين استخدمها مع منتجاتهم تحت مسمى دوال على الحافة (Edge Functions) وهي عبارة عن خدمة تسمح لك بكتابة كود JavaScript أو TypeScript يعمل على مراكز البيانات خاصتهم ويقوم بتنفيذ مهام معينة، كمعالجة البيانات أو تصير الصفحات في الخادم وغير ذلك... كما هو شائع في مفهوم JamaStack.

المصادر والمراجع

10 Things I Regret About Node.js - Ryan Dahl - JSConf EU

Import maps

Deno (Golang Repository)

Deno (Golang commit)

Deno to Rust

Deno History

Deno Deploy

Deno Company

deno cloud cloud function