أمضى Ryan Dahl ، منشئ Node.js ، العام ونصف العام الماضي في مشروع
Deno . هذا هو وقت تشغيل JavaScript الجديد الذي يجب أن يحل المشكلات الكامنة في Node.js.
لا تفهموني خطأ. تعتبر منصة Node.js بيئة رائعة من جانب الخادم لتشغيل JavaScript. يرجع الفضل في شعبيته بشكل أساسي إلى نظام بيئي ضخم ، وفي الواقع ، دعم JavaScript. ومع ذلك ، يعترف Ryan Dahl أن شيئا ما حول Node.js يجب أن يستحق اهتمامه. هذا ، على وجه الخصوص ، يتعلق بالأمان ، والوحدات النمطية ، وإدارة التبعية.
في دفاعه ، يمكن للمرء أن يقول إنه لا يستطيع معرفة مدى شعبية منصة Node.js في فترة قصيرة إلى حد ما. بالإضافة إلى ذلك ، في عام 2009 ، كان جافا سكريبت لا يزال يبدو وكأنه لغة محدودة وغريبة ، والتي سخر منها كل شخص لم يكن كسولًا. تجدر الإشارة أيضًا إلى أنه في تلك الأيام لم تكن العديد من ميزات JavaScript الشائعة في هذه الأيام موجودة.
ما هو دينو وما هي السمات الرئيسية لهذا النظام الأساسي؟
Deno هو وقت تشغيل آمن لـ TypeScript مبني على محرك V8 JS الذي طورته Google. تم إنشاء منصة Deno باستخدام الأدوات التالية:
- الصدأ (يتم كتابة الأساسية Deno في Rust و الأساسية Node قيد C ++).
- Tokio (حلقة الحدث مكتوبة في الصدأ).
- TypeScript (Deno ، بدون إعدادات إضافية ، يدعم كلا من JavaScript و TypeScript).
- V8 (محرك Google JS المستخدم في متصفح Chrome و Node.js والمشاريع الأخرى).
دعنا نتحدث عن الفرص التي يوفرها لنا نظام Deno.
الأمن (أذونات)
من بين أهم ميزات Deno ، والتي تحظى باهتمام خاص ، يمكن ملاحظة السلامة.
على عكس Node ، يقوم Deno ، افتراضيًا ، بتنفيذ التعليمات البرمجية في صندوق رمل. هذا يعني أن وقت التشغيل لا يستطيع الوصول إلى الكيانات والقدرات التالية:
- نظام الملفات.
- الشبكة.
- تنفيذ البرامج النصية الأخرى.
- متغيرات البيئة.
ألقِ نظرة على كيفية عمل نظام إذن Deno. النظر في البرنامج النصي التالي:
(async () => { const encoder = new TextEncoder(); const data = encoder.encode('Hello world\n'); await Deno.writeFile('hello.txt', data); await Deno.writeFile('hello2.txt', data); })();
ينشئ هذا البرنامج النصي زوجًا من الملفات النصية -
hello.txt
و
hello2.txt
.
Hello world
وضع النص
Hello world
في هذه الملفات. يتم تنفيذ الكود في الصندوق الرمل. لذلك ، ليس لديه حق الوصول إلى نظام الملفات.
أيضًا ، انتبه إلى حقيقة أننا هنا نستخدم مساحة اسم
Deno
، بدلاً من الإشارة إلى شيء مثل الوحدة النمطية
fs
، كما نود في Node. توفر مساحة الاسم
Deno
للمطور العديد من وظائف المساعد الأساسية. لكننا ، باستخدام مساحة الاسم ، نفقد التوافق مع المستعرض. سنتحدث عن هذا أدناه.
يمكن تشغيل هذا البرنامج النصي باستخدام الأمر التالي:
deno run write-hello.ts
بعد ذلك ، سنرى إشعارًا بالمحتوى التالي:
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
في الواقع ، قد نرى هذا مرتين خلال كل مكالمة. بالطبع ، إذا أجبنا على سؤال النظام عن طريق تحديد خيار
allow always
، فلن نتلقى هذا الإشعار في المرة الثانية.
إذا اخترنا أحد خيارات
deny
، فسيتم
PermissionDenied
خطأ
PermissionDenied
. سيتم بعد ذلك إكمال عملية البرنامج النصي ، حيث لا يوجد رمز لمعالجة الأخطاء فيه.
يمكن تشغيل البرنامج النصي مثل هذا:
deno run --allow-write write-hello.ts
لن نرى أي إشعارات ؛ سيتم إنشاء كلا الملفين.
بالإضافة إلى
--allow-write
، التي تؤثر على العمل مع نظام الملفات ، يمكنك استخدام إشارات أخرى عند تشغيل البرامج النصية. هذه
--allow-net
،
--allow-env
و
--allow-run
. يفتحون على التوالي وصول البرنامج النصي إلى الشبكة ، وإلى البيئة ، وإطلاق العمليات الفرعية.
وحدات
Deno ، مثل المتصفحات ، يقوم بتحميل الوحدات عن طريق عنوان URL. في البداية ، كثير من الناس مرتبكون من خلال ما يرونه في أوامر استيراد كود الخادم بعناوين URL. لكن هذا ، في الواقع ، منطقي. انتظر قليلاً - وسوف تفهمها بنفسك.
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
هنا قد يكون لديك سؤال حول ما هو خاص حول استيراد الحزم عن طريق URL؟ إجابة هذا السؤال بسيطة: من خلال استخدام عناوين URL ، يمكن توزيع حزم Deno دون استخدام سجل مركزي مثل npm. واجه Npm
الكثير من المشاكل مؤخرًا.
يتيح تنظيم استيراد الشفرة عبر عنوان URL لمنشئي الحزم استضافة التعليمات البرمجية الخاصة بهم أينما يرونها مناسبة. هذا هو اللامركزية في كل مجدها. لا مزيد من
package.json
و
node_modules
.
عندما نقوم بتشغيل التطبيق ، يقوم Deno بتحميل جميع الوحدات النمطية المستوردة وتخزينها مؤقتًا. بمجرد تخزينها مؤقتًا ، لن تقوم Deno بإعادة تحميلها إلا إذا طلبنا صراحة
--reload
باستخدام علامة -
--reload
.
فيما يتعلق بنظام العمل مع الوحدات ، يمكن طرح العديد من الأسئلة المهمة.
ما إذا كان المورد الذي يقع عليه رمز الوحدة النمطية غير ممكن الوصول إليه؟
لا يتم تخزين رمز الوحدة النمطية في سجل مركزي. قد لا يتوفر مورد الويب الذي يستضيف هذا الرمز لأسباب عديدة. أثناء عملية التطوير ، أو الأسوأ من ذلك ، جعل المشروع قيد الإنتاج ، من المخاطرة أن نأمل أن تكون استضافة الوحدة متاحة دائمًا.
كما ذكرنا سابقًا ، يقوم Deno بتخزين الوحدات النمطية المحملة. نظرًا لأن ذاكرة التخزين المؤقت مخزنة على قرص محلي ، فإن مُنشئ Deno يوصي بمعالجتها باستخدام نظام التحكم في الإصدار (على سبيل المثال git) وإدراجه في مستودع المشروع. باستخدام هذا النهج ، حتى عندما يتعذر الوصول إلى المورد الذي تم تخزين الكود عليه ، سيحتفظ جميع مطوري المشروع بالوصول إلى الإصدارات التي تم تنزيلها من الوحدات النمطية.
يقوم Deno بتخزين ذاكرة التخزين المؤقت في المجلد المحدد بواسطة متغير البيئة
$DENO_DIR
. إذا لم نقوم بتكوين هذا المتغير ، فسيخزن Deno ذاكرة التخزين المؤقت في دليل النظام القياسي للتخزين المؤقت. يمكن تعيين
$DENO_DIR
بحيث يشير إلى بعض المجلدات في
$DENO_DIR
المحلي. يمكن معالجة هذا المجلد باستخدام نظام التحكم في الإصدار الخاص بك.
need هل سأحتاج إلى استيراد الوحدات النمطية باستمرار بواسطة عنوان URL؟
يمكن إدخال عناوين URL الطويلة بانتظام بالملل بسرعة. لحسن الحظ ، يعطينا Deno طريقتين لجعل هذه المهمة أسهل.
تتمثل الطريقة الأولى في استخدام القدرة على إعادة تصدير الوحدة النمطية المستوردة من الملف المحلي. على سبيل المثال ، قد يبدو كالتالي:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
افترض أن الملف الذي يوجد به الأمر أعلاه يسمى
local-test-utils.ts
. الآن ، إذا كنا بحاجة إلى
test
أو
assertEqual
دالات
assertEqual
، فيمكننا استيرادها مثل هذا:
import { test, assertEquals } from './local-test-utils.ts';
نتيجة لذلك ، اتضح أنه لا يهم ما إذا كانت الوحدة قد تم تحميلها بواسطة URL أم لا.
الخيار الثاني هو إنشاء خريطة استيراد في شكل ملف JSON:
{ "imports": { "http/": "https://deno.land/std/http/" } }
عند استخدام ملف مماثل ، قد يبدو الأمر import كما يلي:
import { serve } from "http/server.ts";
لكي يعمل هذا المخطط ، يجب أن تخبر النظام عن استخدام خريطة
--importmap
في المشروع ، باستخدام علامة
--importmap
عند تشغيل البرنامج النصي:
deno run --importmap=import_map.json hello_server.ts
is كيف تتم إدارة إصدار الوحدة النمطية؟
التحكم في إصدار الحزمة هو مسؤوليتهم. من وجهة نظر العميل ، يبدو اختيار إصدار الحزمة المناسب وكأنه يضيفه إلى عنوان URL:
https://unpkg.com/liltest@0.0.5/dist/liltest.js
.
متصفح التوافق
تسعى منصة Deno جاهدة من أجل توافق كودها مع المتصفحات. من وجهة نظر تقنية ، عندما نستخدم وحدات ES ، فإننا لسنا ملزمين باستخدام بعض أدوات التجميع ، مثل webpack ، التي توفر القدرة على تشغيل التطبيق في المتصفح.
ومع ذلك ، فإن أدوات مثل Babel تقوم بتحويل كود JS الحديث إلى كود متوافق مع ES5. ونتيجة لذلك ، يمكن تنفيذ هذا الرمز حتى في المتصفحات غير الجديدة التي لا تدعم إمكانيات JavaScript الحديثة. ولكن هذا النهج يحتوي أيضًا على ناقص ، والذي يتكون في حقيقة أن حزم مشاريع الويب تنمو بسبب حقيقة أنها تحصل على الكثير من التعليمات البرمجية المساعدة.
في الواقع - نحن نتخذ قرارات بشأن أهداف مشاريعنا. نختار الأدوات المناسبة.
دعم TypeScript
Deno يبسط استخدام TypeScript ، مما يلغي الحاجة للمطورين لتكوين أي شيء لتشغيل رمز TS. لكن يمكن أيضًا كتابة برامج Deno في JavaScript دون مشاكل.
النتائج
Deno ، بيئة التشغيل الجديدة لـ TypeScript و JavaScript ، هو مشروع مثير للاهتمام وقد أظهر الاستدامة لبعض الوقت الآن. ومع ذلك ، قبل أن يتم اعتباره جاهزًا للإنتاج ، لا يزال أمامه طريق طويل.
يهدف النهج اللامركزي للعمل مع الوحدات النمطية المطبقة في Deno إلى تحرير نظام جافا سكريبت البيئي من مستودع الحزمة المركزي ، والذي هو اليوم npm.
يقول ريان دال إنه يتوقع الإفراج عن دينو 1.0 في أواخر الصيف. إذا كنت مهتمًا بمستقبل هذا المشروع - انتبه إلى
مستودعه .
أعزائي القراء! ما رأيك في دينو؟
