EduFlow

الوحدة 3 · المكوّنات

توثيق يقرؤه الناس فعلًا

18 دقراءة 4 داختر بحكمة

الدرس في لمحة

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

  1. 1تشريح صفحة المكوّن
  2. 2ولّد ما ينحرف، واكتب ما لا يمكن توليده
  3. 3التوثيق جزء من «المنجَز»

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

كان لموقع التوثيق الأول في Northwind 140 صفحة، وخط جميل، وقسم مبادئ استغرقت كتابته شهرًا. لكن التحليلات روت لنا قصة متواضعة: في صفحات المكوّنات كان وسيط مدّة الزيارة 38 ثانية. يصل الناس، ويمرّرون إلى أول كتلة كود، وينسخونها، ويغادرون. أما قسم المبادئ فكان متوسط زياراته تسعًا في الأسبوع، معظمها من فريقنا نحن.

هذا ليس تقصيرًا من القرّاء. المهندسون والمصمّمون يفتحون التوثيق في منتصف مهمّة ومعهم سؤال واحد: «هل هذا هو المكوّن الصحيح، وكيف أستخدمه؟». التوثيق الجيد يجيب عن ذلك في الشاشة الأولى، ويُبقي كل ما عداه على بُعد تمريرة واحدة.

تشريح صفحة المكوّن

كل صفحة مكوّن في Northwind تتبع الترتيب نفسه، فيتعلّم الناس أين ينظرون:

  1. وصف من سطر واحد لما وُجد المكوّن من أجله.
  2. متى تستخدمه، ومتى لا تستخدمه، مع روابط إلى البديل. «استخدم Dialog للقرارات التي توقف المهمّة الحالية. وللرسائل التي لا توقفها، استخدم Toast».
  3. المثال الأساسي: عرض حيّ للاستخدام الصحيح الأكثر شيوعًا، مع كود قابل للنسخ.
  4. أمثلة لكل variant ولكل حالة مهمّة، لكلٍّ منها كودها الخاص.
  5. إمكانية الوصول: سلوك لوحة المفاتيح، وما تعلنه قارئات الشاشة، وفصل بين ما يتولّاه المكوّن وما يجب أن يفعله الفريق بنفسه (مثل «يجب أن تعطي كل Dialog عنصر Dialog.Title»).
  6. إرشادات المحتوى: كيف تكتب التسميات والرسائل. «تسميات الأزرار تبدأ بفعل: Assign driver، لا Driver assignment».
  7. جدول الـ props، مولَّدًا من الكود.
  8. الحالة والتاريخ: مستقر أو beta أو deprecated؛ والإصدار الذي أُضيف فيه؛ وروابط إلى الـ changelog.

هذا الترتيب يتبع ما يحتاجه الناس تحت ضغط الوقت. القرار («هل أستخدم هذا؟») والمثال القابل للنسخ يأتيان أولًا؛ والمواد المرجعية تأتي أخيرًا.

ولّد ما ينحرف، واكتب ما لا يمكن توليده

جزءان في صفحة التوثيق يتقادمان أسرع من غيرهما: جداول الـ props وأمثلة الكود. وكلاهما يمكن أن يأتي من الكود. جداول الـ props تُولَّد من أنواع TypeScript. والأمثلة تأتي من الـ stories، وهي الملفات نفسها المستخدمة في التطوير والاختبارات البصرية. في Storybook، ملف الـ story الذي يحمل الوسم autodocs يحصل على صفحة توثيق مولَّدة فيها معاينة حيّة، وكود الـ story، وجدول controls مبني من الـ props الخاصة بالمكوّن:

Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react-vite';
import { Button } from './Button';

const meta = {
  component: Button,
  tags: ['autodocs'],
  args: { children: 'Assign driver' },
} satisfies Meta<typeof Button>;
export default meta;

type Story = StoryObj<typeof meta>;

export const Secondary: Story = {};
export const Primary: Story = { args: { variant: 'primary' } };
export const Danger: Story = { args: { variant: 'danger', children: 'Delete route' } };
export const Small: Story = { args: { size: 'sm' } };

ما لا يستطيع الكود توليده هو الحكم: متى تستخدم المكوّن، ومتى لا تستخدمه، وكيف تصوغ محتواه، ولماذا اتّخذ النظام قراراته. وهناك يذهب وقت الكتابة لدى فريق التوثيق.

التوثيق جزء من «المنجَز»

التوثيق الذي يُطلَق لاحقًا لا يُطلَق أبدًا. قالب الـ pull request لمكوّنات النظام في Northwind فيه قائمة فحص: stories لكل variant وكل حالة، وصفحة توثيق محدّثة، وقسم لإمكانية الوصول، وإدخال في الـ changelog. وأي تغيير في مكوّن بدونها لا يُدمج. ولأن التوثيق يعيش في المستودع نفسه مع المكوّنات، يُراجَع في الـ pull request نفسه ومن الأشخاص أنفسهم.

ثم عامل التوثيق كمنتج. تتابع Northwind ثلاث إشارات: عمليات البحث التي لا تعيد نتائج، والأسئلة المطروحة في قناة نظام التصميم على Slack، والصفحات التي ترتفع فيها نسبة المغادرة مباشرة بعد قسم «متى تستخدمه». كل سؤال متكرّر يصبح تغييرًا في التوثيق. وإن وصل السؤال نفسه ثلاث مرات، فمكان الإجابة هو الصفحة، لا سلسلة رسائل.

في التمرين تخطّط لإصلاحات التوثيق خلف إساءة استخدام حقيقية. وبهذا يكتمل قسم المكوّنات؛ وبعده تربط جانب التصميم بجانب الكود في النظام حتى يبقيا متزامنين.

أهم النقاط

  • يمسح الناس التوثيق بحثًا عن مثال قابل للنسخ وعن إجابة بنعم أو لا على سؤال «هل أستخدم هذا؟»، فضع هذين أولًا.
  • كل صفحة مكوّن تحتاج قسمَي «متى تستخدمه» و«متى لا تستخدمه»، مع روابط إلى البديل الصحيح.
  • ولّد جداول الـ props والأمثلة من الكود والـ stories حتى لا تنحرف؛ واكتب يدويًا فقط ما لا يستطيع الكود التعبير عنه.
  • التوثيق جزء من تعريف «المنجَز»، ويُطلَق في الـ pull request نفسه الذي يحمل تغيير المكوّن.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

تُظهر التحليلات أن معظم زوّار صفحة Button في Northwind يغادرون خلال 40 ثانية بعد نسخ أول مثال كود. ماذا تستنتج؟

السؤال 2 من 3

تستمرّ الفرق في استخدام زر Danger لإجراء «Remove filter»، وهو ليس إجراءً مدمّرًا. أيّ تغيير في التوثيق يساعد أكثر؟

السؤال 3 من 3

جدول props الخاص بـ Button في التوثيق يسرد prop باسم kind أُعيدت تسميته إلى variant قبل إصدارين. ما الإصلاح الدائم؟

تدريب

اختر بحكمة

أصلح التوثيق الكامن خلف إساءة استخدام

يشتكي موظّفو الـ dispatch من أن التطبيق يقاطعهم باستمرار: ست فرق صارت تفتح Dialog يوقف العمل ويقول «Route saved!» بعد كل حفظ. تفحص صفحة توثيق Dialog، فتجدها تبدأ بعرض حيّ لنافذة النجاح هذه بالضبط، يليه جدول props كامل. ولا يوجد أي إرشاد عن متى تستخدم Dialog ومتى تستخدم Toast. أيّ التغييرات ستجريها؟ اختر كل ما ينطبق.

أصلح التوثيق الكامن خلف إساءة استخدام