دينو| Deno جزء 2- مكتبات القياسية (std)

في درس السابق تعلمنّا کیفية تثبيت وكتابة اول برنامج بإستخدام دينو. كما قلنا سابقا إدارة الحزم في Deno لامركزية (decentralized) ويمكنك إضافة أي حزمة (package) إلى برنامجك من خلال اضافة عنوانها داخل البرنامج فقط، ولست بحاجة إلى تنزيل الحزم على جهازك كما هو الحال في Node.js.

هناك نوعان من المكتبات أو الحزم في دينو المکتبات القياسية (Standard Library) و وحدات طرف الثالث (Third Party Modules). في هذا الدرس نتاول بعض من أهم ستاندرد ماجولز لدينو (Deno Standard Modules) و درس القادم نستخدم وحدات طرف الثالث.

وحدات دينو القياسية (Deno Standard Modules)

ستاندرد ماجولز أو وحدات القياسية لا تحتوي على تبعيات خارجية (external dependencies) ويتم تطويرها علی يد فريق دينو الأساسي وليس على يد طرف ثالث. الهدف منها أن يكون لدى المبرمجين مجموعة قياسية وستاندرد من التعليمات و أكواد البرمجية عالية الجودة يمكن إستخدامها في جميع مشاريع دينو Deno.

هنا نتعرف على كيفية إستخدام بعض من هذه الوحدات و المکتبات، لمشاهدة جميع الماجولز الموجودة في دينو يمكنك مراجعة موقع دينو الرسمي قسم ستاندرد لايبرري الذي تحتوي علی أمثله لإستخدام كل واحدة منهم.

مکتبة datetime

نستخدم الوقت والتاريخ کثيرا في البرامج خاصة برامج السرڨرسايد (server-side). مثلا لتحديد بداية أو نهاية عملية خاصة، مراجعات وفترة تواجد المستخدم في الموقع والخ نحتاج إلی تخزين بيانات من نوع datetime وإجراء عمليات حسابية بعض الأحيان على هذه البيانات.

هذه المكتبة تساعدك بتحويل سلسلة (string) إلی نوع Date.

لإستخدام هذه المكتبة إفتح ملف جديد مثلا بإسم std_libs.ts في مسار معين على سبيل المثال أنا إحتفظ ببرامج هذه الدروس في جهازي بدرايڨ D مجلد deno ثم مجلد coursee_org.

طيب! لازم نعمل ايمپورت للمكتبة حتى نتمكن من حصول على دوالها. ضيف هذا الكود في بداية البرنامج:

import {parseDate} from 'https://deno.land/std/datetime/mod.ts';

import هي كلمة محجوزه و parseDate هو أحد دوال مكتبة datetime بهذه البساطة تمكنا من إضافة مكتبة لبرنامجنا????. إذا تشاهد خط أحمر تحت رابط المكتبة كما هو في الصورة، لا تقلق بمجرد تنفيذ الكود للمرة الأولى تحتل هذه المشكلة.

دينو (Deno)

ضيف هذا الكود حتى يصبح برنامجك كالتالي:

import {parseDate} from 'https://deno.land/std/datetime/mod.ts';

let date1 = "04-05-2019" ;
let date2 = "2020-07-20" ;
let x = parseDate (date1 , "dd-mm-yyyy");
let y = parseDate (date2 , "yyyy-mm-dd");

console.log(x ,'\n', y)

في هذه البرنامج قمنا بتعريف متغيرين من نوع سترينگ وکما هو واضح الترتيب فیهم مختلف. عن طريق دالة parseDate التي تأخذ إسم المتغير و “dd-mm-yyyy” تعني ترتيب أرقام المتغير تكون سنة-شهر-يوم ثم حولناهم إلی نوع date. في خط الآخر قمنا بطباعة المتغيرات في الكنسول.

لتنفيذ الكود كما قلنا سابقا نفتح الترمينال داخل VSCode عن طريق `+ctrl+shift ثم نكتب:

 deno run std_libs.ts

ستلاحظ نتيجة کالتالي:

PS D:\deno\coursee_org> deno run std_libs.ts
Compile file:///D:/deno/coursee_org/std_libs.ts
2019-05-03T19:30:00.000Z 
 2020-07-19T19:30:00.000Z

هناك دوال اخرى يمكننا إضافتها من مكتبة datetime و إستخدامها وقت الحاجة. لإضافة دوال جديدة من نفس المکتبة نعمل کالتالي:

import {
    parseDate,
    dayOfYear,
    weekOfYear 

} from 'https://deno.land/std/datetime/mod.ts';

هكذا قمنا بإضافة دالة dayOfYear و weekOfYear من مكتبة datetime لبرنامجنا. dayOfYear يإخذ متغير من نوع تاريخ و يرّجع ترتيب التاريخ في أيام السنه (من 1 ألى 365) ودالة weekOfYear نفس الحالة لكن يرّجع أسبوع من السنة (من 1 ألى 51) لتاريخ المعطاه.

ضيف هذا الكود حتى نجرب إستخدام هذه الدوال:

import {
    parseDate,
    dayOfYear,
    weekOfYear 

} from 'https://deno.land/std/datetime/mod.ts';

//parseDate - لتحويل سلسلة من الأرقام إلى نوع تاريخ
let date1 = "04-05-2019" ;
let date2 = "2020-07-20" ;
let x = parseDate (date1 , "dd-mm-yyyy");
let y = parseDate (date2 , "yyyy-mm-dd");


//dayOfYear  & weekOfYear
let day = dayOfYear(x);
let week = weekOfYear (y);

console.log(' date1 = ' , x ,'\n date2 = ', y ,'\n day   = ', day ,'\n week  = ' , week);

كما تلاحظ بإمكاننا إعطاء x و y لدالة dayOfYear أو weekOfYear لإنها من نوع تاريخ. في خط الآخر قمنا بطباعة هذه المتغيرات و الناتج يكون:

PS D:\deno\coursee_org> deno run std_libs.ts
Compile file:///D:/deno/coursee_org/std_libs.ts
 date1 =  2019-05-03T19:30:00.000Z 
 date2 =  2020-07-19T19:30:00.000Z
 day   =  124
 week  =  30

مكتبة fs

فايل سيستم (filesystem) مكتبة مفيدة للغاية للتعامل مع الملفات والمجلدات الموجودة داخل البرنامج و أيضا للتعامل مع ملفات Json . فيها دوال تساعدنا على هذه الامور و راح نستخدمها كثير في المشاريع القادمة.

كما تعلّمنا في بداية الدرس لإستخدام دوال الموجودة في مكتبة fs لازم نعمل ايمپورت للمكتبة عن طريق رابط المكتبة الموجود على موقع دينو الرسمي كالتالي:

 import {exists, ensureDir, ensureFile, readJson, writeJson} from "https://deno.land/std/fs/mod.ts"; 

في هذا الكود قمنا بإدخال دوال exists و ensureDir و ensureFile و readJson و writeJson من مکتبة fs. توجد هناك دوال اخرى لهذه المكتبةيمكنك مشاهدهم و إستخدامهم وقت الحاجة.

لنفترض لدينا مجلد data يحتوي على ثلاث ملفات بيانات user3 ،user2 ،user1 من نوع Json و نريد التأكد و إنشاء هذه الملفات في حال عدم وجود اولا و ثم قراءتها و تغيير البيانات في داخلها. لذلك ضيف الكود أدناه لبرنامجك حتى يصبح كالتالي:

import {exists, ensureDir, ensureFile, readJson, writeJson} from "https://deno.land/std/fs/mod.ts"; 

await ensureDir(`./data`); //data التأكد من وجود فولدر 
let users = ['user1', 'user2', 'user3']; // مصفوفة أسما الملفات المطلوبة


// هذه الدالة تطبع لنا رسالة في الكنسول في حال وجود أو عدم وجود الملف
// async  داخل الدالة نستخدم await لإستخدام
let check = async () => {
    for (let i in users)
    await exists(`./data/users/${users[i]}.json`) ?
    console.log(`${users[i]} : exists`) :
    console.log(`${users[i]} : dosen't exist`);
}

// ensureFile تأكد قبل إستخدام 
check();

for (let i in users) await ensureFile(`./data/users/${users[i]}.json`);

// ensureFile تأكد بعد إستخدام
check();


بما أنه دوال fs يرجعن مقادير من نوع promise نحتاج لإستخدام await لهذه الدوال. لتنفيذ هذا الكود إذا إستخدمت deno run فقط راح تواجه خطاء کالتالي:

 PS D:\deno\coursee_org> deno run std_libs.ts
error: Uncaught PermissionDenied: read access to "./data", run again with the --allow-read flag

سبب مثل هذه الخطاء هو إستخدام دينو لـ sandBox و هو أحد ميزات دينو لزيادة أمان البرامج المبنية على نظام دينو. لذا نحتاج إلى إعطا البرنامج الرخص اللازمة عن طريق إضافة flags. إضافة إلی ذلك fs ميزة غير مستقرة حاليًا لذا نحتاج فلگ unstable– ):

deno run --allow-read --allow-write --unstable std_libs.ts

الناتج يكون:

PS D:\deno\coursee_org> deno run --allow-read --allow-write --unstable std_libs.ts
Compile file:///D:/deno/coursee_org/std_libs.ts
user1 : dosen't exist
user2 : dosen't exist
user3 : dosen't exist
user1 : exists
user2 : exists
user3 : exists

كما تلاحظ الملفات كانت غير موجودة لكن بعد إستخدام ensureFile قام البرنامج بإضافتهم داخل فولدر data و تأكدنا من وجودهم مرة ثانية.

بعد إنشاء هذه الملفات نريد إضافة بيانات لها و قراءتها. تساعدنا دوال readJson, writeJson على ذلك.

ضيف هذه الكود في نهاية البرنامج السابق أو يمكنك مسح الكود السابق عدى خط الأول:

const userData:any = {};

userData.name = 'Ahmad';
userData.age = 20;
userData.score = 17;
await writeJson(`./data/users/user1.json`,userData);
let data = await readJson(`./data/users/user1.json`);
console.log(data);

قمنا بإنشاء object بإسم userData ثم ضفناه داخل ملف user1 بعدها قرأنا الملف وطبعناه في الكنسول. يمكنك فتح مراجعة الملف لمشاهدة البيانات في داخله. بعى التنفيذ:

PS D:\deno\coursee_org> deno run --allow-read --allow-write --unstable std_libs.ts
Compile file:///D:/deno/coursee_org/std_libs.ts
{ name: "Ahmad", age: 20, score: 17 }

مكتبة http

أحد أهم أسباب إستخدام دينو و نود جي اس هو إنشا خادم الويب أو السرڨر (server). المكتبة http توفّر لنا هذه الإمكانية، أيضا هناك مكتبات طرف ثالث ممتازة مثل oak و express موجودة لهذا الأمر و سنتعرف علیها بالدرس القادم.

إمسح كود السابق و أكتب هذا الكود بدل منه:

import { serve } from "https://deno.land/std/http/server.ts";
const server = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of server) {
  req.respond({ body: "Hello from Coursee.org\n" });
}

لتنفيذ هذا الكود تحتاج لـ flag بإسم allow-net– لذا أكتب في الترمينال:

deno run  --allow-net  std_libs.ts
Compile file:///D:/deno/coursee_org/std_libs.ts
http://localhost:8000/

بعدها إفتح هذا الرابط http://localhost:8000/ داخل المتصفح مثل “گوگل کروم” و لاحظ النتيجة. نكتفي بهذه الحد من إستخدام مكتبة http و سأشرح بالتفصيل كيفية إنشاء سرڨر و API بإستخدام مكتبات Oak و Express بالدرس القادم.

منشور ذات صلة
سلسلة دروس: دينو (Deno)

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة