كيفية نشر تطبيق Deno؟
توجد خيارات نشر مختلفة لتطبيقات الويب التي تم إنشاؤها باستخدام Deno. ومع ذلك، أصبحت الحاويات كمنصة خدمة خيارًا شائعًا في الآونة الأخيرة نظرًا للمزايا المختلفة التي تقدمها مقارنة بخيارات النشر الأخرى.
في هذه المقالة، سوف تستكشف Deno ومزاياه وحدوده. بالإضافة إلى ذلك، ستقوم بإنشاء تطبيق Deno بسيط ونشره على حاويات Back4app.
Contents
ما هو Deno؟
Deno هو وقت تشغيل آمن وحديث لJavaScript و TypeScript تم إنشاؤه لمعالجة القيود وعيوب التصميم الموجودة في Node.js.
على عكس Node.js، فهو يركز على الأمان بشكل افتراضي، ويفرض أذونات دقيقة لنظام الملفات والوصول إلى الشبكة.
بالإضافة إلى ذلك، يدعم Deno TypeScript في الأصل، مما يلغي الحاجة إلى خطوات إعداد أو نقل إضافية، من بين ميزات أخرى.
منذ إصداره في عام 2018، حظي Deno باهتمام واهتمام المطورين بسبب التحسينات التي أدخلها على Node.js.
ومع ذلك، بينما يقدم Deno تحسينات، لا يزال Node.js نظامًا بيئيًا ناضجًا مع دعم مجتمعي واسع النطاق ومستودع حزم كبير.
وعلى الرغم من ذلك، فقد اجتذبت Deno مجتمعًا متناميًا من المطورين الذين يقدرون نهجها ويستكشفون إمكاناتها.
مزايا Deno
يرجع ارتفاع شعبية Deno إلى بعض الأسباب الأساسية. بعضها على النحو التالي.
تحسين الأمان عبر Node.js
تقدم Deno ميزة الأمان المحسّنة كميزة رئيسية، حيث تطبق نموذج أمان قائم على الأذونات وتشغيل التطبيقات في بيئة صندوق رمل.
وهو يطبق نموذج أمان قائم على الأذونات، حيث يلزم الحصول على إذن صريح للوصول إلى الموارد مثل نظام الملفات والشبكة.
بشكل افتراضي، يعمل Deno في وضع مقيّد ويقوم بتشغيل التطبيقات في بيئة رملية، مما يحد من الإجراءات التي قد تكون محفوفة بالمخاطر، ويعزلها عن النظام الأساسي، ويمنع الوصول المباشر إلى الموارد الحساسة.
كما تعزز عمليات التدقيق الأمني الشاملة والمراجعات الدقيقة للأكواد البرمجية من أمان Deno القوي. وتوفر لك هذه التدابير منصة آمنة يمكن الاعتماد عليها لبناء التطبيقات، وغرس الثقة في أمنها، والحماية من الثغرات الأمنية المحتملة.
إدارة التبعية
يقدم Deno نهجًا متميزًا لإدارة التبعية مقارنةً ببيئات وقت تشغيل JavaScript التقليدية مثل Node.js.
بدلاً من الاعتماد على سجل مركزي للحزم، يستخدم Deno عناوين URL لاستيراد الوحدات النمطية مباشرةً من الويب.
يعمل هذا النهج على تبسيط العملية من خلال التخلص من الحاجة إلى مدير حزم منفصل مثل npm وتخفيف المخاوف المتعلقة بتعارضات الإصدارات وتعقيدات إدارة مجلد “node_modules”.
يمكنك تحديد التبعيات عن طريق تحديد عناوين URL للوحدات النمطية التي تريد استيرادها، مما يجعل مشاركة وتوزيع التعليمات البرمجية أسهل. هذا النهج اللامركزي لإدارة التبعيات في Deno يعزز البساطة، ويقلل من الاحتكاك، ويساعد على ضمان تجربة تطوير أكثر انسيابية.
دعم TypeScript خارج الصندوق
يقدم Deno دعمًا أصليًا وسلسًا لـ TypeScript، مما يجعله خيارًا ممتازًا إذا كنت تفضل TypeScript أو تحتاج إلى TypeScript في مشاريعك.
TypeScript هي مجموعة فائقة مكتوبة من JavaScript تجلب الكتابة الثابتة وغيرها من ميزات اللغة المتقدمة لتطوير JavaScript. مع Deno، ليست هناك حاجة لتهيئة إضافية أو خطوات بناء إضافية لاستخدام TypeScript.
يأتي Deno مرفقًا مع مترجم TypeScript، مما يسمح لك بكتابة وتشغيل شيفرة TypeScript مباشرةً.
هذا الدعم الأصلي يزيل تعقيدات إعداد سلسلة أدوات TypeScript منفصلة ويبسط عملية التطوير.
فهو يمكّنك من الاستفادة من تدقيق النوع في TypeScript، والأدوات المحسّنة، وتجربة المطورين المحسّنة أثناء بناء التطبيقات باستخدام Deno.
حدود Deno
ومع ذلك، فإن Deno لديه بعض القيود التي تؤثر على اعتماده. وفيما يلي بعض هذه القيود.
النظام البيئي غير الناضج
أحد قيود Deno هو نضج نظامها البيئي. بالمقارنة مع Node.js، التي كانت موجودة منذ فترة أطول، لا يزال نظام Deno البيئي جديدًا نسبيًا ومتطورًا.
هذا يعني أنه قد يكون هناك عدد أقل من المكتبات والأطر والأدوات الخارجية المصممة خصيصًا لـ Deno. قد تحتاج إلى بناء وظائف معينة من الصفر أو تكييف حزم Node.js الحالية لاستخدامها في Deno.
يعني صغر حجم المجتمع أيضًا أنه قد يكون هناك عدد أقل من الموارد والدروس التعليمية والدعم المجتمعي المتاح مقارنةً بمنظومة Node.js الراسخة.
ومع ذلك، مع اكتساب Deno شعبية واعتماده، من المتوقع أن ينمو نظامه البيئي وينضج، ليقدم مجموعة أوسع من المكتبات والأدوات في المستقبل.
منحنى التعلّم الحاد
هناك قيد آخر على Deno وهو منحنى التعلّم المرتبط بالانتقال من بيئات تشغيل JavaScript الأخرى، مثل Node.js.
يقدم Deno مفاهيم وواجهات برمجة التطبيقات والأنماط الجديدة التي قد تحتاج إلى التعرف عليها. يتضمن ذلك فهم نظام الوحدات النمطية في Deno، ونموذج الأمان المستند إلى الأذونات، والاختلافات في كيفية تنفيذ وظائف معينة مقارنةً بأوقات تشغيل أخرى.
قد يحتاج المطوّرون الذين يتقنون بالفعل استخدام Node.js إلى استثمار الوقت والجهد في التعلّم والتكيّف مع الميزات والاصطلاحات الخاصة بـ Deno.
ومع ذلك، يمكن إدارة منحنى التعلم بالرجوع إلى وثائق Deno الرسمية، والتفاعل مع مجتمع Deno، واستكشاف موارد التعلم المتاحة.
التوافق مع مكتبات Node.js
التوافق مع مكتبات Node.js هو قيد آخر في Deno. نظرًا للاختلافات في أنظمة الوحدات النمطية وبيئات وقت التشغيل، لا يمكن استخدام جميع مكتبات ووحدات Node.js مباشرةً في Deno دون تعديلات.
يستخدم Deno الوحدات النمطية ES (وحدات ECMAScript) كنظام الوحدات النمطية الخاص به، بينما يستخدم Node.js تقليديًا وحدات CommonJS. يمكن أن يؤدي هذا الاختلاف في تنسيقات الوحدات النمطية إلى عدم التوافق عند استيراد واستخدام وحدات Node.js الخاصة ب Node.js في Deno.
قد يحتاج المطورون إلى إجراء تعديلات أو العثور على مكتبات بديلة مصممة خصيصًا للعمل مع نظام الوحدات النمطية في Deno.
في حين أن Deno يوفر طبقة توافق لتشغيل بعض وحدات Node.js، إلا أنه قد لا يغطي جميع الحالات، وقد تكون هناك حاجة إلى تعديلات أو تعديلات يدوية.
خيارات نشر Deno
هناك العديد من خيارات النشر لتطبيقات Deno، ويتضمن بعضها ما يلي.
البنية التحتية كخدمة (IaaS)
البنية التحتية كخدمة (IaaS) هو نموذج حوسبة سحابية يوفر موارد حوسبة افتراضية. باستخدام IaaS، يمكنك استئجار أجهزة افتراضية وتخزين وشبكات افتراضية من موفري الخدمات السحابية على أساس الدفع حسب الاستخدام. يتيح لك ذلك إعداد وإدارة البنية التحتية الافتراضية الخاصة بك دون الاستثمار في الأجهزة المادية.
تتيح لك خيارات IaaS تشغيل تطبيقات Deno على أجهزة افتراضية. تقدم منصات IaaS الشائعة مثل AWS وGoogle Cloud وMicrosoft Azure حلولاً مرنة وقابلة للتطوير، مما يسمح لك بتهيئة البنية التحتية وفقاً لاحتياجات تطبيقك الخاصة.
ومع ذلك، بينما تمنحك IaaS تحكماً أكبر وعزلاً أكبر للموارد، إلا أنها تتطلب أيضاً المزيد من الإعداد والإدارة اليدوية، والتي تتضمن مهام مثل توفير الخادم وتحديثات الأمان والمراقبة.
لذلك، تُعد البنية التحتية كخدمة خيارًا قابلاً للتطبيق عندما تحتاج إلى تحكم واسع النطاق في بنيتك التحتية ولديك الخبرة اللازمة للتعامل مع تعقيداتها بفعالية.
الحاويات كخدمة (CaaS)
الحاويات كخدمة (CaaS) هو نموذج حوسبة سحابية يبسّط نشر التطبيقات الموضوعة في حاويات وإدارتها.
باستخدام CaaS، يمكنك التركيز على إنشاء التطبيقات ونشرها دون القلق بشأن البنية التحتية الأساسية.
يمكن نشر تطبيقات Deno داخل حاويات، مما يضمن الاتساق والعزل. حاويات Back4app هي خيار CaaS شائع لنشر Deno.
توفر منصات CaaS قابلية التوسع وعزل الموارد، حيث يعمل كل تطبيق في حاوية خاصة به، مما يعزز الأمان والاستقرار.
يضمن اتساق الحاويات إمكانية نشر تطبيقات Deno بسهولة على أي منصة تدعم الحاويات.
على الرغم من أن حلول CaaS لها منحنى تعليمي، إلا أنها توفر مزايا كبيرة للتطبيقات التي تتطلب التوسع الديناميكي والنشر عبر عقد أو مجموعات متعددة.
عملية تثبيت Deno
قبل أن تتمكن من استخدام Deno، عليك تنزيله وتثبيته. يختلف تثبيت Deno باختلاف نظام التشغيل الخاص بك.
على نظامي macOS و Linux، يمكنك تثبيت Deno عن طريق تشغيل الأمر أدناه:
curl -fsSL <https://deno.land/x/install/install.sh> | sh
على نظام ويندوز، يمكنك تثبيت Deno باستخدام Powershell عن طريق تشغيل الأمر أدناه:
irm <https://deno.land/install.ps1> | iex
للتأكد من نجاح عملية التثبيت، يمكنك تشغيل الأمر أدناه، ومن المفترض أن يطبع رقم الإصدار على جهازك الطرفي.
deno --version
إذا كنت لا ترى رقم الإصدار، فحاول تثبيت Deno مرة أخرى.
إعداد مشروع Deno
لإنشاء واجهة برمجة تطبيقات بسيطة باستخدام Deno، ستحتاج إلى موجه وخادم وقاعدة بيانات.
قبل اتباع الخطوات أدناه، قم بإنشاء مجلد src
في الدليل الجذر لمشروعك. سيحتوي هذا المجلد على جميع الملفات المصدرية لمشروعك.
الخطوة 1: إنشاء ملف تبعية
على عكس Node.js، لا يستخدم Deno مديري الحزم مثل NPM أو Yarn. بدلاً من ذلك، يتم استيراد الحزم مباشرةً من عنوان URL الخاص بها.
لمحاكاة وظائف ملف package.json،
أنشئ ملف deps.ts
في الدليل الجذر لمشروعك وأضف إليه الكتلة البرمجية أدناه.
export { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
export type { RouterContext} from "https://deno.land/x/[email protected]/mod.ts";
export { config as dotenvConfig } from "https://deno.land/x/[email protected]/mod.ts";
export { Client } from "https://deno.land/x/[email protected]/mod.ts";
كتلة الشيفرة أعلاه تستورد (تثبّت) وتصدّر التطبيق،
والموجّه،
و RouterContex
من Oak. التكوين
من dotenv والعميل
من deno-postgres.
الخطوة 2: إنشاء خادم
في هذه الخطوة، ستقوم بإنشاء خادم HTTP بسيط باستخدام Oak. Oak هو برنامج وسيط لخادم HTTP الخاص بـ Deno استنادًا إلى Koa.js، وهو إطار عمل لـ Node.js مشابه لـ Express ولكنه أخف وزنًا.
لإنشاء خادم HTTP مع Oak، قم بإنشاء ملف server.ts
في src
الخاص بك وأضف إليه الكتلة البرمجية أدناه.
import { Application } from "../deps.ts";
import config from "../config/default.ts";
import router from "./router.ts";
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: config.port });
تقوم كتلة التعليمات البرمجية أعلاه بإنشاء خادم HTTP مع Oak وتسجيل موجه للتعامل مع كل حركة المرور الواردة.
يقوم سطر app.use(router.routes())
بتسجيل مسارات الموجه كبرنامج وسيط في تطبيق Oak. ستتم مطابقة جميع الطلبات الواردة مع المسارات المسجلة، وسيتم تنفيذ المعالجات المقابلة في حال وجود تطابق.
إذا لم يتم العثور على تطابق، يعالج سطر app.use(router.permittedMethods())
هذه الحالات عن طريق إرسال ردود مناسبة مثل 404 غير موجود أو 405 غير مسموح به.
الخطوة 3: إدارة المتغيرات البيئية
إن تخزين البيانات الحساسة، مثل مفاتيح واجهة برمجة التطبيقات، وبيانات اعتماد قاعدة البيانات، وما إلى ذلك، في نص عادي يشكل خطرًا أمنيًا. أي شخص يحصل على مفاتيحك أو بيانات الاعتماد الخاصة بك قد يكون لديه وصول غير مقيد إلى تطبيقك. يمكن أن يؤدي ذلك إلى فقدان البيانات وسرقة البيانات، من بين عمليات استغلال محتملة أخرى.
من الممارسات الجيدة تخزين البيانات الحساسة في متغيرات بيئية لتجنب مثل هذه المواقف.
أنشئ ملف .env
في المجلد الجذر لمشروعك وخزِّن بيانات اعتماد قاعدة البيانات والمعلومات الحساسة الأخرى في الملف.
هكذا
#.env
DB_URI = <YOUR_POSTGRES_DB_URI>
PORT = 8000
استبدل ببيانات اعتماد قاعدة البيانات الخاصة بك.
بعد ذلك، أنشئ مجلد تكوين
في المجلد الجذر لمشروعك، وفي مجلد التكوين، أنشئ ملف default.ts
وأضف إليه الكتلة البرمجية أدناه.
//default.ts
import { dotenvConfig } from "../deps.ts";
dotenvConfig({
export: true,
path: "../.env",
});
const config = {
db: {
dbUri: Deno.env.get("DB_URI"),
},
port: 3000
};
export default config;
تسترد الكتلة البرمجية أعلاه القيم المخزنة في ملف .env
الخاص بك بشكل آمن وتعرضها لبقية التطبيق الخاص بك.
الخطوة 3: الاتصال بقاعدة بيانات
في هذه الخطوة، ستقوم بتوصيل تطبيقك بقاعدة بيانات Postgres. ستحتاج إلى قاعدة البيانات لتخزين واسترجاع البيانات لتطبيقك.
قم بإنشاء ملف db.ts
في مجلد src
الخاص بك وأضف إليه الكتلة البرمجية أدناه.
//db.ts
import { Client } from "../deps.ts";
import config from "../config/default.ts";
let postgresConfiguration = config.db.dbUri;
const client = new Client(postgresConfiguration);
await client.connect();
export default client;
تحاول كتلة التعليمات البرمجية أعلاه ربط تطبيقك بقاعدة بيانات Postgres باستخدام URI الذي قدمته في ملف .env
الخاص بك.
الخطوة 4: إنشاء مستودع قاعدة البيانات
أنشئ ملف blogRepository
في مجلد src
الخاص بك وأضف الشيفرة أدناه إلى ملفك.
//blogRepository.ts
import client from "./db.ts";
class BlogRepository {
async createBlogTable() {
const blog = await client.queryArray(
`CREATE TABLE IF NOT EXISTS blogs (id SERIAL PRIMARY KEY, title VARCHAR(255), body VARCHAR(255), author VARCHAR(255))`
);
return blog;
}
async getAllBlogs() {
const allBlogs = await client.queryArray("SELECT * FROM blogs");
return allBlogs;
}
async getBlogById(id: string) {
const blog = await client.queryArray(
`SELECT * FROM blogs WHERE id = ${id}`
);
return blog;
}
async createBlog(title: string, body: string, author: string) {
const blog = await client.queryArray(
`INSERT INTO blogs (title, body, author) VALUES ('${title}', '${body}', '${author}')`
);
return blog;
}
async updateBlog(id: string, title: string, body: string, author: string) {
const blog = await client.queryArray(
`UPDATE blogs SET title = '${title}', body = '${body}', author = '${author}' WHERE id = ${id}`
);
return blog;
}
async deleteBlog(id: string) {
const blog = await client.queryArray(`DELETE FROM blogs WHERE id = ${id}`);
return blog;
}
}
export default new BlogRepository();
ستتعامل كتلة التعليمات البرمجية أعلاه مع جميع عمليات قاعدة البيانات عن طريق تجريد استعلامات SQL الأولية وكشف طرق بسيطة يمكنك استخدامها للتفاعل مع قاعدة بيانات Postgres الخاصة بك.
الخطوة 5: إنشاء معالجات المسار
في هذه الخطوة، ستنشئ معالجات مسارات للتعامل مع وظائف CRUD البسيطة لتطبيقك. المسارات المدعومة هي كالتالي:
- GET /API/blogs: إرجاع جميع المدونات في قاعدة بياناتك
- GET/API/مدونة/:معرف: إرجاع مدونة واحدة مع المعرف المطابق المقدم في بارامز عنوان URL.
- POST /API/API/blog/neew: إنشاء مدونة جديدة في قاعدة بياناتك.
- PUT /API/مدونة/:معرف: يقوم بتحديث مدونة بالمعرف المطابق المقدم في بارامز عنوان URL.
- حذف /API/مدونة/:معرف: يحذف مدونة مع المعرف المطابق المقدم في بارامز عنوان URL.
أنشئ ملف router.ts في مجلد src الخاص بك وأضف الواردات التالية إليه.
import { Router, RouterContext } from "../deps.ts";
import blogRepository from "./blogRepository.ts";
بعد ذلك، قم بإنشاء مثيل موجه عن طريق إضافة الكتلة البرمجية أدناه إليه:
const router = new Router();
لتسجيل معالجات الموجه الخاص بك، يجب عليك ربطها بمثيل الموجه.
على سبيل المثال (GET /API/blogs):
router
.get("/api/blogs", async (ctx: RouterContext<"/api/blogs">) => {
const data = await blogRepository.getAllBlogs();
console.log(data);
//format data
const allBlogs = data.rows.map((blog) => {
return {
id: blog[0],
title: blog[1],
body: blog[2],
author: blog[3]
};
});
ctx.response.body = allBlogs;
})
ينشئ مكوِّن الشيفرة أعلاه معالج مسار ل GET /API/blogs عن طريق تسلسل منطق المعالج إلى مثيل الموجه.
قم بربطها بالطريقة المربوطة بالسلاسل السابقة لتسجيل بقية المسارات. هكذا
GET/API/مدونة/:id:
.get("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
try {
const data = await blogRepository.getBlogById(ctx.params.id);
console.log(data);
//format data
const blog = data.rows.map((blog) => {
return {
id: blog[0],
title: blog[1],
body: blog[2],
author: blog[3]
};
});
ctx.response.body = blog;
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error getting blog",
error,
};
}
})
البريد /API/مدونة/الجديد
.post("/api/blog/new", async (ctx: RouterContext<"/api/blog/new">) => {
const resBody = ctx.request.body();
const blog = await resBody.value;
if (!blog) {
ctx.response.status = 400;
ctx.response.body = { msg: "Invalid data. Please provide a valid blog." };
return;
}
const { title, body, author } = blog;
if (!(title && body && author)) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Title or description missing. Please provide a valid blog.",
};
return;
}
try {
await blogRepository.createBlog(title, body, author);
ctx.response.status = 201;
ctx.response.body = {
msg: "blog added successfully",
};
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error adding blog",
error,
};
}
})
PUT /API/API/blog/:id:
.put("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
try {
const resBody = ctx.request.body();
const blog = await resBody.value;
if (!blog) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Invalid data. Please provide a valid blog.",
};
return;
}
const { title, body, author } = blog;
if (!(title && body && author)) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Title or description missing. Please provide a valid blog.",
};
return;
}
await blogRepository.updateBlog(ctx.params.id, title, body, author);
ctx.response.status = 200;
ctx.response.body = {
msg: "blog updated successfully",
};
} catch (error) {
console.log(error);
ctx.response.status = 500;
ctx.response.body = {
msg: "Error updating blog",
error: error.message,
};
}
})
حذف /حذف /API/مدونة/:id:
.delete("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
await blogRepository.deleteBlog(ctx.params.id);
ctx.response.status = 200;
ctx.response.body = {
msg: "blog deleted successfully",
};
});
ثم، قم بتصدير مثيل جهاز التوجيه الخاص بك. هكذا
export default router;
أخيرًا، عدِّل ملف server.ts
الخاص بك لإنشاء قاعدة بيانات مدونة عند بدء تشغيل التطبيق للمرة الأولى.
هكذا
import { Application } from "../deps.ts";
import config from "../config/default.ts";
import blogRepository from "./blogRepository.ts";
import router from "./router.ts";
const app = new Application();
(async () => {
await blogRepository.createBlogTable();
})();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: config.port });
تضيف الشيفرة البرمجية المُعدَّلة IIFE التي تُنشئ جدول مدونة جديد في قاعدة بياناتك إلى ملف server.ts.
نشر تطبيق Deno الخاص بك على حاويات Back4app
لنشر تطبيق Deno الخاص بك على حاويات Back4app، تحتاج إلى اتباع الخطوات التالية:
الخطوة 1: قم بإنشاء ملف Dockerfile
يوفر ملف Dockerfile تعليمات محددة لبناء صورة Docker. توجه هذه التعليمات عملية بناء الصورة.
قم بتشغيل الأمر أدناه لإنشاء ملف Dockerfile:
touch Dockerfile
ينشئ الأمر أعلاه ملف Dockerfile في الدليل الجذر لمشروعك.
بعد ذلك، أضف الكتلة البرمجية أدناه إلى ملف Dockerfile الخاص بك:
FROM denoland/deno:latest
EXPOSE 8000
WORKDIR /app
COPY deps.ts .
RUN deno cache deps.ts
COPY . .
RUN deno cache src/server.ts
CMD ["run", "--allow-net", "--allow-env", "--allow-read", "src/server.ts"]
يقوم ملف Dockerfile أعلاه بإعداد بيئة حاوية لتشغيل تطبيق Deno. يقوم بتخزين تبعيات التطبيق ونقطة الدخول، ثم يقوم بتشغيل تطبيق Deno بالأذونات المحددة عند بدء تشغيل الحاوية.
من المتوقع أن يستمع التطبيق على المنفذ 8000، على الرغم من أن تعيين المنفذ الفعلي يجب أن يتم عند تشغيل الحاوية.
وأخيراً، ادفع شفرتك إلى GitHub.
الخطوة 2: قم بإنشاء تطبيق Back4app جديد
لإنشاء تطبيق Back4app، قم بزيارة موقع Back4app الرسمي. بمجرد الوصول إلى هناك، حدد موقع زر التسجيل في الزاوية العلوية اليمنى من صفحة Back4app المقصودة. سيتم توجيهك إلى نموذج التسجيل عند النقر على زر التسجيل. تابع ملء هذا النموذج بالتفاصيل المطلوبة، مثل عنوان بريدك الإلكتروني واسم المستخدم وكلمة المرور. تأكد من تقديم معلومات دقيقة. بعد إكمال النموذج، قم بإرساله.
إذا كان لديك حساب بالفعل، انقر على تسجيل الدخول بدلاً من ذلك.
بمجرد أن تقوم بإعداد حساب Back4app الخاص بك بنجاح، قم بتسجيل الدخول للوصول إلى لوحة تحكم حسابك. من هناك، حدد موقع زر “تطبيق جديد” وانقر عليه.
سيوجهك هذا الإجراء إلى صفحة حيث ستظهر لك خيارات مختلفة لإنشاء تطبيقك الجديد. بما أنك تنوي النشر باستخدام الحاويات، اختر خيار“الحاويات كخدمة“.
بعد ذلك، قم بربط حساب GitHub الخاص بك بحساب Back4app الخاص بك. يمكنك منح Back4app حق الوصول إلى جميع المستودعات في حسابك أو مستودعات محددة.
اختر التطبيق الذي تريد نشره، في هذه الحالة، التطبيق الذي أنشأته في هذا البرنامج التعليمي، وانقر فوق تحديد.
سيؤدي النقر على زر التحديد إلى نقلك إلى صفحة حيث سيُطلب منك ملء بعض المعلومات حول تطبيقك، مثل الاسم والفرع والدليل الجذر وخيارات النشر التلقائي والمنفذ والحالة والمتغيرات البيئية.
تأكد من توفير جميع المتغيرات البيئية الضرورية التي يتطلبها تطبيقك ليعمل بشكل صحيح. بمجرد الانتهاء من ملء المعلومات المطلوبة، تابع النقر على زر “إنشاء تطبيق”.
سيؤدي هذا إلى بدء عملية النشر، وبعد فترة، يجب أن تكون عملية النشر جاهزة. إذا كانت عملية النشر الخاصة بك تستغرق الكثير من الوقت، يمكنك التحقق من السجلات لمعرفة ما إذا كان هناك خطأ ما قد حدث في عملية النشر أو مراجعة دليل استكشاف الأخطاء وإصلاحها الخاص بـ Back4app.
الخاتمة
في هذه المقالة، استكشفت Deno ومزاياه وقيوده وخيارات النشر الشائعة وكيفية إنشاء تطبيق باستخدام Deno ونشر تطبيقك باستخدام حاويات Back4app.
على الرغم من محدوديته، نظرًا لنموذج الأمان الخاص به، يمكن أن يكون Deno مثاليًا لبناء تطبيقات آمنة وحساسة للغاية. بالإضافة إلى ذلك، يزيل دعم TypeScript الأصلي الخاص به مشاكل إعداد TypeScript في مشروعك.
باتباع الخطوات الموضحة في هذه المقالة يمكنك بسهولة إنشاء تطبيق Deno ونشره على حاويات Back4app.
الأسئلة الشائعة
ما هو Deno؟
Deno هو بيئة تشغيل JavaScript/TypeScript آمنة وحديثة تسمح للمطورين ببناء تطبيقات على جانب الخادم وتطبيقات على جانب العميل.
كيفية نشر تطبيق Deno؟
١. أنشئ تطبيق Deno
٢. أنشئ ملف Dockerfile
٣. انقل تطبيق Deno إلى GitHub واربط حسابك على GitHub بحساب Back4app.
٤. أنشئ تطبيق CaaS على Back4app
٥. اختر تطبيق Deno من قائمة مستودعاتك
٦. انشر تطبيق Deno