سكربت الصفحة مش إطار
<script> جوّه .astro بيتجمع ويتحط type="module" ويتبعت مرة حتى لو المكوّن اتكرر. ده مكان القائمة البسيطة، تتبع النقرة، أو تشغيل عنصر من غير React.
<span id="n">٠</span><button id="add">زود</button><script> const btn = document.getElementById("add"); const n = document.getElementById("n"); let v = 0; btn?.addEventListener("click", () => { v += 1; if (n) n.textContent = String(v); });</script>لو المكوّن اتكرر في الصفحة، الـ id هيتكرر والسكربت هيمسك أول واحد بس. للجزر المتكررة استخدم مكوّن إطار، أو امسح الـ id ولف على العناصر بكلاس.
is:inline يسيّب السكربت زي ما هو: مش هيتجمع، ومش هيتمسح تكراره، ومينفعش يعمل import. مناسب لسكربت طرف تالت لازم يفضل سطره كما هو.
define:vars يمرّر قيم من السيرفر للسكربت. القيم لازم تتسلسل (نص، رقم، كائن بسيط). متبعتش دالة ولا عنصر DOM.
امتى الجزيرة تصحى
مكوّن React أو Vue أو Svelte من غير directive = HTML فقط. الـ directive يقول امتى الجافاسكربت ينزل ويصحّي المكوّن (hydration).
أول ما الصفحة تحمّل. للحاجة اللي فوق الطيّة ولازم تبقى حية فورًا: سلة ظاهرة، مشغّل.
بعد ما المتصفح يهدى. حاجة مهمة بس مش أول إطار: ودجت جانبي.
لما الجزيرة تدخل الشاشة. تعليق أو كاروسيل تحت. أحسن افتراضي للحاجات اللي مش ظاهرة.
لما شرط CSS يتحقق، زي (max-width: 700px) لقائمة الموبايل. الديسكتوب مينزّلش السكربت.
من غير رندر سيرفر. لازم تكتب الإطار: client:only="react". للحاجات اللي بتلمس window وقت الرندر الأول. الزائر هيشوف فراغ لحد ما الجافاسكربت ييجي، فحط ارتفاع ثابت عشان الصفحة متقفزش.
- السيرفر ← باقي الصفحة: HTML
- السيرفر ← السلة: HTML + JS
التركيب: pnpm astro add react (أو vue أو svelte أو solid أو preact). الأمر بيسطّب الحزمة ويكتب التكامل في الكونفج. الـ props اللي بتعدّي للجزيرة لازم تتسلسل JSON. مفيش دوال ولا كلاس.
---import Cart from "../components/Cart.jsx";---<h1>المنيو</h1><Cart client:visible dish="كشري" price={25} />حالة بين جزيرتين
كل جزيرة بتصحى لوحدها. مش بيشاركوا state زي شجرة React واحدة. لو السلة والعداد محتاجين نفس الرقم، إما تجمعهم في جزيرة واحدة، أو مكتبة حالة صغيرة بتشتغل بره الإطار (زي nanostores) يقرأوا منها الاتنين. متصحّيش الصفحة كلها عشان زرارين يتكلموا.
خلّصت الفصل لما
١) مكوّن React من غير client: هيوصل للمتصفح جافاسكربت؟
٢) قائمة الموبايل بس اللي محتاجة JS. أنهي directive؟
client:media بشرط عرض الموبايل.٣) السكربت المجمّع بيتبعت كام مرة لو المكوّن اتكرر؟
getElementById جواه خطر لو النسخ كتير.