info@itcodedev.com رقم 12، معادي السرايات الغربية، المعادي
البريد الالكترونى
info@itcodedev.com
رقم الجوال
01124711700

الفرق بين بيئة العمل node.js vs deno

الفرق  بين بيئة العمل node.js vs deno

الفرق بين بيئة العمل node.js vs deno

في 2018 في نص السنة كدا طلع ryan dahi في ايفينت JSConf EU ووقتها القي واحدة من اعظم المحاضرات بتاعته وفي الاخر خصص وقت يتكلم فيه عن أكتر 10 حاجات ندم عليها بخصوص node.js والمعروف ان هوا اللي صمم node من 12 سنة كدا وفضل هوا المشرف علي المشروع لحد 2012 "هسيب لينك السيشن في الكومنتات " .

الفكرة بقي ان العشر حاجات دي كلها كانت عبارة عن اخطاء "هو اعتبرها كدا" في تصميم node.js منعته من انه يتطور في الاتجاه اللي ryan كان متوقعة ودا فرض عليه شوية قيود كدا وهوا حاول كتير انه يتدارك الموقف لاكن خلاص المشروع كان وصل لمرحلة متقدمة جدا من الانتشار والاستقرار .

بعد ما خلص كلامة دا عن السلبيات والندم علي الطريقة اللي وصل ليها node.js اتكلم ryan عن مشروعة الجديد اللي بداه من الصفر لوحده واللي الهدف منه هو انه يحل كل نقاط الضعف اللي شفها في node.js ومقدرش يحلها وسماه Deno تعالوا بقي نتكلم عن الاخ Deno دا بقي

بص هو لو انت دخلت علي الويب سايت الرسمي بـ Deno هتلاقيهم بيقولوا أن هو عبارة عن "A secure runtime for JavaScript and TypeScript. " بمعني ان Deno هو بيئة أمنه لتشغيل جافا سكريبت و تايب سكريبت وعلي فكرة دا نفس التعريف بتاع node بس باختلاف واحد ان node مش بيوفر دعم افتراضي لـ type script زي ما Deno بيعمل

بص هو في حاجة لطيفة كدا في Deno وهوا انه بيوفر طبقة حماية بتشتغل علي انها تمنع اي برنامج من انه يوصل لاي ملف او موارد النظام من غير ما تسمح ليه بشكل صريح انه يقدر يعمل كدا زي مثلا انه يقرا ملف او يكتب عليه ودا ميزة مش موجودة في node .

بص هو Deno مبني علي محرك V8 اللي شغال اصلا في متصفحات chromium وبردة في node js وبردة معتمد عليه في لغة Rust في برمجته بدال لغة C++ اللي مستخدمة في node js ، وكمان مستخدم فيه مكتبه اسمها Tokio عشان تدعم عمليات " Non-blocking I/O" ودا من خلال Event Loop ، اصلا المكتبة دي مستخدم فيها لغة Rust ودا اللي خلي ريان يستخدمها ك بديل لـ Libuv اللي أتسخدمها في node js المبنية علي C " سايبلك صورة في أول كومنت هتوضحلك الدنيا دي ماشية أذاي متقلقش " .

قلتلك ان Deno في مميزات كتير عن node ف بص هكلم معاك ف كام حاجة بتتحسب ليه مش كل حاجة بس الاشهر يعني ف ركز كدا ولو لسة معملتش قهوه روح اعمل وتعالي كمل البوست مش هيطير 😃

في الاول لازم نتكلم عن دعم Deno لـ typeScript بشكل اصلي ومديلها اهتمام كبير جدا وراح دمج مترجم خاص بيها جوا Runtime ودا للي مش فاهم بيخليك تشتغل بيها من غير ما تبققي محتاج لأي أعدادت او حزم خارجية زي ما بيحصل في node js اللي بتلجئ فيها لـ"ts-node" عشان تقدر تكتب أكواد node.js بـ typescript ، الدعم الافتراضي دا لـ typescript مش معناه ان Deno مش بيدعم js لا دا العكس خالص اللغتين مدعومين بس خلي بالك لتبعت اكواد جافا اسكريبت لمترجم التايب اسكريبت عشان دا مش ضروري خالص

بص انا عايز اكلمك شوية عن الـsecurity في Deno بس مش عارف اذاي ! بص انا هستخدم كام سطر كود والموضوع سهل ومفهوم متقلقش يعني
بص مثلا هنحاول نقراء محتوي ملف نصي ونعرضة في console.log تمام ، هنفترض ان الملف عندنا اسمة test.txt ومكتوب جواه hello mansourah!
ابسط طريقة لقراءة الملف هي كدا :
_________________
const decoder = new TextDecoder('utf-8');

const content: string = decoder.decode(await Deno.readFile('test.txt'));

console.log(affirmation);

______________

اخدت بالك اني قراءت الملف عن طريق Readfile() وعلي فكرة هي وظيفة غير متزامنة "Async"
عشان تشغل الكود دا لازم تنفذ دا :
___________
deno run index.ts
___________
خلي بالك أن index.ts هو ملف الاكواد في مشروعنا
متوقع انت ان هيظهر لينا " Hello mansourah " صح ؟ لا يا بطل دا مش هيحصل هيطلعنا الايرور دا واللي بيدل علي ان في خطا تسبب في وقف البرنامج عن العمل :
___________
error: Uncaught PermissionDenied: read access to "/path/to/your-app/test.txt", run again with the --allow-read flag
___________________
رسالة الخطا دي بتقول ان مفيش تصريح للوصول لملف test.txt طيب لو عايز اخد التصريح دا اعمل اي بس يا سيدي هتستخد "--allow-read " طيب ولو عايز اكتب ؟ هستخد دا "--allow-write " ودا مثال ياعم كمان
___________
deno run index.ts --allow-read
___________

طيب انا دلوقتي اخدت تصريح اني اقراء الملف ف هيحصل ايه ؟ ياعم خلاص مفيش مشاكل هيتعرضلك انه تم الوصول بنجاح وهيتعرضلك المحتوي دا
___________

Compile file:///path/to/your-app/text.ts
Hello World!

___________
ممكن حد يقلي ولي كل دا ؟ ياعم ما احنا قلنا هنتكلم ف الحماية ونقول اللي لينا واللي علينا وانا شايف ان هي ميزة كويسة بجد عشان مش بتدي لاي برنامج انه يقدر يوصل للـ file system الا بـ أذن صريح منك ونفس الحال بيمشي علي متغيرات البيئة " ENV variables " عن طريق "--allow-env" وبردة الوصول لشبكة الانترنت عن طريق "--allow-net " وعلي نفس الوضع كدا بقي يا معلم مع اي حاجة تانية .😅

حتي الان ان متكلمتش علي ان Deno بتحاول الحفاظ علي كل الواجهات البرمجية والمزاية المتعارف عليها في كل Browser موجود ودا عشان يضمن توافقية كويسة مع محظم الحالات بين كود Deno واكواد الجافا سكريبت أو تايب سكريبت اللي بتحتبها للمتصفحات
هو نظام الـModules منقدرش ننكر انه من احسن المزايا اللي ظهرت في عالم الجافاسكريبت في اصدار ES2015 والذي ضاف كتير للغة ، في Deno بقي بيدعموا نظام Modules الخاص بـ ECMAScript وهيا ميزة اللي مش بيوفرها node js للمطورين الا في اخر منة بعد سنين كتير من الاعتماد علي نظام commenjs ، والي اليوم لسة بيستخدم علي نظام واسع جدا في بيئة node
في Deno عشان تقدر تعمل استيراد لـmodules بيتم من خلال اي مسار او رابط علي الشكل دا :
__________
import Module from 'https://example.com/my-module.ts';
import { Test } from './my-module.ts';
__________
ما التصدير بقي هفو زيه زي اي شكل اعتيادي مش هتلاقي صعوبة فيه لو كنت اتعاملت مع Modules في Deno طالما اتعاملت قبل كدا مع modules في React مثلا او غيرها من اطر عمل الجافا سكريبت اللي بتشتغلي في المتصفحات

_________

my-module.ts
export const myVar = "some text";
export function functionName(){...}
export default function functionName(){...}
export class ClassName {...}
export default class ClassName {...}
...

_________

بص بقي نظام Package Management حصل فيه تغيير كامل في Deno بالمقارنة باللي موجود في node js
نظام Package Management اتغير بشكل كامل عشان يبقي شبيه باللي موجود في الويب ، اذاي يعني ؟ يعني تقدر تدي المتصفح كود جافا سكريبت من أي رابط أو مسار ، مش شرط ان تكون الحزمة موجود في مكان زي npm مثلا ولا ليها مكان رسمي حتي الان في بيئة عمل Deno
تعالي كدا نستدعي حزمة في Deno ف الاول هنحتاج رابط لرابط او مسار الحزمة دي بالظبط نفس اللي بيحصل في تطبيقات الويب في المتصفح :

__________

import { serve } from 'https://deno.land/std@0.50.0/http/server.ts';

__________
بعد ما Deno بتحمل النسخ دي بيحطها في نظام "cashe" خاص بيها للرجوع ليها في المرات الجاية ، عشان تجبر Deno انه يحمل النسخ من الانترنت بدال الكاش هتمررله "--reload"

عشان تقدر تتحكم في Versions المستخدمة في المشروع ببينصح بانشاء ملف اسمه "deps.ts" وتحط في كل الحزم وتصدرها من هناك عشان يكون عندنا مكان واحد نقدر نرجعلة في حال اننا عايزين نغير النسخة او اصدار اي واحدة من الحزم دي

________

deps.ts
export * as path from "https://deno.land/std@0.51.0/path/mod.ts";

________

________

index.ts
import { path } from './deps.ts';

________

بيئة عمل Deno بتوفر (Standard Library) مدعومة بشكل رسمي عشان تتاكد من انها شغاله بشكل كويس معاه ، المكتبة دي بتحتوي علي اهم الحزم والمكتبات اللي مستخدمة بكتره من المبرمجين ، وعشان يقدروا يوفروا للمبرمجين اللي شغالين بـ بيئة عمل Deno مكان محدد موثوق يجيبوا منه كل الحزم دي وبضمان انها شغاله ومتوافقة بشكل ممتاز من بيئة العمل الخاصة بيهم .
زي مثلا :
ws: للتعامل مع WebSockets.
uuid: لتوليد معرفات عشوائية.
datetime: التعامل مع التواريخ .
http: خادم HTTP.
وغيرهم كتير بس بنتكلم ع الحاجات الشائعة بين المبرمجين .

قراءت ان واحد من اهداف Deno هو الحفاظ علي نوع من التوافق والتشابة بين اللي بيوفرة من واجهات برمجية واللي موجود في الويب من معايير متعارف عليها
بطريقة تانية وواضحة في Deno اختاروا اسماء مماثلة للي مستخدمة في بيئة الويب لعدد كبير من الوظائف والاحداث وبردة الكلاسات ، حتي مثلا الكائن "window" احتفظوا بيه زي ماهوا باسمة واللي شاف اللي شغالين علي node js انه تغييره لـ "global" افضل واقرب للمنطق طول ما مفيش حاجة باسم حاجة باسم "windos" في بيئة الخادم
وهقلك كمية وظايف والواجهات البرمجية في Deno اللي تقريبا اغلبنا اتعامل معاها قبل كدا في Browsers بنفس الاسماء :
-addEventListener
-fetch
-Worker
-onload
-onunload
-clearInterval
-clearTimeout
-dispatchEvent
-removeEventListener
-setInterval
-setTimeout
-File
-FormData
-console
-location
-self
-window
-Event
-EventTarget
-TextDecoder
-TextEncoder
- وغيرهم الكتير بس مش فاضيين احنا نكتب كل حاجة 😂

عالم الجافا سكريبت دلوقتي مليان بعدد من الادوات كتير جداً وممكن في وقت البوست دا يكون في اداة جديدة نزلت .... اداة لترجمة الكود اللي مش بتفهمه المتصفحات زي "babel" مثلا ، ودي اداة لتحزيم الوحدات زي " ويب باك و parcel " واللي بتعمل اختبارات ، واللي بترتب الكود وتجملة زي "prettier"
الاربع انواع دول من الادوات اقل حاجة ممكن تقابلها في مشروع جافاسكريبت انهارده ودا اللي بيخلي مبرمج مبتداء زيي كدا حياته اشبهه بكابوس مجرد ما يخرج منه يخش ف الكابوس الاصعب منه بسبب كمية الادوات اللي المفروض بتعامل معاها كل يوم
في بيئة Deno بقي حاولوا انهم يحطوا حد لحالة البهدلة والتشتيت دي ودا بتوفير كتير من اللي قلته دا مجانا من غير ما تحتاج اي مكتبات خارجية او اعدادات اضافية معقدة ، المكتبة الرسمية توفر حزمة خاصة تعمل اختبارات للاكواد البرمجية وكمان في ميزة الـ Bundling و compilling لعمل تحزيم وترجمة للكود مع امكانية تخصص العملية دي عشان تلائم المطور
والـ code formatting فتقدر تعمله ببساطة من خلال "deno fmt " بكل بساطة ومن غير صداع كتير
بص طبيعي جدا ان مش هتلاقي متوفر في Deno كل الامكانيات اللي موجود في مكتبات النظام البيئي لـ node js بس دي مجرد بداية وأعتقد ان تتحسن كل الادوات دي وتنضاف ادوات جديدة تغطي كل المجالات الممكنة

التعليقات:

أضف تعليق:

من فضلك سجل دخول حتى تتمكن من أضافة تعليق
تسجيل دخول