انتقل إلى المحتوى
مساحة عربية للمعرفة والأدوات اليوميةتعرّف على مواضيع
البرمجة

منحنى بيزيه وحركات جافاسكربت

أبلغ عن هذا المحتوى
في هذه الصفحة
  1. مقدمة
  2. 1. الأساس الرياضي لمنحنيات بيزيه
  3. 2. منحنيات بيزيه في رسومات الحاسوب
  4. 3. جافاسكربت ومنحنيات بيزيه: الأساسيات
  5. 4. منحنيات بيزيه بوصفها دوال تسهيل Easing Functions
  6. 5. تقنيات متقدمة للتحريك باستخدام منحنيات بيزيه في جافاسكربت
  7. 6. الاعتبارات الأمنية والأداء في المتصفح
  8. 7. منهجية تحسين محركات البحث (SEO) للمحتوى الرسومي التفاعلي
  9. 8. دراسة حالة: إنشاء مشهد تفاعلي باستخدام Canvas
  10. خاتمة
  11. المصادر والمراجع

منحنى بيزيه وأهميته في الرسوميات وصناعة الحركات في جافاسكربت

مقدمة

ظهر منحنى بيزيه Bézier Curve لأول مرة في ستينيات القرن الماضي بفضل المهندس الفرنسي بيير بيزيه الذي كان يعمل لدى شركة «رينو» لصناعة السيارات. كان الهدف الأساسي من تطوير هذا المنحنى وصف أشكال هيكل السيارة رياضيًّا بطريقة تسمح للحواسيب—التي كانت ما تزال محدودة القدرات آنذاك—بإعادة إنتاج الانحناءات بسلاسة ودقة. سرعان ما تجاوز المفهوم مجال التصميم الصناعي، ليصبح حجر الزاوية في رسومات الحاسوب Computer Graphics، ويتحول اليوم إلى مكوّن لا غنى عنه في عالم واجهات الويب وصناعة الحركات Animation عبر جافاسكربت.


1. الأساس الرياضي لمنحنيات بيزيه

1.1 تعريف المنحنى

منحنى بيزيه هو دالة رياضية تُمثَّل عادةً بواسطة نقاط تحكُّم Control Points، ويتحدد شكل المنحنى من خلال التوليف الخطي بين هذه النقاط وفق حدود كثيرة الحدود من الدرجة n. يُقسَّم المنحنى إلى ثلاثة أنواع رئيسة بحسب درجة التعددية (Polynomial Degree):

  • منحنى خطي (درجة أولى): يربط خطًّا مستقيمًا بين نقطتين.

  • منحنى تربيعي (درجة ثانية): يعتمد على ثلاث نقاط تحكّم.

  • منحنى تكعيبي (درجة ثالثة): يعتمد على أربع نقاط تحكّم، وهو الأكثر شيوعًا لما يتميز به من ليونة وسهولة السيطرة.

1.2 معادلة بيرنشتاين Bernstein Form

يُعبَّر عن منحنى بيزيه التكعيبي عادة بالصيغة:

B(t)=∑i=03(3i)(1−t)3−itiPi,    0≤t≤1B(t)=\sum_{i=0}^{3} {3 \choose i}(1-t)^{3-i}t^{i}P_i,\; \; 0\le t\le 1

حيث P0,P1,P2,P3P_0, P_1, P_2, P_3 هي نقاط التحكّم، وtt هو متغير يُسرَد من 0 إلى 1. تمنح هذه الصيغة المنحنى خصائص هندسية منها:

  • التلاصق القوي بالنقاط الطرفية P0,P3P_0, P_3.

  • التماسك الداخلي: يقع المنحنى دائمًا داخل المضلّع المحدد بنقاط التحكّم Convex Hull.

  • القابلية للتفريع: يمكن تقسيم المنحنى إلى مقاطع فرعية بمنتهى البساطة باستخدام خوارزمية ديكاستليجو De Casteljau.

1.3 خوارزمية ديكاستليجو

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


2. منحنيات بيزيه في رسومات الحاسوب

2.1 دورها في النمذجة Modeling

تستثمر برامج التصميم ثنائية وثلاثية الأبعاد (مثل Adobe Illustrator وBlender) منحنيات بيزيه لصياغة الأشكال المعقّدة بدءًا من الشعارات وصولًا إلى الأسطح العضوية. تسمح قابلية ترتيب الدرجات والتحكم في النقاط للمصممين بتصحيح الانحناءات دون تشويه بقية الشكل.

2.2 Rasterization مقابل Vectorization

في النظم المتجهة Vector Graphics، يُخزَّن الشكل كبيانات هندسية (نقاط تحكّم)، بينما في النظم النقطية Raster Graphics يتم تحويل المنحنى إلى مجموعة بكسلات. يمنح التمثيل المتجه مزيّة تكبير غير محدود بدون فقدان دقة، وهذا يفسر اعتماد صيغ مثل SVG على منحنيات بيزيه باعتبارها الوحدة البنائية الأساسية.

2.3 تحسين الأداء Rendering Performance

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


3. جافاسكربت ومنحنيات بيزيه: الأساسيات

3.1 واجهات برمجية للمتصفح

  • Canvas 2D API: توفِّر الدالة context.bezierCurveTo() وسيلة مباشرة لرسم المنحنيات التكعيبية.

  • WebGL: يتطلب تمرير نقاط التحكّم إلى الشادر Shader، وتقييم المنحنى غالبًا في الشادر أو عبر خوارزمية التقسيم على CPU.

  • SVG DOM API: تُمثَّل المنحنيات بخاصية d في عنصر باستخدام الأوامر C (تكعيبي) وQ (تربيعي).

3.2 مكتبات شهيرة

المكتبة الاستخدام الرئيس الميزة البارزة حجم الحزمة تقريبًا
D3.js رسومات بيانية وتفاعلية تجميع منحنيات بسهولة في المكونات البيانية 200 KB
GreenSock (GSAP) تحريك عناصر DOM وSVG منحنى تسهيل Ease بسيط عبر CustomEase 50 KB
Paper.js رسم متجهي احترافي على Canvas واجهة كائنية لمنحنيات بيزيه مع أدوات Boolean 160 KB
Two.js رسوميات متجهة سلسة ثنائية الأبعاد محرك تحريك مبني على طلب الإطار 70 KB

4. منحنيات بيزيه بوصفها دوال تسهيل Easing Functions

4.1 مفهوم التسهيل

في الرسوم المتحركة، يُقصَد بالتسهيل ضبط السرعة المتغيّرة للحركة بحيث تعكس واقعية فيزيائية؛ مثال ذلك التسارع في البداية والتباطؤ قرب النهاية. توفر جافاسكربت دوال جاهزة مثل ease-in, ease-out, لكن منحنى بيزيه يسمح بتصميم دوال مخصّصة تلائم سيناريوات محددة.

4.2 توصيف دالة التسهيل عبر CSS

تقبل خاصية transition-timing-function صيغة cubic-bezier(x1, y1, x2, y2) حيث تمثل القيم إحداثيات نقطتي التحكّم الداخلية، بينما تبدأ وتنتهي الدالة بـ(0,0) و(1,1). يمنح هذا المصمم تحكمًا كاملًا في وتيرة الحركة دون الحاجة لأي جافاسكربت إضافي.

4.3 التكامل مع GSAP

js
import { CustomEase } from "gsap/CustomEase"; CustomEase.create("squishJump", "M0,0 C0.22,1.1 0.32,-0.1 1,1"); gsap.to(".ball", { y: -200, ease: "squishJump" });

يُشاهد هنا كيف حُوّلت مسار SVG مباشرة إلى دالة تسهيل بالشكل الذي يختصر الأكواد ويمنح نتائج دقيقة.


5. تقنيات متقدمة للتحريك باستخدام منحنيات بيزيه في جافاسكربت

5.1 مسارات الحركة Motion Paths

خصائص CSS مثل offset-path: path("M10 80 C 40 10, 65 10, 95 80"); تتيح تحريك عنصر DOM حول مسار بيزيه دون حساب الموضع يدويًا في كل لقطة إطار. تدعم جافاسكربت استعلام التقدم Progress وموضع العنصر بهدف مزامنة مؤثرات أخرى مثل دوران العنصر أو تغيير الخلفية.

5.2 التحريك التفاضلي Differential Animation

تُستخدم خوارزمية ديكاستليجو لتقسيم مسار معقّد إلى مقاطع صغيرة وتعيين توقيت غير خطي لكل مقطع، ما يسمح بتسريع جزء من المسار وإبطاء جزء آخر. يُنفّذ ذلك عادة في مكتبات مثل Anime.js عبر خاصية timeline.

5.3 الدمج مع الفيزياء Physics Integration

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


6. الاعتبارات الأمنية والأداء في المتصفح

6.1 الحد من استهلاك الذاكرة

رسم آلاف المنحنيات في إطار واحد قد يسبب ارتفاع استهلاك الذاكرة. من الأفضل إعادة استخدام Path2D أو تخزين المسارات كـ string في SVG واستخدام الخصائص CSS للتحريك، إذ يتم حساب المنحنى داخل محرك المتصفح المكتوب بلغة C++ والأكثر كفاءة.

6.2 التسريع العتادي Hardware Acceleration

عند استخدام transform: translate3d() بدل left/top، يُدفع العنصر إلى طبقة مركبة Composited Layer ما يتيح للـ GPU تسريع الحسابات الهندسية لمنحنيات بيزيه. هذا مفيد خاصة في الأجهزة المحمولة حيث تكون وحدة المعالجة محدودة.

6.3 إمكانية الوصول Accessibility

قد تسبب الحركة المبالغ فيها إزعاج بعض مستخدمي الويب. ينبغي احترام تفضيل النظام prefers-reduced-motion وإيقاف التسهيلات القائمة على بيزيه عند الحاجة:

js
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)"); if (reduce.matches) gsap.set(".animated", { clearProps: "all" });

7. منهجية تحسين محركات البحث (SEO) للمحتوى الرسومي التفاعلي

  1. العنونة الدلالية: استخدم سمات aria-label لوصف مسارات SVG.

  2. النص البديل: أضف role="img" و</code> داخل <code data-start="7026" data-end="7033"><svg></code> لشرح محتوى المنحنى لمحركات البحث.</p> </li> <li data-start="7070" data-end="7217" class="" style=""> <p data-start="7073" data-end="7217" class=""><strong data-start="7073" data-end="7091">أولوية التحميل</strong>: تأكد من تحميل ملفات JS وSVG بطريقة غير حاجبة للمحتوى (Deferred or Async) لتقليل زمن العرض الأولي Largest Contentful Paint.</p> </li> <li data-start="7218" data-end="7347" class="" style=""> <p data-start="7221" data-end="7347" class=""><strong data-start="7221" data-end="7240">الاتساق البنيوي</strong>: قسم المقال إلى ترويسات H2 وH3 وتجنب التكرار؛ هذه الاستراتيجية تعزز الفهرسة وتطيل مدة التصفح Dwell Time.</p> </li> </ol> <hr data-start="7349" data-end="7352" class="" style=""> <h2 data-start="7354" data-end="7407" class="" id="mwx-section-26">8. دراسة حالة: إنشاء مشهد تفاعلي باستخدام Canvas</h2> <h3 data-start="7409" data-end="7428" class="" id="mwx-section-27">8.1 المتطلبات</h3> <ul data-start="7429" data-end="7571"> <li data-start="7429" data-end="7498" class="" style=""> <p data-start="7431" data-end="7498" class="">كرة تتحرك داخل إطار وتتغير سرعتها استنادًا إلى اصطدامها بالجدران.</p> </li> <li data-start="7499" data-end="7571" class="" style=""> <p data-start="7501" data-end="7571" class="">حركة الكاميرا Smooth Camera Panning عند اقتراب الكرة من حافة الإطار.</p> </li> </ul> <h3 data-start="7573" data-end="7593" class="" id="mwx-section-28">8.2 الخوارزمية</h3> <ol data-start="7594" data-end="7808"> <li data-start="7594" data-end="7651" class="" style=""> <p data-start="7597" data-end="7651" class="">نمذجة المسار عبر منحنى بيزيه تكعيبي يمثل الانعطافات.</p> </li> <li data-start="7652" data-end="7717" class="" style=""> <p data-start="7655" data-end="7717" class="">تقسيم المسار إلى نقاط مرجعية Keyframes بنسبة ثابتة في الزمن.</p> </li> <li data-start="7718" data-end="7808" class="" style=""> <p data-start="7721" data-end="7808" class="">عند كل تصادم، تُولد دالة تسهيل جديدة لتغيير السرعة والاتجاه بناءً على زاوية الارتداد.</p> </li> </ol> <h3 data-start="7810" data-end="7833" class="" id="mwx-section-29">8.3 الكود المختصر</h3> <pre class="overflow-visible!" data-start="7834" data-end="8164"><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">js</div><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Copy"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-xs"><path fill-rule="evenodd" clip-rule="evenodd" d="M7 5C7 3.34315 8.34315 2 10 2H19C20.6569 2 22 3.34315 22 5V14C22 15.6569 20.6569 17 19 17H17V19C17 20.6569 15.6569 22 14 22H5C3.34315 22 2 20.6569 2 19V10C2 8.34315 3.34315 7 5 7H7V5ZM9 7H14C15.6569 7 17 8.34315 17 10V15H19C19.5523 15 20 14.5523 20 14V5C20 4.44772 19.5523 4 19 4H10C9.44772 4 9 4.44772 9 5V7ZM5 9C4.44772 9 4 9.44772 4 10V19C4 19.5523 4.44772 20 5 20H14C14.5523 20 15 19.5523 15 19V10C15 9.44772 14.5523 9 14 9H5Z" fill="currentColor"></path></svg>Copy</button><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-xs"><path d="M2.5 5.5C4.3 5.2 5.2 4 5.5 2.5C5.8 4 6.7 5.2 8.5 5.5C6.7 5.8 5.8 7 5.5 8.5C5.2 7 4.3 5.8 2.5 5.5Z" fill="currentColor" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.66282 16.5231L5.18413 19.3952C5.12203 19.7678 5.09098 19.9541 5.14876 20.0888C5.19933 20.2067 5.29328 20.3007 5.41118 20.3512C5.54589 20.409 5.73218 20.378 6.10476 20.3159L8.97693 19.8372C9.72813 19.712 10.1037 19.6494 10.4542 19.521C10.7652 19.407 11.0608 19.2549 11.3343 19.068C11.6425 18.8575 11.9118 18.5882 12.4503 18.0497L20 10.5C21.3807 9.11929 21.3807 6.88071 20 5.5C18.6193 4.11929 16.3807 4.11929 15 5.5L7.45026 13.0497C6.91175 13.5882 6.6425 13.8575 6.43197 14.1657C6.24513 14.4392 6.09299 14.7348 5.97903 15.0458C5.85062 15.3963 5.78802 15.7719 5.66282 16.5231Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M14.5 7L18.5 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>Edit</button></span></div></div></div><div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-js"><span><span><span class="hljs-keyword">const</span></span><span> ctx = canvas.</span><span><span class="hljs-title function_">getContext</span></span><span>(</span><span><span class="hljs-string">"2d"</span></span><span>); </span><span><span class="hljs-keyword">const</span></span><span> P = [p0, p1, p2, p3]; </span><span><span class="hljs-comment">// نقاط التحكّم</span></span><span> </span><span><span class="hljs-keyword">let</span></span><span> t = </span><span><span class="hljs-number">0</span></span><span>, dir = </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-keyword">function</span></span><span> </span><span><span class="hljs-title function_">update</span></span><span>(</span><span><span class="hljs-params">dt</span></span><span>) { t += dir * dt * speed; </span><span><span class="hljs-keyword">if</span></span><span> (t > </span><span><span class="hljs-number">1</span></span><span> || t < </span><span><span class="hljs-number">0</span></span><span>) { dir *= -</span><span><span class="hljs-number">1</span></span><span>; t = </span><span><span class="hljs-title class_">Math</span></span><span>.</span><span><span class="hljs-title function_">max</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-title class_">Math</span></span><span>.</span><span><span class="hljs-title function_">min</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, t)); } </span><span><span class="hljs-keyword">const</span></span><span> pos = </span><span><span class="hljs-title function_">deCasteljau</span></span><span>(P, t); </span><span><span class="hljs-title function_">drawBall</span></span><span>(pos); </span><span><span class="hljs-title function_">requestAnimationFrame</span></span><span>(update); } </span><span><span class="hljs-title function_">update</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>/</span><span><span class="hljs-number">1000</span></span><span>); </span></span></code></div></div></pre> <p data-start="8165" data-end="8279" class="">تقتصر الحسابات في كل إطار على تقييم المنحنى مرة واحدة، ما يضمن انخفاض استهلاك المعالج حتى على أجهزة منخفضة الكلفة.</p> <hr data-start="8281" data-end="8284" class=""> <h2 data-start="8286" data-end="8296" class="" id="mwx-section-30">خاتمة</h2> <p data-start="8297" data-end="8844" class="">أثبت منحنى بيزيه عبر أكثر من نصف قرن أنه أداة رياضية وهندسية تتجاوز الحدود التقليدية بين الفن والعلم، ليصبح العمود الفقري لرسومات الحاسوب الحديثة والمحرك الأساس وراء التدفقات الحركية النابضة بالحياة على الويب. بفضل التكامل العميق مع جافاسكربت وتقنيات الويب المفتوحة، يستطيع المطوّر اليوم تصميم تجارب غامرة وفعّالة تقنيًّا تُحاكي جودة الأفلام الرسومية من دون الحاجة إلى معدات باهظة أو برمجيات احتكارية. يبقى منحنى بيزيه خيارًا ذهبيًّا لأي مشروع يستهدف الدقة الهندسية والجمال البصري في آنٍ معًا، سواء كان شعارًا بسيطًا أو نظام حركة تفاعليًّا معقدًا.</p> <hr data-start="8846" data-end="8849" class=""> <h2 data-start="8851" data-end="8872" class="" id="mwx-section-31">المصادر والمراجع</h2> <ol data-start="8873" data-end="9048" data-is-last-node="" data-is-only-node=""> <li data-start="8873" data-end="8953" class=""> <p data-start="8876" data-end="8953" class="">Farin, G. <em data-start="8886" data-end="8943">Curves and Surfaces for Computer-Aided Geometric Design</em> (2014).</p> </li> <li data-start="8954" data-end="9048" class=""> <p data-start="8957" data-end="9048" class="">McNeill, B. <em data-start="8969" data-end="9030">SVG Essentials: Producing Scalable Vector Graphics with XML</em> (O’Reilly, 2023).</p> </li> </ol> </div> </div> </div> </div> <div class="mwx-article-help"><span>معلومة تحتاج إلى تصحيح؟ حدّد الجملة وأرسل بلاغًا واضحًا.</span><a class="mwr-report-button" href="https://mwade3.com/report/?post=3035368" data-report-post="3035368"><span aria-hidden="true">⚑</span> أبلغ عن هذا المحتوى</a></div> </article> <aside class="mwx-reading-sidebar" aria-label="استكشف الموقع"><div class="mwx-side-box"><span class="mwx-eyebrow">دليلك في مواضيع</span><h2>مساحة لكلّ اهتمام.</h2><p>انتقل إلى مجال جديد، أو أكمل القراءة في موضوع تحبّه.</p><a class="mwx-button" href="https://mwade3.com/categories/">اكتشف المجالات <svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a></div><nav class="mwx-side-toc" aria-label="محتويات الصفحة"><h2>في هذه الصفحة</h2><a href="#mwx-section-1">مقدمة</a><a href="#mwx-section-2">1. الأساس الرياضي لمنحنيات بيزيه</a><a href="#mwx-section-6">2. منحنيات بيزيه في رسومات الحاسوب</a><a href="#mwx-section-10">3. جافاسكربت ومنحنيات بيزيه: الأساسيات</a><a href="#mwx-section-13">4. منحنيات بيزيه بوصفها دوال تسهيل Easing Functions</a><a href="#mwx-section-17">5. تقنيات متقدمة للتحريك باستخدام منحنيات بيزيه في جافاسكربت</a><a href="#mwx-section-21">6. الاعتبارات الأمنية والأداء في المتصفح</a><a href="#mwx-section-25">7. منهجية تحسين محركات البحث (SEO) للمحتوى الرسومي التفاعلي</a><a href="#mwx-section-26">8. دراسة حالة: إنشاء مشهد تفاعلي باستخدام Canvas</a><a href="#mwx-section-30">خاتمة</a><a href="#mwx-section-31">المصادر والمراجع</a></nav><nav class="mwx-side-links" aria-label="روابط مفيدة"><h2>روابط مفيدة</h2><a href="https://mwade3.com/about-us/">من نحن<svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a><a href="https://mwade3.com/contact-us/">تواصل معنا<svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a><a href="https://mwade3.com/faq/">الأسئلة الشائعة<svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a><a href="https://mwade3.com/info/">دليل الموقع والسياسات<svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a></nav></aside> </div> <section class="mwx-section mwx-related"><div class="mwx-section-heading"><div><span class="mwx-eyebrow">أكمل الاستكشاف</span><h2>قد تحب أن تقرأ أيضًا</h2></div></div><div class="mwx-cards"> <article class="mwx-card "> <a class="mwx-card-art mwx-tone-technology" href="https://mwade3.com/%d8%a5%d9%86%d8%b4%d8%a7%d8%a1-%d9%85%d8%af%d9%88%d9%86%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-node-js/" tabindex="-1" aria-hidden="true"> <img width="768" height="547" src="https://mwade3.com/wp-content/uploads/logo-768x547.png" class="mwx-card-image" alt="" decoding="async" srcset="https://mwade3.com/wp-content/uploads/logo-768x547.png 768w, https://mwade3.com/wp-content/uploads/logo-300x214.png 300w, https://mwade3.com/wp-content/uploads/logo.png 1008w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="mwx-card-copy"> <a class="mwx-kicker" href="https://mwade3.com/category/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9/">البرمجة</a> <h2><a href="https://mwade3.com/%d8%a5%d9%86%d8%b4%d8%a7%d8%a1-%d9%85%d8%af%d9%88%d9%86%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-node-js/">إنشاء مدونة باستخدام Node.js</a></h2> <p>إنشاء مدوّنة باستخدام Node.js وExpress (الجزء الأول) في عصر التطور التكنولوجي المتسارع، أصبحت منصات التدوين ال…</p> <div class="mwx-card-bottom"><button class="mwx-save-button mwx-save-compact" type="button" disabled data-save-id="3153372" data-save-title="إنشاء مدونة باستخدام Node.js" data-save-url="https://mwade3.com/%d8%a5%d9%86%d8%b4%d8%a7%d8%a1-%d9%85%d8%af%d9%88%d9%86%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-node-js/" aria-pressed="false" aria-label="حفظ للقراءة لاحقًا: إنشاء مدونة باستخدام Node.js"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4Z"/></svg><span>حفظ للقراءة</span></button><time datetime="2025-06-11T10:08:09+03:00">11 يونيو 2025</time><a href="https://mwade3.com/%d8%a5%d9%86%d8%b4%d8%a7%d8%a1-%d9%85%d8%af%d9%88%d9%86%d8%a9-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-node-js/" aria-label="اقرأ: إنشاء مدونة باستخدام Node.js"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a></div> </div> </article> <article class="mwx-card "> <a class="mwx-card-art mwx-tone-technology" href="https://mwade3.com/%d8%aa%d8%ad%d9%88%d9%8a%d9%84-html-%d8%a5%d9%84%d9%89-%d9%82%d8%a7%d9%84%d8%a8-%d9%88%d9%88%d8%b1%d8%af%d8%a8%d8%b1%d9%8a%d8%b3/" tabindex="-1" aria-hidden="true"> <img width="768" height="547" src="https://mwade3.com/wp-content/uploads/logo-768x547.png" class="mwx-card-image" alt="" decoding="async" srcset="https://mwade3.com/wp-content/uploads/logo-768x547.png 768w, https://mwade3.com/wp-content/uploads/logo-300x214.png 300w, https://mwade3.com/wp-content/uploads/logo.png 1008w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="mwx-card-copy"> <a class="mwx-kicker" href="https://mwade3.com/category/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9/">البرمجة</a> <h2><a href="https://mwade3.com/%d8%aa%d8%ad%d9%88%d9%8a%d9%84-html-%d8%a5%d9%84%d9%89-%d9%82%d8%a7%d9%84%d8%a8-%d9%88%d9%88%d8%b1%d8%af%d8%a8%d8%b1%d9%8a%d8%b3/">تحويل HTML إلى قالب ووردبريس</a></h2> <p>مقدمة إلى تطوير قوالب ووردبريس: تحويل صفحة HTML إلى قالب ووردبريس يشكل ووردبريس أحد أكثر أنظمة إدارة المحتوى ا…</p> <div class="mwx-card-bottom"><button class="mwx-save-button mwx-save-compact" type="button" disabled data-save-id="3153351" data-save-title="تحويل HTML إلى قالب ووردبريس" data-save-url="https://mwade3.com/%d8%aa%d8%ad%d9%88%d9%8a%d9%84-html-%d8%a5%d9%84%d9%89-%d9%82%d8%a7%d9%84%d8%a8-%d9%88%d9%88%d8%b1%d8%af%d8%a8%d8%b1%d9%8a%d8%b3/" aria-pressed="false" aria-label="حفظ للقراءة لاحقًا: تحويل HTML إلى قالب ووردبريس"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4Z"/></svg><span>حفظ للقراءة</span></button><time datetime="2025-06-11T10:03:35+03:00">11 يونيو 2025</time><a href="https://mwade3.com/%d8%aa%d8%ad%d9%88%d9%8a%d9%84-html-%d8%a5%d9%84%d9%89-%d9%82%d8%a7%d9%84%d8%a8-%d9%88%d9%88%d8%b1%d8%af%d8%a8%d8%b1%d9%8a%d8%b3/" aria-label="اقرأ: تحويل HTML إلى قالب ووردبريس"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a></div> </div> </article> <article class="mwx-card "> <a class="mwx-card-art mwx-tone-technology" href="https://mwade3.com/%d8%aa%d9%86%d8%b8%d9%8a%d9%85-%d8%a7%d9%84%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d9%81%d9%8a-javascript/" tabindex="-1" aria-hidden="true"> <img width="768" height="547" src="https://mwade3.com/wp-content/uploads/logo-768x547.png" class="mwx-card-image" alt="" decoding="async" srcset="https://mwade3.com/wp-content/uploads/logo-768x547.png 768w, https://mwade3.com/wp-content/uploads/logo-300x214.png 300w, https://mwade3.com/wp-content/uploads/logo.png 1008w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="mwx-card-copy"> <a class="mwx-kicker" href="https://mwade3.com/category/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9/">البرمجة</a> <h2><a href="https://mwade3.com/%d8%aa%d9%86%d8%b8%d9%8a%d9%85-%d8%a7%d9%84%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d9%81%d9%8a-javascript/">تنظيم الشيفرة في JavaScript</a></h2> <p>تصميم النّصوص البرمجيّة: تنظيم JavaScript يُعدُّ تنظيم النصوص البرمجية في JavaScript من الركائز الأساسية التي…</p> <div class="mwx-card-bottom"><button class="mwx-save-button mwx-save-compact" type="button" disabled data-save-id="3153329" data-save-title="تنظيم الشيفرة في JavaScript" data-save-url="https://mwade3.com/%d8%aa%d9%86%d8%b8%d9%8a%d9%85-%d8%a7%d9%84%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d9%81%d9%8a-javascript/" aria-pressed="false" aria-label="حفظ للقراءة لاحقًا: تنظيم الشيفرة في JavaScript"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4Z"/></svg><span>حفظ للقراءة</span></button><time datetime="2025-06-11T09:59:03+03:00">11 يونيو 2025</time><a href="https://mwade3.com/%d8%aa%d9%86%d8%b8%d9%8a%d9%85-%d8%a7%d9%84%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d9%81%d9%8a-javascript/" aria-label="اقرأ: تنظيم الشيفرة في JavaScript"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H4m6-6-6 6 6 6"/></svg></a></div> </div> </article> </div></section> </main> <footer class="mwx-footer"> <div class="mwx-container mwx-footer-grid"> <div class="mwx-footer-brand"><a class="mwx-brand" href="https://mwade3.com/"><span class="mwx-brand-mark" aria-hidden="true"><svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v16M12 5C9 3 5 3 2 4v15c4-1 7-1 10 2 3-3 6-3 10-2V4c-3-1-7-1-10 1Z"/></svg></span><span><strong>مواضيع<span class="mwx-brand-dot">.</span></strong><small>كل قراءة، فكرة جديدة</small></span></a><p>معرفة وأدوات تساعدك في يومك.<br>اقرأ، جرّب، ورتّب ما يهمك.</p></div> <nav aria-label="استكشف مواضيع"><h2>استكشف</h2><a href="https://mwade3.com/tools/">أدوات مواضيع</a><a href="https://mwade3.com/paths/">مسارات الاستكشاف</a><a href="https://mwade3.com/library/">مكتبتي</a><a href="https://mwade3.com/">الرئيسية</a><a href="https://mwade3.com/categories/">المجالات والتصنيفات</a><a href="https://mwade3.com/last/">آخر المواضيع</a><a href="https://mwade3.com/faq/">الأسئلة الشائعة</a></nav> <nav aria-label="عن الموقع"><h2>عن مواضيع</h2><a href="https://mwade3.com/weather/">الطقس</a><a href="https://mwade3.com/today/">التاريخ والمناسبات</a><a href="https://mwade3.com/about-us/">من نحن</a><a href="https://mwade3.com/%d9%85%d8%a8%d8%a7%d8%af%d8%a6-%d8%a7%d9%84%d9%86%d8%b4%d8%b1-%d9%81%d9%8a-%d9%85%d9%86%d8%b5%d8%a9-%d9%85%d9%88%d8%a7%d8%b6%d9%8a%d8%b9/">مبادئ النشر</a><a href="https://mwade3.com/contact-us/">تواصل معنا</a><a href="https://mwade3.com/report/">الإبلاغ عن محتوى</a></nav> <nav aria-label="السياسات والحقوق"><h2>السياسات والحقوق</h2><a href="https://mwade3.com/privacy/">سياسة الخصوصية</a><a href="https://mwade3.com/cookies/">ملفات تعريف الارتباط</a><button type="button" class="mwx-footer-privacy" data-mwc-open-preferences>خيارات الخصوصية</button><a href="https://mwade3.com/terms/">شروط الاستخدام</a><a href="https://mwade3.com/info/">جميع السياسات والمعلومات</a></nav> </div> <div class="mwx-container mwx-footer-bottom"><span>© 2026 مواضيع. جميع الحقوق محفوظة.</span><a href="https://mwade3.com/contact-us/">تواصل معنا من الموقع <svg class="mwx-icon " viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 6 9 7 9-7"/></svg></a><a href="#mwx-site" class="mwx-back-top">إلى أعلى الصفحة ↑</a></div> </footer> <div class="mwx-toast" role="status" aria-live="polite" hidden></div></div> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/jannah-new/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script id="mwc-privacy-js-before"> window.mwcConsentConfig={"version":"2026-10-12.1","expiryDays":180,"cookieName":"mwc_consent","privacyUrl":"https:\/\/mwade3.com\/privacy\/","cookiesUrl":"https:\/\/mwade3.com\/cookies\/","termsUrl":"https:\/\/mwade3.com\/terms\/","contactUrl":"https:\/\/mwade3.com\/contact-us\/","language":"ar","advertising":false,"lastUpdatedAr":"12 \u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644 2026","lastUpdatedEn":"12 October 2026"}; //# sourceURL=mwc-privacy-js-before </script> <script data-wp-strategy="defer" defer id="mwc-privacy-js" src="https://mwade3.com/wp-content/plugins/mwade3-privacy/assets/privacy.js?ver=1.0.0"></script> <script data-wp-strategy="defer" defer id="mwx-site-js" src="https://mwade3.com/wp-content/plugins/mwade3-experience/assets/site.js?ver=3.3.5"></script> <script data-wp-strategy="defer" defer id="mwx-calculations-js" src="https://mwade3.com/wp-content/plugins/mwade3-experience/assets/calculations.js?ver=3.3.5"></script> <script data-wp-strategy="defer" defer id="mwx-portal-js" src="https://mwade3.com/wp-content/plugins/mwade3-experience/assets/portal.js?ver=3.3.5"></script> <script data-wp-strategy="defer" defer id="mwx-live-js" src="https://mwade3.com/wp-content/plugins/mwade3-experience/assets/live.js?ver=3.3.5"></script> <script data-wp-strategy="defer" defer id="mwc-desk-js" src="https://mwade3.com/wp-content/plugins/mwade3-contact/assets/desk.js?ver=1.0.0"></script> <script id="wp-consent-api-js-extra"> var consent_api = {"consent_type":"optin","waitfor_consent_hook":"","cookie_expiration":"30","cookie_prefix":"wp_consent","services":[]}; //# sourceURL=wp-consent-api-js-extra </script> <script id="wp-consent-api-js" src="https://mwade3.com/wp-content/plugins/wp-consent-api/assets/js/wp-consent-api.min.js?ver=2.1.0"></script> <div id="mwc-privacy-root" class="mwc-root" data-version="2026-10-12.1"></div> <noscript><div class="mwc-noscript" lang="ar" dir="rtl">ملفات الارتباط الاختيارية متوقفة لأن JavaScript غير متاح. يمكنك قراءة <a href="https://mwade3.com/cookies/">سياسة ملفات الارتباط</a>.</div></noscript> </body> </html>