الوثائقمتقدم

كيف يعمل نيكسي

ماذا يحدث بين الملف الذي تكتبه والصفحة في المتصفح: الطبقات التي يتقاطع معها الطلب، ومن يبني ماذا، وماذا يترك Nexy لتطبيقك. لا تحتاج إلى هذه الصفحة للبدء؛ فهو يجيب على أسئلة "لماذا يعمل بهذه الطريقة" لاحقًا.

الطبقات

طلب واحد، خمس طبقات
Browser
   │
   ▼
Uvicorn ───── ASGI transport
   │
   ▼
Middleware ── sessions, CORS, gzip, trusted hosts, your own
   │
   ▼
Router ────── FBR | Modular | Custom ── picks the file that answers
   │
   ▼
Renderer ──── HTML (Jinja2, Markdown, Node) or JSON
   │
   ▼
Response
طبقة المسؤولية لا
Uvicorn اقبل الاتصال، وتحدث ASGI تعرف ما هي الصفحة
الوسيطة تزيين الطلب: الجلسة، CORS، gzip، المضيفين الموثوقين، إعادة توجيه HTTPS، لك اختر الطريق
جهاز التوجيه مطابقة عنوان URL للملف، مع تخطيطاته وتبعياته وصفحات الخطأ الخاصة به إنتاج المحتوى
العارض قم بتشغيل الصفحة وتحويل نتيجتها إلى HTML أو JSON جلب البيانات الخاصة بك
العميل Vite وإطارك: الحزم، والترطيب، وملاحة العميل الرد على طلب الخادم

من يبني ماذا

ممثل يملك لا يملك
نكسي التوجيه، تقديم الخادم، الإجراءات، .nexy التجميع، أصل واحد المكونات، التفاعل، البيانات
Vite حزم العميل، خادم التطوير، إعادة التحميل السريع التوجيه، تقديم الخادم، الإجراءات
الإطار الخاص بك المكونات، التفاعل، النظام البيئي توجيه المستند (يطلب Nexy تخطيطه له)
التطبيق الخاص بك البيانات والمصادقة والترخيص وقواعد العمل النقل، التقديم

القاعدة خلف الطاولة: النكسي يبني ما يملك، ولا يجمع ما يجمع Vite أبدًا.

نظام التوجيه

المسار تحت src/routes/ يصبح عنوان URL بأربع قواعد:

ملف عنوان URL
blog/index.nexy /blog
blog/[slug].nexy /blog/hello
blog/[...parts].nexy /blog/a/b
(marketing)/about.nexy /about

لا يظهر الامتداد مطلقًا؛ index هو مسار المجلد الخاص به؛ مجلد بين قوسين يجمع الملفات دون إضافة مقطع.

عندما يتمكن شيئين من الإجابة على نفس عنوان URL، أول واحد مسجل يفوز، ويسجل Nexy دائمًا بهذا الترتيب:

  1. نقطة نهاية الإجراءات؛
  2. الملفات الثابتة: /public، /assets، /favicon.ico؛
  3. معياري APIRouter (useRouter)؛
  4. مسارات الملفات، الأكثر تحديدًا أولاً: المسارات الثابتة، ثم المسارات الديناميكية ذات المقاطع الأكثر ثباتًا، ثم رسائل التقاط الرسائل الخاطئة.

يتم تسجيل مسارين للملفات متساويين في الخصوصية بترتيب المسار الأبجدي، لذلك يجيب [id].nexy قبل [slug].nexy. وبالتالي فإن المسار المعياري يتفوق على الصفحة التي لها نفس المسار. هذا هو ترتيب الأسبقية الذي يمكنك الاعتماد عليه، وليس قاعدة فاصلة للعب بها: أعط عنوان URL واحدًا وملفًا واحدًا.

نظام المشاهدة

يحدد امتداد الملف ما هو عليه، ويقرر تكوين المشروع الامتدادات النشطة.

ملحق نشط عندما تم تجميعها بواسطة بمثابة
.nexy وضع الخادم Nexy: تصبح المادة الأمامية Python، وتصبح العلامة Jinja2 صفحة
.md دائما Nexy: بنكهة GitHub Markdown، معرفات العناوين، جدول المحتويات صفحة، داخل أقرب تخطيط
.mdx دائما Vite، مع React أو Preact طريق مكون
.tsx useFF هو React، Solid أو Preact Vite والإطار طريق مكون
.vue useFF هو Vue Vite و Vue طريق مكون
.svelte useFF هو Svelte Vite و Svelte طريق مكون
.py دائما Python معالج API: GET، POST، ... هي الطرق

يتم تخطي الملف الذي لا يكون امتداده نشطًا مع تحذير، ولا يتم عرضه. في وضع العميل، يتم رفض .nexy قبل بدء تشغيل الخادم. انظر اصطلاحات الملفات.

دورة حياة العرض

ثلاثة أسئلة تقرر كل ما يلاحظه القارئ:

سؤال الإجابة الصفحة
من ينتج HTML؟ الخادم، أو المتصفح لمسار العميل التقديم
متى تتم قراءة البيانات؟ عند كل طلب، عند كل تجديد، أو في المتصفح SSR، ISR
متى يصل JavaScript؟ فقط لجزيرة، أو للوثيقة بأكملها الجزر، المسؤولية الاجتماعية للشركات

في وضع الخادم، يعرض الخادم كل صفحة، ويخزن revalidate صفحة واحدة مؤقتًا لكل عنوان URL، وتضيف الجزر JavaScript إلى مكون واحد. في وضع العميل، يتم عرض المستند الأول في Node ثم يتم التنقل في المتصفح.

__nexy__/ يحمل كل ما تم إنشاؤه: الصفحات المجمعة، وإدخال العميل، ومخرجات البناء. لا تقم بتحريره أبدًا، ولا تلتزم به أبدًا؛ احذفه لفرض بناء نظيف.

تكامل الواجهة الأمامية

Vite لا يحل محل Nexy. Vite يجمع ويخدم كود العميل. ولا يقوم بتوجيه طلب أو عرض صفحة .nexy أو تشغيل إجراء أو امتلاك الأصل. يتحدث المتصفح إلى أصل واحد - Nexy - وفي تطوير نقاط نهاية وكلاء Nexy Vite من خلاله، لذلك لا يوجد CORS لتكوينه.

Nexy لا يحل محل React. Nexy هو الذي يقرر أي مكون يتم عرضه، ومتى، وبأي دعم؛ يمتلك الإطار النموذج المكون والتفاعل والنظام البيئي. تستورد صفحة .nexy مكونًا كجزيرة؛ في وضع العميل، يكون المسار مكونًا.

بالنسبة لمسار المكون، يكتب Python فقط وحدة مجمعة رفيعة تشير إلى الملف. التجميع والعرض من جانب الخادم هما مهمة Vite.

التطوير والإنتاج

nx dev يتحقق من nexyconfig.py، ويجمع الصفحات، ويبدأ Vite عندما يكون للمشروع إطار عمل للواجهة الأمامية، ويعيد تشغيل الخادم عند الحفظ. nx build يقوم بنفس العمل مرة واحدة، قبل الموعد المحدد، و nx start يخدم النتيجة.

nx dev nx build ثم nx start
الصفحات تجميعها عند الحفظ جمعت مرة واحدة، في وقت مبكر
رمز العميل Vite خادم التطوير مع إعادة التحميل السريع، خلف أصل Nexy حزمة في __nexy__/client/، HTML معروض مسبقًا
Node.js يجري بجانب Python ليست هناك حاجة للخدمة
أخطاء تراكب في المتصفح، شريط الأدوات في كل صفحة صفحات الحالة بدون تفاصيل
الأصل منفذ واحد، 3000 منفذ واحد

ما لا يتغير: نفس قواعد التوجيه، نفس ملفات الصفحات، نفس nexyconfig.py. الصفحة التي تتصرف بشكل مختلف بين الاثنين هي خطأ وليست وضعًا.

ما يتركه لك Nexy

يتوقف Nexy عند حافة التطبيق الخاص بك، عن قصد:

قلق ما يقدمه نيكسي ما تكتبه
المصادقة الوسيطة للجلسة، AuthenticationMiddleware عند تمكينها تسجيل الدخول، بحث المستخدم، سياسة ملفات تعريف الارتباط
إذن dependencies.py، الحراس، الميراث لكل مجلد القاعدة نفسها
قاعدة البيانات لا يوجد ORM خاص به؛ nx new يمكن السقالة SQLModel، SQLAlchemy أو Tortoise، nx migrate يدير Alembic أو Aerich النماذج والاستعلامات (قواعد البيانات)
التدويل لا شيء لصفحاتك؛ تتم ترجمة CLI فقط المكتبة والرسائل (i18n)
وظائف الخلفية لا شيء: لا قائمة انتظار، لا جدولة عملية عاملة
البريد الإلكتروني، والمدفوعات، والبحث لا شيء الخدمة التي تختارها

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

الخطوات التالية

حرِّر على GitHub

Enter يفتح النتيجة، وEsc يغلق.