الوثائقاختلافات الإطار
Preact
يقوم Nexy بعرض Preact 10 مكونات على الخادم، ثم Preact يتولى إدارتها في المتصفح. الصفحات والتخطيطات والجزر والإجراءات هي نفسها في كل إطار: تغطي هذه الصفحة الإعداد، ثم الأجزاء التي تختلف عن العقود المشتركة.
باستخدام جهاز التوجيه المعياري، تكون مكونات Preact هي جزر داخل طرق العرض .nexy التي ترجعها وحدة التحكم: لا يوجد ملف صفحة ولا جهاز توجيه عميل.
ابدأ مشروعًا
nx new my-app --template web-fbr-preact
nx new my-app --template web-modular-preact
القالب عبارة عن مشروع في وضع الخادم يحتوي على Preact جزر. قم بتشغيل nx new my-app بدون قالب للإجابة على المطالبات بدلاً من ذلك: جهاز التوجيه، ونوع المشروع، وما إذا كان سيتم استخدام التوجيه من جانب العميل، ثم إطار العمل.
تمكين Preact في مشروع موجود
from nexy.core.models import NexyConfigModelfrom nexy.frontend import preact class NexyConfig(NexyConfigModel): useFF = preact() useAliases = {"@": "src"}import { defineConfig } from "vite";import preact from "@preact/preset-vite";import nexy from "./__nexy__/vite"; export default defineConfig({ plugins: [nexy(), preact()], customLogger: nexy.log(),});nx new يكتب هذا الملف؛ Nexy يكتب __nexy__/vite.ts نفسه، فلا تقم بتحريره.
| الحزمة | النسخة nx new يكتب |
|---|---|
preact |
^10.25.4 |
@preact/preset-vite |
^2.10.1 (تبعية التطوير) |
preact-render-to-string |
^6.7.0 (تبعية التطوير، يتم عرضها على الخادم) |
اكتب Preact
المكون Preact هو دالة بنمط التفاعل. الاختلافات المهمة هنا:
import { useState } from "preact/hooks"; export default function Counter({ start = 0 }: { start?: number }) { const [count, setCount] = useState(start); return <button class="counter" onClick={() => setCount(count + 1)}>{count}</button>;}- تأتي الخطافات من
preact/hooks، وأنواع مثلComponentChildrenمنpreact. - اكتب سمات HTML:
class،for،charset.Linkيقرأ فصوله منclass.
القواعد
- إطار واحد لكل مشروع.
useFFيأخذ إطارًا واحدًا بالضبط؛useFF = [preact(), react()]يوقف الخادم عند بدء التشغيل. معuseFF = preact()، كل.tsxملف هو Preact.
- الصفحات هي
.tsx. فقط ملف.tsxضمنsrc/routes/يصبح صفحة؛.jsxجيد بالنسبة للمكون. - تعيش المكونات خارج
src/routes/، عادةً فيsrc/components/، لذا فهي ليست صفحات. - لا يحتوي مشروع وضع الخادم على
.tsxصفحة، ولا يحتوي مشروع وضع العميل على.nexyصفحة: يرفض Nexy البدء ويسمي الملف. انظر الأوضاع.
- تعيش المكونات في
src/components/، ويقوم العرض باستيرادها كجزر.
- يتم استيراد صفحة
.mdxمن"preact". يقوم Nexy بتجميع ملف.mdxمع Preact فقط عندما يرى هذا الاستيراد، على سبيل المثالimport { h } from "preact"، ومع React بخلاف ذلك. انظر Markdown و MDX.
الصفحات
في وضع العميل (useCSR = True)، تكون الصفحة عبارة عن ملف .tsx.
مكون الصفحة
الصفحة هي التصدير الافتراضي للملف. في حالة عدم وجود تصدير افتراضي، يقوم Nexy باختيار أول عملية تصدير مسماة.
export default function Home() { return <h1>Hello</h1>;}القطاعات الديناميكية
تتوفر معلمات URL عبر الرابط useParams:
import { useParams } from "@nexy/client"; export default function Post() { const { slug } = useParams<{ slug: string }>(); return <h1>{slug}</h1>;}التخطيطات
التنفيذ
يحدد التخطيط الجذر غلاف المستند. تقوم التخطيطات المتداخلة بتغليف المحتوى.
import type { ComponentChildren } from "preact"; export default function RootLayout({ children }: { children: ComponentChildren }) { return ( <html> <body> <header>My app</header> <main>{children}</main> </body> </html> );}جزر
في وضع الخادم، يكون المكون Preact المستورد في ملف .nexy عبارة عن جزيرة.
استيراد
استيراد المكونات في الجزء الأمامي من الملف .nexy:
from "@/components/Counter.tsx" import Counter<Counter start=3 />from "@/components/Counter.tsx" import Counter<Counter start=3 />توجيهات الترطيب
استخدم الدعامة directive للتحكم في وقت ترطيب الجزيرة:
client:load(افتراضي): فورًاclient:idle: عندما يكون المتصفح خاملاًclient:visible: عند التمرير إلى العرضclient:media: عند تطابق استعلام الوسائط
الإجراءات والملاحة
إجراءات الدعوة
استخدم الخطاف useAction لإدارة حالة استدعاء الإجراء:
import { useAction } from "@nexy/client";import { add_todo } from "@nexy/actions"; const { run, pending, error, data } = useAction(add_todo);// ...<button onClick={() => run({ title: "New Task" })}>Add</button>
الملاحة
استخدم المكون Link للانتقالات من جانب العميل. لاحظ أن Preact يستخدم class بدلاً من className:
import { Link } from "@nexy/client"; <Link href="/about" class="nav" activeClassName="active">About</Link>
للتنقل البرمجي، استخدم الخطاف useRouter:
import { useRouter } from "@nexy/client"; const router = useRouter();router.push("/dashboard");
الوصول إلى URL
usePathname(): المسار الحاليuseParams(): المقاطع الديناميكيةuseSearchParams(): سلسلة الاستعلامuseLocation(): كائن الموقع الكامل
الخطوات التالية
- طرق العرض: قارن التنسيقات التي يمكن للصفحة استخدامها
- الواجهة الأمامية: Vite وبناء العميل