গাইড · 09
SSR, টেস্টিং আর প্রোডাকশন
সার্ভার রেন্ডারিং, হাইড্রেশন, টেস্ট আর এমন পরিষ্কারকরণের নিয়ম যার ওপর ভরসা করা যায়।
সার্ভার রেন্ডারিং
হুকের মান তার প্রাথমিক মান সার্ভার markup-এ রেন্ডার করে, আর হাইড্রেশনের পরে অ্যানিমেশন চলতে থাকে। React 18 ও নতুন সংস্করণ স্থির ভেরিয়েবল নামের জন্য useId ব্যবহার করে; React 16 আর 17-এর সার্ভারে একটি id দিন।
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>
);
}পুরোনো React-এ স্থির id
শুধু React 16 বা 17 দিয়ে সার্ভার রেন্ডারিংয়ে দরকার।
// 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আনমাউন্টে নিজেদের কন্ট্রোলার আর listener থামায়।useAnimated-এর factory-তে ঘোষিত কন্ট্রোলার আর ইনপুট নির্ভরতা বদলালে একসঙ্গে প্রতিস্থাপিত হয়।Animated.Keepচলে যাওয়া children-কে তাদের গতির পরে সরায়, আর নতুন pose বর্তমান অবস্থান থেকে বাধা দেয়।- React-এর বাইরে
bind,bindOutput,createTimelineআরcreateLayoutSceneস্পষ্টdisposeফেরত দেয়।
টেস্টিং
flushAnimatedUpdates() অপেক্ষমাণ আউটপুট সিঙ্ক্রোনাসভাবে প্রয়োগ করে, যাতে নির্ধারণমূলক টেস্ট DOM যাচাই করতে পারে।
import { flushAnimatedUpdates } from '@kkwaenggwari/animated';
act(() => progress.setValue(0.5));
flushAnimatedUpdates();
// Pending style writes are applied now; assert on the DOM.লেখা, অ্যাট্রিবিউট আর প্রপার্টি
useAnimated-এর ভেতরে output(target, mapping) স্টাইল, অ্যাট্রিবিউট, লেখা বা অবজেক্ট প্রপার্টি আউটপুটের মালিক। bindOutput একই ম্যাপিং সঙ্গে সঙ্গে জোড়ে আর flush ও dispose ফেরত দেয়।
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} />;