freeCodeCamp/guide/arabic/nodejs/express/index.md

30 KiB

title localeTitle
ExpressJS ExpressJS

ExpressJS

عندما يتعلق الأمر ببناء تطبيقات الويب باستخدام Node.js ، قد يستغرق إنشاء الخادم وقتًا طويلاً. على مر السنين نضجت Node.js بما فيه الكفاية بسبب الدعم من المجتمع. يساعد استخدام Node.js كواجهة خلفية لتطبيقات الويب ومواقع الويب المطورين على البدء في العمل على تطبيقهم أو منتجهم بسرعة. في هذا البرنامج التعليمي ، سننظر في Expressjs وهو إطار عمل Node.js لتطوير الويب الذي يأتي مزودًا بميزات مثل التوجيه والتقديم ودعم واجهات برمجة تطبيقات REST.

ما هو اكسبرس؟

Express هو إطار Node.js الأكثر شيوعًا لأنه يتطلب الحد الأدنى من الإعداد لبدء تطبيق أو API وواجهة سريعة وغير مسبوقة في نفس الوقت. وبعبارة أخرى ، فإنه لا يفرض فلسفته الخاصة التي يجب أن تبنى التطبيق أو API بطريقة معينة ، على عكس ريلز ودجانجو. يمكن حساب مرونته من خلال عدد وحدات npm المتوفرة مما يجعلها قابلة للتوصيل في نفس الوقت. إذا كان لديك معرفة أساسية بـ HTML و CSS و JavaScript وكيف يعمل Node.js بشكل عام ، فلن تتمكن في أي وقت من البدء مع Expressjs.

تم تطوير Express بواسطة TJ Holowaychuk وتمت المحافظة عليه الآن بواسطة مؤسسة Node.js ومطوري البرامج مفتوحة المصدر. لبدء التطوير باستخدام Express ، يجب أن يكون لديك Node.js و npm مثبتين. يمكنك تثبيت Node.js على جهازك المحلي ومعه يأتي الأمر npm بسطر الأوامر الذي سيساعدنا على تثبيت الإضافات أو كما يسمى التبعيات في وقت لاحق في مشروعنا.

للتحقق مما إذا كان كل شيء مثبتًا بشكل صحيح ، يرجى فتح الجهاز ونوع:

node --version v5.0.0 npm --version 3.5.2

إذا كنت تحصل على رقم الإصدار بدلاً من خطأ ، فهذا يعني أنك قمت بتثبيت Node.js و npm بنجاح.

لماذا استخدام Expressjs؟

قبل أن نبدأ بآلية استخدام Express كإطار للخلفية ، دعونا نستكشف أولاً لماذا يجب أن نفكر في استخدامه أو أسباب شعبيته.

  • يتيح لك Express إنشاء تطبيقات ويب وتطبيقات متعددة للهواتف المحمولة والصفحات متعددة الصفحات. استخدام الواجهة الخلفية الشائعة الأخرى هو توفير واجهة برمجة التطبيقات لعميل (سواء كان على الويب أو الجوّال).
  • يأتي مع محرك قالب افتراضي ، Jade الذي يساعد على تسهيل تدفق البيانات إلى بنية موقع ويب ويدعم محركات القوالب الأخرى.
  • وهو يدعم MVC (Model-View-Controller) ، وهي بنية شائعة جدًا لتصميم تطبيقات الويب.
  • إنها منصة مشتركة ولا تقتصر على أي نظام تشغيل معين.
  • انها تستفيد على Node.js واحد مترابطة ونموذج غير متزامن.

عندما نقوم بإنشاء مشروع باستخدام npm ، يجب أن يحتوي مشروعنا على ملف package.json .

خلق package.json

يحتوي ملف JSON (تدوين كائن جافا سكريبت) على كل معلومات عن أي مشروع Express. عدد الوحدات النمطية المثبتة ، واسم المشروع ، والإصدار ، وغيرها من معلومات التعريف. لإضافة Expressjs كوحدة نمطية في مشروعنا ، نحتاج أولاً إلى إنشاء دليل مشروع ثم إنشاء ملف package.json.

mkdir express-app-example cd express-app-example npm init --yes

سيؤدي هذا إلى إنشاء ملف package.json في جذر دليل المشروع. لتثبيت أي وحدة نمطية من npm نحتاج إلى وجود ملف package.json في هذا الدليل.

{ "name": "express-web-app", "version": "0.1.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "license": "MIT" }

تثبيت اكسبرس

الآن لدينا ملف package.json ، يمكننا تثبيت Express عن طريق تشغيل الأمر:

npm install --save express

يمكننا التأكد من أن Express قد تم تثبيته بشكل صحيح بطريقتين. أولاً ، سيكون هناك قسم جديد في ملف package.json يسمى dependencies التي يوجد تحتها Express الخاص بنا:

{ "name": "express-web-app", "version": "0.1.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "license": "MIT", "dependencies": { "express": "4.16.0" } }

الطريقة الثانية هي أن مجلدًا جديدًا يسمى node_modules ظهر فجأة في جذر دليل مشروعنا. يخزن هذا المجلد الحزم التي نثبتها محليًا في مشروعنا.

بناء خادم مع اكسبرس

لاستخدام حزمة التثبيت الخاصة بنا لإطار Express وإنشاء تطبيق خادم بسيط ، سنقوم بإنشاء الملف ، index.js ، في جذر دليل مشروعنا.

`const express = require('express'); const app = express();

app.get('/', (req, res) => res.send('Hello World!'));

app.listen(3000, () => console.log('Example app listening on port 3000!')); `

لبدء تشغيل الخادم ، انتقل إلى جهازك واكتب:

node index.js

هذا سيبدأ الخادم. سوف يستمع هذا التطبيق الحد الأدنى على المنفذ 3000. نحن نقدم طلبا من خلال متصفحنا على http://localhost:3000 وسوف يستجيب الخادم الخاص بنا مع Hello World حيث يكون المتصفح هو العميل وستظهر الرسالة هناك.

يستخدم السطر الأول من الكود الخاص بنا الوظيفة require لتضمين الوحدة النمطية express . هذه هي الطريقة التي ندمج بها ونستخدم حزمة مثبتة من npm في أي ملف جافا سكريبت في مشروعنا. قبل أن نبدأ باستخدام Express ، نحتاج إلى تحديد مثيل منه الذي يعالج الطلب والاستجابة من الخادم إلى العميل. في حالتنا ، هو app المتغير.

app.get() هي إحدى الوظائف التي تخبر الخادم ما يجب القيام به عند استدعاء طلب get على المسار المحدد. يحتوي على وظيفة رد اتصال (req, res) التي تستمع إلى كائن req للطلب الوارد وتستجيب وفقًا لذلك باستخدام كائن استجابة res . يتم توفير كل من req و res لنا من خلال إطار Express.

يمثل الكائن req طلب HTTP ويحتوي على خصائص سلسلة طلب البحث والمعلمات والجسم ورؤوس HTTP. يمثل الكائن res استجابة HTTP التي يرسلها تطبيق Express عندما يتلقى طلب HTTP. في حالتنا ، نرسل رسالة نصية Hello World كلما تم تقديم طلب إلى الطريق / .

وأخيرا، app.listen() هي وظيفة أن يبدأ الميناء والبلد المضيف، في حالتنا localhost للاتصالات للاستماع إلى الطلبات الواردة من العميل. يمكننا تحديد رقم المنفذ مثل 3000 .

تشريح تطبيق اكسبرس

من المرجح أن تحتوي البنية النموذجية لملف خادم Express على الأجزاء التالية:

تبعيات

استيراد التبعيات مثل التعبير عن نفسه. يتم تثبيت هذه التبعيات باستخدام npm كما فعلنا في المثال السابق.

التجسيدات

هذه هي العبارات لإنشاء كائن. لاستخدام التعبير السريع ، يتعين علينا إنشاء متغير app منه.

تكوينات

هذه العبارات هي الإعدادات المعتمدة على التطبيقات المخصصة التي يتم تحديدها بعد عمليات instantiations أو المعرفة في ملف منفصل (المزيد عند مناقشة بنية المشروع) والمطلوبة في ملف الخادم الرئيسي.

الوسيطة

تحدد هذه الوظائف تدفق دورة الطلب-الاستجابة. يتم تنفيذها بعد كل طلب وارد. يمكننا أيضا تحديد وظائف وسيطة مخصصة. لدينا قسم عليها أدناه.

طرق

هي نقاط النهاية المحددة في خادمنا والتي تساعد على تنفيذ عمليات طلب عميل معين.

Bootstrapping الخادم

آخر ما يتم تنفيذه في خادم Express هو الدالة app.listen() التي تبدأ الخادم الخاص بنا.

سنبدأ الآن في مناقشة الأقسام التي لم نناقشها من قبل.

التوجيه

يشير التوجيه إلى كيفية استجابة تطبيق جانب الخادم لطلب العميل إلى نقطة نهاية معينة. تتكون نقطة النهاية هذه من URI (مسار مثل / أو /books ) وطريقة HTTP مثل GET و POST و PUT و DELETE وما إلى ذلك.

يمكن أن تكون المسارات إما صفحات ويب قديمة جيدة أو نقاط نهاية REST API. في كلتا الحالتين ، يمكن تعريف بناء الجملة على أنه بناء مماثل لطريق ما على النحو التالي:

app.METHOD(PATH, HANDLER);

تساعد أجهزة التوجيه في فصل المخاوف مثل نقاط النهاية المختلفة والحفاظ على الأجزاء ذات الصلة من شفرة المصدر معًا. يساعدون في بناء كود قابل للصيانة. يتم تعريف جميع الطرق قبل استدعاء الدالة app.listen() . في تطبيق Express النموذجي ، app.listen() آخر وظيفة يتم تنفيذها.

طرق التوجيه

HTTP هو بروتوكول قياسي لعميل وخادم للاتصال. يوفر أساليب مختلفة للعميل لتقديم الطلب. يحتوي كل مسار على وظيفة hanlder على الأقل أو رد اتصال. تحدد وظيفة رد الاتصال هذه ما ستكون الاستجابة من الخادم لهذا المسار بعينه. على سبيل المثال ، يتم استخدام مسار app.get() لمعالجة طلبات GET وفي المقابل إرسال رسالة بسيطة كرد.

// GET method route app.get('/', (req, res) => res.send('Hello World!'));

مسارات التوجيه

مسار التوجيه هو مزيج من طريقة طلب لتعريف نقاط النهاية التي يمكن أن يقوم بها العميل بواسطة الطلبات. يمكن أن تكون مسارات المسارات عبارة عن سلاسل أو أنماط سلسلة أو تعبيرات عادية.

دعنا نحدد نقطتي نهايتين أخريين في تطبيقنا القائم على الخادم.

app.get('/home', (req, res) => { res.send('Home Page'); }); app.get('/about', (req, res) => { res.send('About'); });

ضع في اعتبارك الشفرة الموضحة أعلاه كحد أدنى لموقع الويب الذي يحتوي على نقطتي نهايتين ، و /about أو /home و /about . إذا قدم العميل طلبًا للصفحة الرئيسية ، فسيتم الرد فقط مع Home Page وسيقوم /about بإرسال الاستجابة: About Page . نحن نستخدم وظيفة res.send لإرسال السلسلة مرة أخرى إلى العميل في حالة تحديد أي من الطريقتين المحددتين.

معلمات التوجيه

تسمى معلمات المسار شرائح عناوين URL التي يتم استخدامها لالتقاط القيم المحددة في موضعها في عنوان URL. يتم استخدام كائن req.params في هذه الحالة لأنه لديه حق الوصول إلى جميع المعلمات التي تم تمريرها في عنوان url.

app.get('/books/:bookId', (req, res) => { res.send(req.params); });

سيكون عنوان URL من العميل الوارد في شفرة المصدر أعلاه http://localhost:3000/books/23 . يجب أن يتكون اسم معلمات المسار من أحرف ([A-Za-z0-9_]). حالة استخدام عامة جدًا لمعلمة توجيه في طلبنا هي الحصول على مسار 404.

// For invalid routes app.get('*', (req, res) => { res.send('404! This is an invalid URL.'); });

إذا بدأنا الآن الخادم من سطر الأوامر باستخدام node index.js وحاول زيارة عنوان URL: http://localhost:3000/abcd . ردا على ذلك ، سوف نحصل على رسالة 404.

وظائف الوسيطة

وظائف الوسيط هي الدوال التي لها حق الوصول إلى كائن الطلب ( req ) ، وكائن الاستجابة ( res ) ، والوظيفة next في دورة طلب-استجابة التطبيق. الهدف من هذه الوظائف هو تعديل كائنات الطلب والاستجابة للمهام مثل تحليل جهات الطلب ، وإضافة رؤوس الاستجابة ، وإجراء تغييرات أخرى على دورة الطلب-الاستجابة ، ووضع حد لدورة طلب-الاستجابة ، واستدعاء وظيفة الوسيطة التالية.

الوظيفة next هي وظيفة في جهاز التوجيه السريع الذي يتم استخدامه لتنفيذ وظائف وسيطة أخرى تنجح في الوسيطة الحالية. إذا كانت وظيفة الوسيطة تتضمن next() فهذا يعني أن دورة طلب الرد منتهية هناك. إن اسم الوظيفة next() هنا هو نظام تحكيم تمامًا ويمكنك تسمية أي شيء تريده ولكن من المهم الالتزام بأفضل الممارسات ومحاولة اتباع بعض الاتفاقيات ، خاصةً إذا كنت تعمل مع مطورين آخرين.

أيضا ، عند كتابة البرامج الوسيطة المخصصة لا تنس أن تضيف الدالة next() إليها. إذا كنت لا أذكر next() فإن دورة الطلب-الاستجابة ستعلق في أي مكان من أي مكان وقد تتسبب servr في إراحة العميل.

دعونا نستخدم أداة وسيطة مخصصة لفهم فهم هذا المفهوم. خذ هذا الرمز على سبيل المثال:

`const express = require('express'); const app = express();

// Simple request time logger app.use((req, res, next) => { console.log("A new request received at " + Date.now());

// This function call tells that more processing is // required for the current request and is in the next middleware function/route handler. next(); });

app.get('/home', (req, res) => { res.send('Home Page'); });

app.get('/about', (req, res) => { res.send('About Page'); });

app.listen(3000, () => console.log('Example app listening on port 3000!')); `

لإعداد أي برامج وسيطة ، سواء كانت مخصصة أو متوفرة كوحدة نمطية في npm ، نستخدم وظيفة app.use() . إنها كقاعدة معلمة اختيارية واحدة واستدعاء واحد للمعلمة الإلزامية. في حالتنا ، نحن لا نستخدم مسار paramaeter اختياري.

app.use((req, res, next) => { console.log('A new request received at ' + Date.now()); next(); });

يتم استدعاء الدالة الوسيطة أعلاه لكل طلب يقدمه العميل. عند تشغيل الخادم ، ستلاحظ أنه بالنسبة لكل طلب متصفح في نقطة النهاية / ، ستتم مطالبتك برسالة في جهازك:

A new request received at 1467267512545

يمكن استخدام وظائف الوسيطيات لمسار معين. انظر المثال أدناه:

`const express = require('express'); const app = express();

//Simple request time logger for a specific route app.use('/home', (req, res, next) => { console.log('A new request received at ' + Date.now()); next(); });

app.get('/home', (req, res) => { res.send('Home Page'); });

app.get('/about', (req, res) => { res.send('About Page'); });

app.listen(3000, () => console.log('Example app listening on port 3000!')); `

في هذه المرة ، سترى مطالبة مشابهة فقط عندما يطلب العميل نقطة النهاية /home منذ الإشارة إلى المسار في app.use() . لن يتم عرض أي شيء في المحطة عندما يطلب العميل نقطة النهاية /about .

يعد ترتيب وظائف الوسيط أمرًا هامًا حيث إنها تحدد وقت استدعاء الوظيفة الوسيطة. في المثال أعلاه ، إذا قمنا بتعريف مسار app.get('/home')... قبل app.use('/home')... الوسيطة app.use('/home')... ، فلن يتم استدعاء وظيفة الوسيطة.

وظائف الوسيط الخارجية للطرف الثالث

وظائف الوسيط هي نمط مفيد يسمح للمطورين بإعادة استخدام الكود داخل تطبيقاتهم وحتى مشاركتها مع الآخرين في شكل وحدات ذاكرة حديثة. التعريف الأساسي للوسيط هو دالة ذات ثلاث حجج: طلب (أو req) ، استجابة (res) ، وبعد ذلك نحن المراقب في القسم السابق.

في كثير من الأحيان في تطبيق الخادم المعتمد لدينا ، سنستخدم وظائف وسيطة من طرف ثالث. يتم توفير هذه الوظائف بواسطة Express نفسها. فهي مثل الإضافات التي يمكن تثبيتها باستخدام npm وهذا هو السبب في أن Express هي مرنة.

بعض وظائف الوسيطة الأكثر شيوعًا في تطبيق Express هي:

bodyParser

يسمح للمطورين بمعالجة البيانات الواردة ، مثل حمولة الجسم. الحمولة هي البيانات التي نتلقاها من العميل حتى تتم معالجتها. الأكثر فائدة مع طرق POST. يتم تثبيته باستخدام:

npm install --save body-parser

الاستعمال:

`const bodyParser = require('body-parser');

// To parse URL encoded data app.use(bodyParser.urlencoded({ extended: false }));

// To parse json data app.use(bodyParser.json()); `

من المحتمل أنها واحدة من أكثر استخدامات الوسيطة من طرف ثالث في أي تطبيق اكسبرس.

cookieParser

يوزع رأس ملف تعريف الارتباط req.cookies مع كائن مرتبط بأسماء ملفات تعريف الارتباط. لتثبيته ،

$ npm install --save cookie-parser

const cookieParser = require('cookie-parser'); app.use(cookieParser());

جلسة

تقوم وظيفة الوسيطة هذه بإنشاء وسيط جلسة مع خيارات محددة. غالبًا ما يتم استخدام جلسة في تطبيقات مثل تسجيل الدخول / التسجيل.

$ npm install --save session

app.use( session({ secret: 'arbitary-string', resave: false, saveUninitialized: true, cookie: { secure: true } }) );

مورغان

يقوم البرنامج الوسيط مورغان بتتبع جميع الطلبات وغيرها من المعلومات المهمة اعتمادًا على تنسيق الإخراج المحدد.

npm install --save morgan

const logger = require('morgan'); // ... Configurations app.use(logger('common'));

common هو حالة تنسيق مسبق يمكن استخدامها في التطبيق. هناك تنسيقات أخرى محددة مسبقًا مثل صغيرة ومبتكر ، ولكن يمكنك تحديد أنك تملك تنسيقًا مخصصًا أيضًا باستخدام معلمات السلسلة المتوفرة لنا من قِبل morgan.

تتوفر قائمة بالوظائف الوسيطة الأكثر استخدامًا على هذا الرابط .

خدمة الملفات الثابتة

لتقديم ملفات ثابتة مثل صفحات الأنماط CSS ، والصور ، إلخ. يوفر Express وظيفة express.static في البرامج الوسيطة express.static . الملفات الثابتة هي تلك الملفات التي يقوم العميل بتنزيلها من الخادم.

هي وظيفة الوسيطة الوحيدة التي تأتي مع إطار Express ويمكننا استخدامها مباشرة في طلبنا. جميع الوسطاء الآخرين هم طرف ثالث.

بشكل افتراضي ، لا يسمح Express بخدمة الملفات الثابتة. علينا استخدام هذه الوظيفة الوسيطة. من الممارسات الشائعة في تطوير تطبيق الويب هو تخزين جميع الملفات الثابتة تحت الدليل "العام" في جذر المشروع. يمكننا تقديم هذا المجلد لخدمة ملفات ثابتة تتضمن الكتابة في ملف index.js :

app.use(express.static('public'));

الآن ، سيتم تحميل الملفات الثابتة في دليلنا العام.

http://localhost:3000/css/style.css http://localhost:3000/images/logo.png http://localhost:3000/images/bg.png http://localhost:3000/index.html

أدلة ثابتة متعددة

لاستخدام العديد من دلائل الأصول الثابتة ، اتصل بوظيفة الوسيطة express.static عدة مرات:

app.use(express.static('public')); app.use(express.static('files'));

المسار الافتراضي البادئة

يمكن أيضًا توفير بادئة مسار الإصلاح كوسيطة أولى للدالة الوسيطة express.static . يُعرف هذا بادئة مسار افتراضي لأن المسار الفعلي غير موجود في المشروع.

app.use('/static', express.static('public'));

إذا حاولنا الآن تحميل الملفات:

http://localhost:3000/static/css/style.css http://localhost:3000/static/images/logo.png http://localhost:3000/static/images/bg.png http://localhost:3000/static/index.html

هذه التقنية تأتي في متناول اليدين عند توفير أدلة متعددة لخدمة ملفات ثابتة. يتم استخدام البادئات للمساعدة في التمييز بين الدلائل المتعددة.

محركات قالب

محركات القوالب هي مكتبات تسمح لنا باستخدام لغات القوالب المختلفة. لغة القالب هي مجموعة خاصة من التعليمات (بناء الجملة وهياكل التحكم) التي توجه المحرك إلى كيفية معالجة البيانات. استخدام محرك قالب سهل مع Express. محركات القوالب الشعبية مثل Pug و EJS و Swig و Handlebars متوافقة مع Express. ومع ذلك ، Express يأتي بمحرك قالب افتراضي ، Jade ، وهو الإصدار الأول من Pug.

لشرح كيفية استخدام "محرك القوالب" ، سنستخدم Pug. إنه محرك قالب قوي يوفر ميزات مثل الفلاتر ، ويشمل ، الاستيفاء ، وما إلى ذلك. لاستخدامها ، يجب علينا أولاً تثبيت كوحدة نمطية في مشروعنا باستخدام npm .

npm install --save pug

سيقوم هذا الأمر بتثبيت الصلصة وللتحقق من تثبيتها بشكل صحيح ، فقط ألقي نظرة على ملف package.json . لاستخدامه مع تطبيقنا أولاً ، يجب علينا تعيينه كمحرك قالب وإنشاء دليل جديد ".views" حيث سنقوم بتخزين كافة الملفات المتعلقة بمحرك القالب الخاص بنا.

app.set('view engine', 'pug'); app.set('views', './views');

بما أننا نستخدم app.set() الذي يشير إلى التكوين داخل ملف الخادم الخاص بنا ، يجب أن app.set() قبل تحديد أي مسار أو وظيفة وسيطة.

في direcotry views ، قم بإنشاء ملف يسمى index.pug .

doctype html html head tite="Hello from Pug" body p.greetings Hello World!

لتشغيل هذه الصفحة ، سنقوم بإضافة الطريق التالي إلى طلبنا.

app.get('/hello', (req, res) => { res.render('index'); });

نظرًا لأننا قمنا بالفعل بتعيين res.render كمحرك القالب الخاص بنا ، فإننا في res.render لا نحتاج إلى توفير ملحق .pug . تعرض هذه الوظيفة الكود في أي ملف .pug إلى HTML .pug العميل. يمكن للمتصفحات تقديم ملفات HTML فقط. إذا قمت بتشغيل الخادم الآن ، وقمت بزيارة المسار http://localhost:3000/hello فسوف تشاهد إخراج Hello World بشكل صحيح.

في Pug ، يجب أن تلاحظ أننا لا نحتاج إلى كتابة علامات الإغلاق إلى العناصر كما نفعل في HTML. سيتم تقديم الكود السابق في HTML على النحو التالي:

`

<html> <head> </head>

Hello World!

</html> `

ميزة استخدام "محرك القوالب" على ملفات HTML الخام هو أنها توفر الدعم لتنفيذ المهام عبر البيانات. لا يمكن لـ HTML تقديم البيانات مباشرة. تشترك الأطر مثل Angular و React في هذا السلوك مع محركات القوالب.

يمكنك أيضًا تمرير القيم إلى محرك القالب مباشرةً من وظيفة معالج التوجيه.

app.get('/', (req, res) => { res.render('index', { title: 'Hello from Pug', message: 'Hello World!' }); });

للحالة أعلاه ، سيتم كتابة ملف index.pug بنا على النحو التالي:

doctype html html head title= title body h1= message

سيكون الإخراج نفس الحالة السابقة.

هيكل المشروع لتطبيق Express

نظرًا لأن Express لا يفرض الكثير على مطور البرامج الذي يستخدمه ، فإنه في بعض الأحيان يمكن أن يتغلب على هيكل المشروع الذي يجب أن يتبعه المرء. ليس له بنية محددة بشكل رسمي ولكن حالة الاستخدام الأكثر شيوعًا التي يتبعها أي تطبيق يستند إلى Node.js هي فصل المهام المختلفة في وحدات مختلفة. هذا يعني أن يكون لديك ملفات JavaScript منفصلة.

دعونا نذهب من خلال strucutre نموذجي لتطبيق ويب عبر الإنترنت.

project-root/ node_modules/ // This is where the packages installed are stored config/ db.js // Database connection and configuration credentials.js // Passwords/API keys for external services used by your app config.js // Environment variables models/ // For mongoose schemas books.js things.js routes/ // All routes for different entities in different files books.js things.js views/ index.pug 404.pug ... public/ // All static files images/ css/ javascript/ app.js routes.js // Require all routes in this and then require this file in app.js package.json

هذا هو النمط المعروف باسم MVC ، عارض عرض نموذج. ببساطة لأن نموذج قاعدة البيانات ، واجهة المستخدم الخاصة بالتطبيق ووحدات التحكم (في حالتنا ، الطرق) مكتوبة ومحفوظة في ملفات منفصلة. نمط التصميم هذا الذي يجعل أي تطبيق ويب سهل القياس إذا كنت ترغب في تقديم المزيد من المسارات أو الملفات الثابتة في المستقبل والرمز قابل للصيانة.