الأدلة · 09

SSR والاختبار والإنتاج

العرض على الخادم والإماهة والاختبارات وقواعد التنظيف التي يمكنك الاعتماد عليها.

العرض على الخادم

تعرض قيم الخطّافات قيمتها الأولية في علامات الخادم، وتستمر الحركة بعد الإماهة. يستخدم React 18 وما بعده useId لأسماء متغيّرات ثابتة؛ وعلى خوادم React 16 و17 مرّر id.

app/layout.jsx
import { AnimatedProvider } from '@kkwaenggwari/animated';

// The package entry is marked 'use client'. A server layout can render the
// provider directly; hooks and Animated.<tag> go inside Client Components.
export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <AnimatedProvider>{children}</AnimatedProvider>
      </body>
    </html>
  );
}

معرّفات id ثابتة في إصدارات React الأقدم

مطلوب فقط عند العرض على الخادم مع React 16 أو 17.

ssr.jsx
// React 18+ uses useId automatically. On React 16/17 servers, pass a stable id.
const progress = useAnimatedValue(0, { id: 'hero-progress' });

تنظيف يمكنك الاعتماد عليه

كل ما يملكه المكوّن يُحرَّر معه.

  • توقف useAnimated وuseAnimatedValue وuseTimeline وuseReorder متحكماتها ومستمعاتها عند الإزالة.
  • تُستبدل المتحكمات والمدخلات المعرّفة في دالة مصنع useAnimated معًا حين تتغيّر تبعية.
  • يزيل Animated.Keep الأبناء المغادرين بعد حركتهم، والوضعية الجديدة تقاطع من الموضع الحالي.
  • خارج React، تعيد bind وbindOutput وcreateTimeline وcreateLayoutScene دالة dispose صريحة.

الاختبار

يطبّق flushAnimatedUpdates() المخرجات المعلّقة بشكل متزامن كي تتمكن الاختبارات الحتمية من التحقق من DOM.

Meter.test.jsx
import { flushAnimatedUpdates } from '@kkwaenggwari/animated';

act(() => progress.setValue(0.5));
flushAnimatedUpdates();
// Pending style writes are applied now; assert on the DOM.

النصوص والسمات والخصائص

يمتلك output(target, mapping) داخل useAnimated مخرجًا إلى نمط أو سمة أو نص أو خاصية كائن. ويربط bindOutput التعيين نفسه فورًا ويعيد flush وdispose.

Counter.jsx
const label = useRef(null);

const count = useAnimated(
  0,
  (value) => {
    output(label, { text: new AnimatedComputed([value], (v) => `${Math.round(v * 100)}%`) });
    timing(value, { toValue: 1, duration: 1200 });
  },
  [],
);

<span ref={label} />;

بحث

اكتب للبحث في التوثيق.