انتقل إلى المحتوى
TopClass UI

الخادم أولًا

أغلب المكوّنات تُعرض على الخادم ولا تضيف أي JavaScript. هذه هي، وهذا هو السبب.

الأنواع الثلاثة

كل مكوّن ينتمي إلى نوع من ثلاثة أنواع، ويظهر نوعه على الشارة بجانب اسمه.

النوع, الشارة, المعنى
النوعالشارةالمعنى
S - خادمserver - 0 KBيُعرض على الخادم. بلا خطّافات، ولا معالجات أحداث، ولا JavaScript في المتصفح
C - عميلclient - size not measured yetيحتاج إلى المتصفح: نافذة منبثقة، أو سحب، أو مستمع للوحة المفاتيح
Sp - مقسومsplit - 0 KB server + size not measured yetتُعرض البنية على الخادم، ويُرطَّب جزء صغير واحد فقط. يبقى Tag مكوّن خادم حتى تمرّر له onRemove

من بين 52 استيرادًا للمكوّنات اليوم: 19 للخادم، و13 مقسومة، و20 للعميل، مقروءة من ملف meta.ts لكل مكوّن.

ما الذي يمكن أن يعبر الحد

فقط ما يستطيع React تسلسله: النصوص والأرقام والقيم المنطقية والكائنات البسيطة والمصفوفات والعناصر الأبناء. لا تعبر الدالة الحد أبدًا، إلا إذا كانت إجراء خادم (Server Action).

خطأ
// app/page.tsx - a Server Component
<Command items={commands} getKey={(c) => c.id} getLabel={(c) => c.label} onSelect={run} />
// getKey, getLabel and onSelect are functions: they cannot cross
صواب
'use client'
// the file that configures a palette is a client file
import { Command } from 'topclassui/command'

export function Search({ commands }: { commands: { id: string, label: string }[] }) {
  return (
    <Command
      items={commands}
      getKey={(command) => command.id}
      getLabel={(command) => command.label}
      onSelect={(command) => { window.location.assign(`/docs/${command.id}`) }}
    />
  )
}

لماذا لا يحتوي index.tsx على خطّافات

البنية في index.tsx، والسلوك في hook.ts. لا يحتوي index.tsx أبدًا على 'use client'، ولا يستورد hook.ts. ويفرض ذلك فحصٌ أثناء البناء.

index.tsx
// index.tsx - server
import { useId } from 'react'   // allowed
import { use } from 'react'     // allowed

// anything else fails check-boundaries:
// useState, useEffect, useRef, useMemo, useCallback

الخطّافان الوحيدان اللذان يُسمح لمكوّن الخادم باستدعائهما.

كيف يعمل المكوّن المقسوم

يعرض نصف الخادم البنية، ويتولّى كل ما يحتاج إلى الخادم، مثل أسماء الأيقونات. ويضيف نصف العميل السلوك الوحيد المطلوب.

tag/index.tsx
// tag/index.tsx - server
export function Tag({ onRemove, children, ...rest }: TagProps) {
  if (onRemove) {
    return <Removable onRemove={onRemove} {...rest}>{children}</Removable> // the x is a client part
  }
  return <span {...rest}>{children}</span> // still server
}

كيف تُفحص الأحجام

لكل مكوّن ميزانية حجم. أما الفحص الذي يُفشل البناء عند تجاوز الميزانية فلم يُبنَ بعد.

تُظهر الشارات نوع كل مكوّن. وإلى أن يصدر أول بناء مقيس، تكتب شارة المكوّن العميل أو المقسوم "size not measured yet" بدل الرقم.

ما الذي يكلّفك

يأتي مبدأ الخادم أولًا ببعض القيود، وهذه هي القيود التي ستلاحظها.

لا يوجد onClick في مكوّن الخادم

الزر الذي يُعرض على الخادم يرسل نموذجًا أو يتبع رابطًا. وإن كان لا بد أن ينفّذ شيفرة في المتصفح، فمكانه ملف عميل.

لوحة الأوامر تحتاج إلى ملف عميل

getKey وgetLabel وonSelect دوال، لذا يجب إعداد Command في ملف يبدأ بـ 'use client'. أما Select وCombobox فيأخذان بيانات بسيطة ويُعرضان من ملف خادم.

بعض عناصر التحكم تنتظر الترطيب

ترسل Checkbox وSwitch وSelect قيمتها الافتراضية إلى أن يُحمَّل JavaScript. أما Input وTextarea فلا يحتاجان إلى JavaScript إطلاقًا.
التاليإمكانية الوصول