هيكل المشروع وتنظيمه

توفر هذه الصفحة نظرة عامة على جميع اصطلاحات المجلدات والملفات في Next.js، وتوصيات لتنظيم مشروعك.

اصطلاحات المجلدات والملفات

مجلدات المستوى الأعلى

تُستخدم مجلدات المستوى الأعلى لتنظيم كود التطبيق والأصول الثابتة.

Route segments to path segments
appموجه التطبيق (App Router)
pagesموجه الصفحات (Pages Router)
publicالأصول الثابتة التي سيتم تقديمها
srcمجلد مصدر التطبيق الاختياري

ملفات المستوى الأعلى

تُستخدم ملفات المستوى الأعلى لتكوين التطبيق، وإدارة التبعيات، وتشغيل الوسيط (middleware)، ودمج أدوات المراقبة، وتحديد متغيرات البيئة.

Next.js
next.config.jsملف تكوين Next.js
package.jsonتبعيات المشروع والنصوص البرمجية
instrumentation.tsملف OpenTelemetry والأدوات (Instrumentation)
middleware.tsوسيط طلبات Next.js
.envمتغيرات البيئة
.env.localمتغيرات البيئة المحلية
.env.productionمتغيرات بيئة الإنتاج
.env.developmentمتغيرات بيئة التطوير
.eslintrc.jsonملف تكوين ESLint
.gitignoreملفات ومجلدات Git لتجاهلها
next-env.d.tsملف تعريف TypeScript لـ Next.js
tsconfig.jsonملف تكوين TypeScript
jsconfig.jsonملف تكوين JavaScript

ملفات التوجيه (Routing)

layout.js .jsx .tsxالتخطيط (Layout)
page.js .jsx .tsxالصفحة (Page)
loading.js .jsx .tsxواجهة التحميل (Loading UI)
not-found.js .jsx .tsxواجهة غير موجود (Not found UI)
error.js .jsx .tsxواجهة الخطأ (Error UI)
global-error.js .jsx .tsxواجهة الخطأ العامة (Global error UI)
route.js .tsنقطة نهاية API
template.js .jsx .tsxالتخطيط المعاد تصييره
default.js .jsx .tsxصفحة الاحتياطي للطرق المتوازية

الطرق المتداخلة (Nested routes)

folderمقطع الطريق (Route segment)
folder/folderمقطع طريق متداخل (Nested route segment)

الطرق الديناميكية (Dynamic routes)

[folder]مقطع طريق ديناميكي
[...folder]مقطع طريق شامل (Catch-all)
[[...folder]]مقطع طريق شامل اختياري

مجموعات الطرق والمجلدات الخاصة

(folder)تجميع الطرق دون التأثير على التوجيه
_folderاستبعاد المجلد وجميع المقاطع الفرعية من التوجيه

الطرق المتوازية والمقاطعة (Parallel and Intercepted Routes)

@folderفتحة مسماة (Named slot)
(.)folderاعتراض نفس المستوى
(..)folderاعتراض مستوى واحد أعلى
(..)(..)folderاعتراض مستويين أعلى
(...)folderاعتراض من الجذر (root)

اصطلاحات ملفات البيانات الوصفية (Metadata)

أيقونات التطبيق

favicon.icoملف الأيقونة المفضلة (Favicon)
icon.ico .jpg .jpeg .png .svgملف أيقونة التطبيق
icon.js .ts .tsxأيقونة التطبيق المولدة
apple-icon.jpg .jpeg, .pngملف أيقونة Apple
apple-icon.js .ts .tsxأيقونة Apple المولدة

صور Open Graph و Twitter

opengraph-image.jpg .jpeg .png .gifملف صورة Open Graph
opengraph-image.js .ts .tsxصورة Open Graph المولدة
twitter-image.jpg .jpeg .png .gifملف صورة Twitter
twitter-image.js .ts .tsxصورة Twitter المولدة

تحسين محركات البحث (SEO)

sitemap.xmlملف خريطة الموقع (Sitemap)
sitemap.js .tsخريطة الموقع المولدة
robots.txtملف robots.txt
robots.js .tsملف robots المولد

تنظيم مشروعك

Next.js غير متحيز بشأن كيفية تنظيم وترتيب ملفات مشروعك. ولكنه يوفر عدة ميزات لمساعدتك في تنظيم مشروعك.

تسلسل المكونات (Component hierarchy)

يتم عرض المكونات المحددة في الملفات الخاصة بتسلسل محدد:

  • layout.js
  • template.js
  • error.js (حدود خطأ React)
  • loading.js (حدود تعليق React)
  • not-found.js (حدود خطأ React)
  • page.js أو layout.js متداخل
Component Hierarchy for File Conventions

يتم عرض المكونات بشكل متكرر في الطرق المتداخلة، مما يعني أن مكونات مقطع الطريق ستكون متداخلة داخل مكونات المقطع الأب.

Nested File Conventions Component Hierarchy

التنسيق المكاني (Colocation)

في دليل app، تحدد المجلدات المتداخلة بنية المسار (route). كل مجلد يمثل جزءًا من المسار (route segment) يتم تعيينه إلى جزء مقابل في مسار URL.

ومع ذلك، على الرغم من أن بنية المسار تُحدد من خلال المجلدات، إلا أن المسار غير متاح للجمهور حتى يتم إضافة ملف page.js أو route.js إلى جزء المسار.

مخطط يوضح كيف أن المسار غير متاح للجمهور حتى يتم إضافة ملف page.js أو route.js إلى جزء المسار.

وحتى عندما يصبح المسار متاحًا للجمهور، فإن المحتوى المُعاد فقط من خلال page.js أو route.js هو الذي يتم إرساله إلى العميل.

مخطط يوضح كيف أن ملفات page.js و route.js تجعل المسارات متاحة للجمهور.

هذا يعني أنه يمكن تنسيق ملفات المشروع بأمان داخل أجزاء المسار في دليل app دون أن تصبح قابلة للتوجيه بالخطأ.

مخطط يوضح أن ملفات المشروع المنسقة مكانيًا ليست قابلة للتوجيه حتى عندما يحتوي الجزء على ملف page.js أو route.js.

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

المجلدات الخاصة (Private Folders)

يمكن إنشاء مجلدات خاصة عن طريق إضافة شرطة سفلية كبادئة لاسم المجلد: _folderName

هذا يشير إلى أن المجلد هو تفاصيل تنفيذ خاصة ولا يجب أن تؤخذ بعين الاعتبار من قبل نظام التوجيه، مما يستثني المجلد وجميع مجلداته الفرعية من التوجيه.

مثال على هيكل مجلدات باستخدام المجلدات الخاصة

بما أن الملفات في دليل app يمكن تنسيقها بأمان افتراضيًا، فإن المجلدات الخاصة ليست مطلوبة للتنسيق المكاني. ومع ذلك، يمكن أن تكون مفيدة لـ:

  • فصل منطق واجهة المستخدم عن منطق التوجيه.
  • تنظيم الملفات الداخلية بشكل متسق عبر المشروع وبيئة Next.js.
  • فرز وتجميع الملفات في محررات الأكواد.
  • تجنب التعارضات المحتملة في التسمية مع اصطلاحات ملفات Next.js المستقبلية.

معلومة مفيدة:

  • على الرغم من أنها ليست اصطلاحًا في الإطار، يمكنك أيضًا التفكير في تمييز الملفات خارج المجلدات الخاصة كـ "خاصة" باستخدام نفس نمط الشرطة السفلية.
  • يمكنك إنشاء أجزاء URL تبدأ بشرطة سفلية عن طريق إضافة %5F (الشكل المشفر لـ URL للشرطة السفلية) كبادئة لاسم المجلد: %5FfolderName.
  • إذا كنت لا تستخدم المجلدات الخاصة، سيكون من المفهم معرفة اصطلاحات الملفات الخاصة بـ Next.js لتجنب تعارضات التسمية غير المتوقعة.

مجموعات المسارات (Route Groups)

يمكن إنشاء مجموعات المسارات عن طريق لف مجلد بين قوسين: (folderName)

هذا يشير إلى أن المجلد هو لأغراض تنظيمية ويجب ألا يُدرج في مسار URL.

مثال على هيكل مجلدات باستخدام مجموعات المسارات

مجموعات المسارات مفيدة لـ:

مجلد src

يدعم Next.js تخزين كود التطبيق (بما في ذلك app) داخل مجلد src اختياري. هذا يفصل كود التطبيق عن ملفات تكوين المشروع التي تعيش غالبًا في جذر المشروع.

مثال على هيكل مجلدات مع مجلد `src`

أمثلة

يُدرج القسم التالي نظرة عامة عالية المستوى على الاستراتيجيات الشائعة. النصيحة الأساسية هي اختيار استراتيجية تناسبك وفريقك والالتزام بها عبر المشروع.

معلومة مفيدة: في الأمثلة أدناه، نستخدم مجلدات components و lib كعناصر نائبة عامة، تسمياتها ليس لها أهمية خاصة في الإطار وقد تستخدم مشاريعك مجلدات أخرى مثل ui، utils، hooks، styles، إلخ.

تخزين ملفات المشروع خارج app

هذه الاستراتيجية تخزن جميع أكواد التطبيق في مجلدات مشتركة في جذر مشروعك وتحافظ على دليل app لأغراض التوجيه فقط.

مثال على هيكل مجلدات مع ملفات المشروع خارج app

تخزين ملفات المشروع في مجلدات عليا داخل app

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

مثال على هيكل مجلدات مع ملفات المشروع داخل app

تقسيم ملفات المشروع حسب الميزة أو المسار

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

مثال على هيكل مجلدات مع ملفات المشروع مقسمة حسب الميزة أو المسار

تنظيم المسارات دون التأثير على مسار URL

لتنظيم المسارات دون التأثير على URL، أنشئ مجموعة لإبقاء المسارات ذات الصلة معًا. سيتم حذف المجلدات بين القوسين من URL (مثل (marketing) أو (shop)).

تنظيم المسارات مع مجموعات المسارات

على الرغم من أن المسارات داخل (marketing) و (shop) تشترك في نفس التسلسل الهرمي لـ URL، يمكنك إنشاء تخطيط مختلف لكل مجموعة عن طريق إضافة ملف layout.js داخل مجلداتها.

مجموعات المسارات مع تخطيطات متعددة

اختيار أجزاء محددة لتخطيط معين

لاختيار مسارات معينة لتخطيط معين، أنشئ مجموعة مسار جديدة (مثل (shop)) وانقل المسارات التي تشترك في نفس التخطيط إلى المجموعة (مثل account و cart). المسارات خارج المجموعة لن تشترك في التخطيط (مثل checkout).

مجموعات المسارات مع تخطيطات اختيارية

اختيار هيكل تحميل (loading skeleton) لمسار معين

لتطبيق هيكل تحميل عبر ملف loading.js على مسار معين، أنشئ مجموعة مسار جديدة (مثل /(overview)) ثم انقل ملف loading.tsx داخل مجموعة المسار هذه.

هيكل مجلدات يوضح ملف loading.tsx و page.tsx داخل مجموعة المسار

الآن، سيتم تطبيق ملف loading.tsx فقط على صفحة dashboard → overview بدلاً من جميع صفحات dashboard دون التأثير على هيكل مسار URL.

إنشاء تخطيطات جذر متعددة

لإنشاء عدة تخطيطات جذر، احذف ملف layout.js الأعلى مستوى، وأضف ملف layout.js داخل كل مجموعة مسار. هذا مفيد لتقسيم التطبيق إلى أقسام لها واجهة مستخدم أو تجربة مختلفة تمامًا. يجب إضافة العلامات <html> و <body> إلى كل تخطيط جذر.

مجموعات المسارات مع تخطيطات جذر متعددة

في المثال أعلاه، كل من (marketing) و (shop) لهما تخطيط جذر خاص به.