<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web on kenji.blog</title><link>http://kenji.blog/ar/categories/web/</link><description>Recent content in Web on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 03:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/categories/web/index.xml" rel="self" type="application/rss+xml"/><item><title>تخصيص سمة Hugo: كيفية إدراج Tailwind CSS</title><link>http://kenji.blog/ar/p/hugo-tailwind-css-customization-guide/</link><pubDate>Sun, 13 Sep 2026 03:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/hugo-tailwind-css-customization-guide/</guid><description>&lt;img src="http://kenji.blog/p/hugo-tailwind-css-customization-guide/img/eyecatch.jpg" alt="Featured image of post تخصيص سمة Hugo: كيفية إدراج Tailwind CSS" />&lt;h1 id="مقدمة-التآزر-القوي-بين-مولد-المواقع-الثابتة-hugo-و-tailwind-css">مقدمة: التآزر القوي بين مولد المواقع الثابتة Hugo و Tailwind CSS
&lt;/h1>&lt;p>في تطوير الواجهات الأمامية للويب الحديث، يعد تحقيق التوازن بين الأداء وتجربة المطور (DX: Developer Experience) أحد أهم التحديات في كل مشروع. الجمع بين &lt;strong>Hugo&lt;/strong>، الذي يتميز بسرعات بناء من بين الأسرع عالمياً في مولدات المواقع الثابتة (SSG)، و &lt;strong>Tailwind CSS&lt;/strong>، الذي جلب نموذجاً مبتكراً يعطي الأولوية للخدمات (Utility-first)، يمكن اعتباره حلاً جذرياً لهذا التحدي.&lt;/p>
&lt;p>تمت كتابة Hugo بلغة Go، ولديه أداء مذهل يتيح له إكمال بناء موقع يحتوي على آلاف الصفحات في ثوانٍ معدودة، أو حتى في أجزاء من الثانية. من ناحية أخرى، من خلال كتابة عدد لا يحصى من فئات الخدمات المعرفة مسبقًا (مثل &lt;code>flex&lt;/code>, &lt;code>text-center&lt;/code>, &lt;code>mt-4&lt;/code>) مباشرة في HTML، يقضي Tailwind CSS على الحاجة للتبديل بين ملفات CSS و HTML، مما يسرع عملية تكرار التصميم.&lt;/p>
&lt;p>في هذا المقال، سنشرح بالتفصيل الدقيق ومن وجهة نظر شاملة - بدءًا من أساسيات البنية المعمارية وصولاً إلى منظور التحسين الرياضي للأداء - خطوات إدراج Tailwind CSS في سمة Hugo، وبناء مسار موارد متقدم (Hugo Pipes) باستخدام PostCSS.&lt;/p>
&lt;hr>
&lt;h2 id="1-فئات-الخدمات-لـ-css-وتطور-التوجه-القائم-على-المكونات">1. فئات الخدمات لـ CSS وتطور التوجه القائم على المكونات
&lt;/h2>&lt;p>قبل الدخول في خطوات إدراج Tailwind CSS، من المفيد جداً أن نفهم بعمق تاريخ وتطور فلسفة تصميم CSS التي تكمن وراء سبب وجوب استخدامنا لـ Tailwind CSS.&lt;/p>
&lt;h3 id="حدود-تصميم-css-التقليدي-bem-و-oocss">حدود تصميم CSS التقليدي (BEM و OOCSS)
&lt;/h3>&lt;p>في تطوير الويب سابقاً، كان من أفضل الممارسات إعطاء أسماء فئات ذات دلالات (Semantic). على سبيل المثال، عند إنشاء مكون بطاقة (Card)، كنا نفصل بين HTML و CSS كالتالي:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;card&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;card__image&amp;#34;&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;image.jpg&amp;#34;&lt;/span> &lt;span class="na">alt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;thumbnail&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;card__content&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">h2&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;card__title&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>العنوان&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">h2&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;card__description&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>النص التوضيحي يكتب هنا.&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nc">card&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">border-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">box-shadow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="kt">px&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="kt">px&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">background-color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#ffffff&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">.&lt;/span>&lt;span class="nc">card__title&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">font-size&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">1.5&lt;/span>&lt;span class="kt">rem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">font-weight&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">bold&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#333333&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">/* تستمر الأنماط التفصيلية لاحقاً */&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>مثل هذا التصميم القائم على BEM (Block Element Modifier) يعمل جيداً عندما يكون حجم المشروع صغيراً، ولكنه يميل إلى التسبب في المشاكل التالية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>استنفاد وإرهاق في التسمية&lt;/strong>: في كل مرة تنشئ فيها مكوناً مشابهاً، عليك التفكير في أسماء فئات جديدة (مثل: &lt;code>card-news&lt;/code>، &lt;code>card-featured&lt;/code>).&lt;/li>
&lt;li>&lt;strong>تضخم CSS&lt;/strong>: مع إضافة كل ميزة جديدة، يزداد عدد أسطر CSS. وبمجرد كتابة CSS، نادراً ما يتم حذفه بسبب الخوف من &amp;ldquo;عدم معرفة أين يتم استخدامه&amp;rdquo;، مما يؤدي إلى تراكم الأكواد الميتة.&lt;/li>
&lt;li>&lt;strong>تبديل السياق&lt;/strong>: نظرًا لأنه يتم إدارة بنية HTML وأنماط CSS في ملفات منفصلة، فإن عدد مرات التبديل بين علامات التبويب في المحرر يزداد بشكل كبير.&lt;/li>
&lt;/ol>
&lt;h3 id="التحول-النموذجي-بواسطة-tailwind-css">التحول النموذجي بواسطة Tailwind CSS
&lt;/h3>&lt;p>يحل Tailwind CSS هذه المشاكل من خلال نهج &amp;ldquo;دمج فئات الخدمات&amp;rdquo;. يبدو مكون البطاقة المذكور أعلاه كالتالي عند استخدام Tailwind CSS:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;rounded-lg shadow-md bg-white overflow-hidden&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">img&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;w-full h-48 object-cover&amp;#34;&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;image.jpg&amp;#34;&lt;/span> &lt;span class="na">alt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;thumbnail&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;p-6&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">h2&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-2xl font-bold text-gray-800&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>العنوان&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">h2&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;mt-2 text-gray-600&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>النص التوضيحي يكتب هنا.&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>نظراً لأن اسم الفئة نفسه يمثل القيمة الدقيقة للنمط (مثل &lt;code>p-6&lt;/code> تعني &lt;code>padding: 1.5rem;&lt;/code>)، يمكنك التنبؤ بنتيجة العرض النهائية بمجرد النظر إلى HTML. علاوة على ذلك، من خلال مترجم JIT (Just-In-Time) الخاص بـ Tailwind، يتم استخراج الفئات المستخدمة بالفعل فقط إلى ملف CSS المخصص للإنتاج، مما يقلل حجم ملف CSS إلى أدنى حد ممكن.&lt;/p>
&lt;hr>
&lt;h2 id="2-بنية-hugo-pipes-و-postcss">2. بنية Hugo Pipes و PostCSS
&lt;/h2>&lt;p>لدمج Tailwind CSS في Hugo، تحتاج إلى فهم مسار معالجة الموارد الذي يُسمى &lt;strong>Hugo Pipes&lt;/strong>. تعد Hugo Pipes ميزة قوية تنجز جميع العمليات المتعلقة بالموارد داخلياً في Hugo، مثل تجميع Sass/SCSS، وحزم ودمج (Minify) JavaScript، وتنفيذ &lt;strong>PostCSS&lt;/strong> الذي سنستخدمه في هذا المقال.&lt;/p>
&lt;p>PostCSS هي أداة لتحويل CSS باستخدام إضافات JavaScript. في الواقع، يعمل Tailwind CSS نفسه كإضافة لـ PostCSS.&lt;/p>
&lt;h3 id="آلية-تحويل-ast-شجرة-بناء-الجملة-المجردة-عبر-postcss">آلية تحويل AST (شجرة بناء الجملة المجردة) عبر PostCSS
&lt;/h3>&lt;p>إن فهم كيفية معالجة PostCSS لملفات CSS مفيد للغاية عند استكشاف الأخطاء وإصلاحها. يوضح مخطط Mermaid التالي المسار من قراءة PostCSS لملف CSS، وتحويله عبر الإضافات، حتى إخراج ملف CSS النهائي.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Raw CSS (styles.css)&amp;#34;] --&amp;gt;|Parser| B[&amp;#34;AST (شجرة بناء الجملة المجردة)&amp;#34;]
B --&amp;gt; C[&amp;#34;إضافة 1: Tailwind CSS&amp;#34;]
C --&amp;gt; D[&amp;#34;إضافة 2: Autoprefixer&amp;#34;]
D --&amp;gt; E[&amp;#34;إضافة N: cssnano&amp;#34;]
E --&amp;gt;|Stringifier| F[&amp;#34;Compiled &amp;amp; Optimized CSS&amp;#34;]
&lt;/pre>
&lt;ol>
&lt;li>&lt;strong>Parser (المحلل)&lt;/strong>: يقوم بتحليل سلسلة CSS الخام المدخلة ويحولها إلى شجرة بناء الجملة المجردة (AST)، وهي بنية بيانات يمكن معالجتها برمجيًا.&lt;/li>
&lt;li>&lt;strong>Plugins (مجموعة الإضافات)&lt;/strong>:
&lt;ul>
&lt;li>&lt;strong>Tailwind CSS&lt;/strong>: يمسح ملفات القالب (HTML أو Markdown) ويستخرج فئات الخدمات المستخدمة كعقد إضافية على شجرة AST. كما أنه يوسع التوجيهات مثل &lt;code>@tailwind&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Autoprefixer&lt;/strong>: يراجع قاعدة بيانات &lt;code>Can I Use&lt;/code> ويضيف البادئات الخاصة بالمتصفحات (مثل &lt;code>-webkit-&lt;/code>, &lt;code>-moz-&lt;/code>) إلى خصائص AST عند الحاجة.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Stringifier (محول السلاسل)&lt;/strong>: بعد اكتمال التحويل، يقوم بتحويل شجرة AST مرة أخرى إلى سلاسل CSS يمكن للمتصفح فهمها لإخراجها.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-إعداد-البيئة-والمتطلبات-الأساسية">3. إعداد البيئة والمتطلبات الأساسية
&lt;/h2>&lt;p>دعونا نبدأ بخطوات الإدراج الفعلية. أولاً، تحقق مما إذا كانت البرامج الضرورية مثبتة.&lt;/p>
&lt;h3 id="المتطلبات-الأساسية">المتطلبات الأساسية
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Hugo Extended Version (النسخة الموسعة من Hugo)&lt;/strong>:
بدلاً من الإصدار العادي من Hugo، تعد &lt;strong>النسخة الموسعة&lt;/strong> التي تتضمن وظيفة معالجة Sass/SCSS وميزات دعم PostCSS مدمجة ضرورية. قم بتشغيل الأمر التالي في الطرفية (Terminal) وتأكد من أن السلسلة &lt;code>extended&lt;/code> متضمنة في معلومات الإصدار.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># مثال للإخراج المتوقع:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># hugo v0.121.2-4146... windows/amd64 BuildDate=... VendorInfo=gohugoio +extended&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Node.js و npm&lt;/strong>:
تعمل حزم التبعيات مثل Tailwind CSS و PostCSS على بيئة Node.js. تأكد من تثبيت Node.js (يُفضل إصدار الدعم طويل الأمد LTS).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">node -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="تثبيت-حزم-npm">تثبيت حزم npm
&lt;/h3>&lt;p>قم بتهيئة npm في دليل الجذر للمشروع (الدليل الذي يحتوي على ملف إعداد Hugo &lt;code>hugo.toml&lt;/code>)، وقم بتثبيت الحزم المطلوبة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># إنشاء ملف package.json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm init -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تثبيت Tailwind CSS، و PostCSS، و Autoprefixer كتبعيات تطوير&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install -D tailwindcss postcss postcss-cli autoprefixer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>[!IMPORTANT]
إذا لم يتم تثبيت &lt;code>postcss-cli&lt;/code>، فقد تحدث أخطاء عند استدعاء PostCSS من داخل Hugo. تستخدم Hugo Pipes برنامج &lt;code>postcss-cli&lt;/code> داخلياً، لذا تأكد من تثبيته.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="4-بناء-ملفات-التكوين-postcss-و-tailwind-css">4. بناء ملفات التكوين (PostCSS و Tailwind CSS)
&lt;/h2>&lt;p>بعد اكتمال تثبيت الحزم، سننشئ ملفي تكوين مهمين يتحكمان في سلوك المشروع. ضعهما في دليل الجذر للمشروع.&lt;/p>
&lt;h3 id="إنشاء-ملف-tailwindconfigjs">إنشاء ملف tailwind.config.js
&lt;/h3>&lt;p>قم بتنفيذ الأمر التالي في الطرفية لإنشاء ملف التكوين الافتراضي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npx tailwindcss init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>افتح ملف &lt;code>tailwind.config.js&lt;/code> الذي تم إنشاؤه في المحرر، وقم بإعداد خاصية &lt;code>content&lt;/code>. هذا الجزء مهم جداً. بناءً على المسارات المحددة هنا، يقوم Tailwind بتحليل الملفات واستخراج الفئات المستخدمة. وفقاً لهيكلية مشروع Hugo، حدد ملفات التخطيط والمحتوى بدقة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/** @type {import(&amp;#39;tailwindcss&amp;#39;).Config} */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">module&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">exports&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// تحديد الملفات المراد مسحها وفقًا لهيكل دليل Hugo
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">content&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;./content/**/*.md&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;./content/**/*.html&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;./layouts/**/*.html&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;./assets/**/*.js&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إذا كنت تستخدم سمة مخصصة، يجب تضمين دليل السمة أيضًا
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// &amp;#34;./themes/my-theme/layouts/**/*.html&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">theme&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">extend&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// قم بإضافة الألوان والخطوط المخصصة هنا
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">colors&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;brand-primary&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;#3490dc&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;brand-secondary&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;#ffed4a&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fontFamily&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;sans&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;Helvetica Neue&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Arial&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Hiragino Kaku Gothic ProN&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Meiryo&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;sans-serif&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">plugins&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// أضف الإضافات الرسمية حسب الحاجة (مثل: Typography plugin)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// require(&amp;#39;@tailwindcss/typography&amp;#39;),
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="إنشاء-ملف-postcssconfigjs">إنشاء ملف postcss.config.js
&lt;/h3>&lt;p>بعد ذلك، قم بإنشاء ملف &lt;code>postcss.config.js&lt;/code> في جذر المشروع لتعريف أي الإضافات سينفذها PostCSS وبأي ترتيب.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">module&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">exports&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">plugins&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tailwindcss&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">autoprefixer&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>باستخدام هذا الإعداد، عندما يقوم Hugo باستدعاء PostCSS، ستتم معالجة Tailwind CSS أولاً، تليها إضافة Autoprefixer للبادئات الخاصة بالمتصفحات.&lt;/p>
&lt;hr>
&lt;h2 id="5-بناء-مسار-موارد-css-في-hugo">5. بناء مسار موارد CSS في Hugo
&lt;/h2>&lt;p>بعد إتمام الإعدادات، سنقوم بدمج Tailwind CSS في جانب سمة Hugo.&lt;/p>
&lt;h3 id="5-1-إنشاء-ملف-css-كنقطة-إدخال">5-1. إنشاء ملف CSS كنقطة إدخال
&lt;/h3>&lt;p>في الدليل &lt;code>assets/css/&lt;/code> (قم بإنشائه إن لم يكن موجوداً)، قم بإنشاء ملف CSS ليكون نقطة الإدخال. هنا سنسميه &lt;code>main.css&lt;/code>.&lt;/p>
&lt;p>&lt;strong>مسار الملف: &lt;code>assets/css/main.css&lt;/code>&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="c">/* استيراد الأنماط الأساسية لـ Tailwind (مثل إعادة تعيين CSS) */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">tailwind&lt;/span> &lt;span class="nt">base&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">/* استيراد فئات المكونات */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">tailwind&lt;/span> &lt;span class="nt">components&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">/* استيراد فئات الخدمات */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">tailwind&lt;/span> &lt;span class="nt">utilities&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">/* إذا كنت بحاجة إلى كتابة CSS مخصص، يمكنك إضافته هنا،
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"> ولكن يفضل استخدام extend في tailwind.config.js قدر الإمكان */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">layer&lt;/span> &lt;span class="nt">components&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nc">btn-primary&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">@apply&lt;/span> &lt;span class="err">bg-blue-500&lt;/span> &lt;span class="n">hover&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">bg-blue-700&lt;/span> &lt;span class="kc">text&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="kc">white&lt;/span> &lt;span class="k">font&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="kc">bold&lt;/span> &lt;span class="n">py-2&lt;/span> &lt;span class="n">px-4&lt;/span> &lt;span class="n">rounded&lt;/span> &lt;span class="k">transition&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">colors&lt;/span> &lt;span class="n">duration-300&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="5-2-تعديل-ملف-التخطيط-headhtml">5-2. تعديل ملف التخطيط (head.html)
&lt;/h3>&lt;p>بعد ذلك، ستقوم بقراءة ملف CSS أعلاه من قوالب Hugo، وكتابة المسار لمعالجته بواسطة PostCSS. عادةً يتم تعديل القالب الجزئي الذي يُعرّف داخل الوسم &lt;code>&amp;lt;head&amp;gt;&lt;/code> (مثل: &lt;code>layouts/partials/head.html&lt;/code>).&lt;/p>
&lt;p>&lt;strong>مسار الملف: &lt;code>layouts/partials/head.html&lt;/code>&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-go-html-template" data-lang="go-html-template">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">charset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;viewport&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;width=device-width, initial-scale=1&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.Title&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span> | &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.Site.Title&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- جلب assets/css/main.css --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">resources&lt;/span>&lt;span class="na">.Get&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;css/main.css&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- تعريف خيارات PostCSS --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$options&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">:=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">dict&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;inlineImports&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">resources&lt;/span>&lt;span class="na">.PostCSS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$options&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- مسار تحسين الموارد لبيئة الإنتاج (Production) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">if&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">hugo&lt;/span>&lt;span class="na">.IsProduction&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 1. الضغط (Minify) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">minify&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 2. البصمة (إضافة تجزئة لكسر ذاكرة التخزين المؤقت - Fingerprint) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">fingerprint&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;sha512&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 3. إخراج الوسم مع تكامل الموارد الفرعية (SRI) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="na">.RelPermalink&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="na">integrity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="na">.Data.Integrity&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="na">crossorigin&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;anonymous&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">else&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- في بيئة التطوير (Development)، أخرجه كما هو بدون ضغط (لأولوية سرعة البناء) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;stylesheet&amp;#34;&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nx">$css&lt;/span>&lt;span class="na">.RelPermalink&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">end&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="شرح-المسار-ورسمه-التوضيحي-باستخدام-mermaid">شرح المسار ورسمه التوضيحي باستخدام Mermaid
&lt;/h4>&lt;p>يوضح الرسم التالي كيف يقوم كود قوالب Go المذكور أعلاه بمعالجة ملف CSS في سلسلة من عمليات المسار.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;assets/css/main.css&amp;#34;] --&amp;gt;|resources.Get| B[&amp;#34;Hugo Memory Space&amp;#34;]
B --&amp;gt;|resources.PostCSS| C[&amp;#34;PostCSS + Tailwind JIT Process&amp;#34;]
C --&amp;gt; D{&amp;#34;hugo.IsProduction ?&amp;#34;}
D -- &amp;#34;نعم (بيئة الإنتاج)&amp;#34; --&amp;gt; E[&amp;#34;minify (حذف المسافات والأسطر الفارغة)&amp;#34;]
E --&amp;gt; F[&amp;#34;fingerprint (حساب التجزئة)&amp;#34;]
F --&amp;gt; G[&amp;#34;public/css/main.[hash].css (مع SRI)&amp;#34;]
D -- &amp;#34;لا (بيئة التطوير)&amp;#34; --&amp;gt; H[&amp;#34;public/css/main.css&amp;#34;]
&lt;/pre>
&lt;ol>
&lt;li>&lt;strong>&lt;code>resources.Get&lt;/code>&lt;/strong>: يبحث عن الملف المحدد داخل دليل &lt;code>assets&lt;/code>، ويقوم بتحميله ككائن موارد في الذاكرة.&lt;/li>
&lt;li>&lt;strong>&lt;code>resources.PostCSS&lt;/code>&lt;/strong>: يشير إلى ملف &lt;code>postcss.config.js&lt;/code> في جذر المشروع ويُطبق عمليات Tailwind CSS و Autoprefixer على الكود المصدري لـ CSS. في بيئة التطوير (&lt;code>hugo server&lt;/code>)، يعمل وضع JIT، الذي يقوم بإنشاء الفئات الضرورية بسرعة فائقة فقط عند تعديل الملفات.&lt;/li>
&lt;li>&lt;strong>&lt;code>minify&lt;/code>&lt;/strong>: عند بناء نسخة بيئة الإنتاج (مثلاً عبر &lt;code>hugo --environment production&lt;/code>)، يتم حذف المسافات والتعليقات غير الضرورية، وتقليل حجم الملف إلى أدنى حد ممكن.&lt;/li>
&lt;li>&lt;strong>&lt;code>fingerprint&lt;/code>&lt;/strong>: يقوم بحساب تجزئة SHA بناءً على محتوى الملف ويضيفها إلى اسم الملف (مثل: &lt;code>main.ab12cd...css&lt;/code>). هذا يحقق &amp;ldquo;كسر ذاكرة التخزين المؤقت&amp;rdquo; حيث يتم التأكد من أن المتصفح يحمل ملفاً جديداً عند تحديث CSS، مع الاستفادة من ميزة التخزين المؤقت القوية للمتصفح.&lt;/li>
&lt;li>&lt;strong>&lt;code>integrity&lt;/code>&lt;/strong>: يستخدم قيمة التجزئة المحسوبة عبر البصمة لإخراج خاصية SRI لمنع التلاعب من قبل شبكات توصيل المحتوى (CDN) وغيرها.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="6-التحليل-الرياضي-للأداء-في-تحسين-css">6. التحليل الرياضي للأداء في تحسين CSS
&lt;/h2>&lt;p>تعتبر إحدى أكبر ميزات إدراج Tailwind CSS هي تقليل حجم ملف CSS المرسل إلى أدنى حد. دعونا نحلل كمياً كيف يؤثر ذلك على أداء الويب (وخاصة على First Contentful Paint: FCP) باستخدام نماذج رياضية.&lt;/p>
&lt;h3 id="نموذج-تقليل-حجم-ملف-css">نموذج تقليل حجم ملف CSS
&lt;/h3>&lt;p>في أطر عمل CSS التقليدية (مثل Bootstrap)، يميل حجم الملف $S_{original}$ إلى أن يكون كبيراً (حوالي 150 كيلوبايت - 200 كيلوبايت) لأنه يتم تحميل جميع الأنماط، بما في ذلك تلك غير المستخدمة.
إذا رمزنا لحجم الملف بعد إزالة الفئات غير المستخدمة بواسطة مترجم JIT الخاص بـ Tailwind كـ $S_{purged}$، وباستخدام نسبة التقليل $R_{purge}$، يمكن التعبير عنها كما يلي:&lt;/p>
$$
S_{purged} = S_{original} \times (1 - R_{purge})
$$&lt;p>في المشاريع النموذجية، تصل نسبة $R_{purge}$ إلى ما يقرب من $0.9$ (تخفيض بنسبة 90%)، وينحصر حجم $S_{purged}$ في حوالي 10 كيلوبايت - 20 كيلوبايت فقط.&lt;/p>
&lt;p>بالإضافة إلى ذلك، يتم ضغط الملف عبر Brotli أو Gzip على جانب الخادم أثناء النقل. إذا كانت نسبة الضغط $R_{compress}$ (عادة ما تكون حوالي 0.7 إلى 0.8)، يتم حساب حجم الحمولة النهائية عبر الشبكة $S_{final}$ باستخدام المعادلة التالية:&lt;/p>
$$
S_{final} = S_{purged} \times (1 - R_{compress})
$$&lt;h3 id="مسار-العرض-الحرج-وتأخير-الشبكة">مسار العرض الحرج وتأخير الشبكة
&lt;/h3>&lt;p>يمكن تقريب الوقت المستغرق حتى يرسم المتصفح المحتوى الأولي على الشاشة (FCP) عن طريق مجموع وقت تنزيل HTML، ووقت تنزيل CSS، ووقت العرض.&lt;/p>
$$
T_{FCP} \approx RTT + \frac{S_{HTML}}{BW} + RTT + \frac{S_{final}}{BW} + T_{render}
$$&lt;p>حيث أن:&lt;/p>
&lt;ul>
&lt;li>$RTT$: زمن الرحلة ذهاباً وإياباً (وقت تأخير الاتصال بالخادم)&lt;/li>
&lt;li>$BW$: عرض النطاق الترددي للشبكة (Bandwidth)&lt;/li>
&lt;/ul>
&lt;p>في بيئات مثل شبكات الهاتف المحمول حيث يكون $BW$ ضيقًا و $RTT$ كبيرًا (تأخير كبير)، فإن نهج Tailwind CSS في تقليل $S_{final}$ إلى بضعة كيلوبايتات يؤدي إلى دفع قيمة $\frac{S_{final}}{BW}$ قريباً من الصفر، مما يصبح محركاً أساسياً لتحقيق درجات مذهلة في أدوات الأداء (مثل Google PageSpeed Insights).&lt;/p>
&lt;hr>
&lt;h2 id="7-تشغيل-خادم-التطوير-والتحقق-من-التحديث-التلقائي-hot-reload">7. تشغيل خادم التطوير والتحقق من التحديث التلقائي (Hot Reload)
&lt;/h2>&lt;p>بعد اكتمال جميع الإعدادات، قم بتشغيل خادم التطوير الخاص بـ Hugo وتأكد من أن Tailwind CSS يعمل بشكل صحيح.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>انتقل إلى &lt;code>http://localhost:1313/&lt;/code> عبر المتصفح وتحقق من عرض الموقع.
افتح ملف محتوى Markdown أو أحد قوالب Hugo (الملفات الموجودة تحت &lt;code>layouts/&lt;/code>)، وحاول إضافة فئات جديدة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- مثال تطبيقي لفئات Tailwind بغرض الاختبار --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;bg-gradient-to-r from-blue-500 to-purple-600 text-white p-8 rounded-xl shadow-2xl text-center transform transition duration-500 hover:scale-105&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">h1&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text-4xl font-extrabold tracking-tight&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Tailwind CSS + Hugo is Awesome!&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">h1&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;mt-4 text-lg font-medium&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>يرجى التأكد من أن التحديث التلقائي ينعكس في لمح البصر.&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بمجرد حفظ الملف، ستختبر المتعة حيث يعمل متتبع الملفات القوي في Hugo بالتعاون مع مترجم JIT في Tailwind معاً لإعادة بناء CSS في أجزاء من الثانية، مما يؤدي إلى إعادة تحميل المتصفح تلقائياً (التحديث التلقائي - Hot Reload).&lt;/p>
&lt;h3 id="استكشاف-الأخطاء-وإصلاحها-ماذا-لو-لم-تنعكس-الأنماط">استكشاف الأخطاء وإصلاحها: ماذا لو لم تنعكس الأنماط؟
&lt;/h3>&lt;p>إذا لم تنعكس التغييرات، فتحقق من النقاط التالية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>إعداد مسار &lt;code>content&lt;/code> في &lt;code>tailwind.config.js&lt;/code>&lt;/strong>
إذا كانت مسارات الملفات المستهدفة خاطئة، فلن يتمكن Tailwind من اكتشاف الفئات المستخدمة داخلها ولن يضيفها إلى CSS. إذا كنت تستخدم سمة مخصصة خاصة، فتأكد من أن مسار دليل السمة لم يتم إسقاطه.&lt;/li>
&lt;li>&lt;strong>أخطاء PostCSS&lt;/strong>
إذا رأيت خطأً في سجلات خادم Hugo في الطرفية مثل &lt;code>Error: failed to transform resource: PostCSS not found&lt;/code>، فقد يعني ذلك أن الأمر &lt;code>npm install&lt;/code> لم ينفذ بشكل صحيح، أو أن &lt;code>postcss-cli&lt;/code> مفقود.&lt;/li>
&lt;li>&lt;strong>مسح ذاكرة التخزين المؤقت لـ Hugo&lt;/strong>
في حالات نادرة، قد يتسبب التخزين المؤقت في Hugo في الإبقاء على كود CSS القديم. أوقف الخادم وابدأه باستخدام الأمر &lt;code>hugo server --ignoreCache&lt;/code>، أو حاول حذف الدليل المؤقت في نظام التشغيل (مثل &lt;code>/tmp/hugo_cache/&lt;/code>).&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="8-البناء-لبيئة-الإنتاج-ومزيد-من-التحسينات">8. البناء لبيئة الإنتاج ومزيد من التحسينات
&lt;/h2>&lt;p>عند نشر موقعك على خادم الإنتاج (مثل Netlify، Vercel، GitHub Pages، Cloudflare Pages، إلخ)، يجب عليك تعيين متغيرات البيئة وتشغيل مسار التحسين الخاص ببيئة الإنتاج.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># مثال لأمر البناء للإنتاج&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">NODE_ENV&lt;/span>&lt;span class="o">=&lt;/span>production hugo --minify --environment production
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>عن طريق إضافة علم &lt;code>--environment production&lt;/code>، يتم تنفيذ كتلة &lt;code>{{ if hugo.IsProduction }}&lt;/code> داخل ملف &lt;code>head.html&lt;/code>، وتطبيق تصغير لحجم CSS (Minify) وإضافة البصمة (Fingerprint).&lt;/p>
&lt;h3 id="تنسيق-markdown-باستخدام-إضافة-typography">تنسيق Markdown باستخدام إضافة Typography
&lt;/h3>&lt;p>في المواقع المبنية على المدونات أو الوثائق مثل Hugo، لا يمكنك إضافة فئات مباشرة إلى عناصر HTML النقية التي يتم إنشاؤها من Markdown (مثل &lt;code>&amp;lt;h1&amp;gt;&lt;/code>، &lt;code>&amp;lt;p&amp;gt;&lt;/code>، &lt;code>&amp;lt;ul&amp;gt;&lt;/code> وما إلى ذلك). في مثل هذه الحالات، من المفيد جدًا استخدام إضافة &lt;strong>Typography&lt;/strong> الرسمية من Tailwind.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>تثبيت الإضافة&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -D @tailwindcss/typography
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>
&lt;p>إضافتها إلى &lt;code>tailwind.config.js&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">module&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">exports&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">plugins&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;@tailwindcss/typography&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>
&lt;p>تطبيقها في القوالب
من خلال إضافة فئة &lt;code>prose&lt;/code> (ويمكنك إضافة تغيرات الحجم واللون حسب الرغبة) فقط إلى حاوية العنصر الذي يخرج محتوى المقالة، سيتم تطبيق أنماط افتراضية جميلة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-go-html-template" data-lang="go-html-template">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">article&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;prose prose-lg prose-blue mx-auto mt-10&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="cp">{{&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="na">.Content&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="cp">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">article&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>بفضل ذلك، لم تعد هناك أي حاجة لكتابة محددات CSS معقدة يدويًا (مثل &lt;code>.article-content h2 { ... }&lt;/code>)، مما يضمن الحفاظ التام على نموذجية المكونات.&lt;/p>
&lt;hr>
&lt;h2 id="9-الخلاصة-اكتمال-نظام-واجهة-أمامية-عالي-القابلية-للصيانة">9. الخلاصة: اكتمال نظام واجهة أمامية عالي القابلية للصيانة
&lt;/h2>&lt;p>أحسنت العمل! مع هذا، اكتمل لديك مسار موارد الويب المثالي الذي يجمع بين محرك توليد المواقع الثابتة فائق السرعة لـ Hugo، وقدرات التنسيق الحديثة لـ Tailwind CSS، وقابلية التوسع لـ PostCSS.&lt;/p>
&lt;p>الشيء الرائع في هذه البنية هو أنك &lt;strong>&amp;ldquo;تحتاج إلى ضبط الإعدادات مرة واحدة فقط في البداية&amp;rdquo;&lt;/strong>. بمجرد بناء المسار، يمكن للمطورين البدء في تجميع واجهات المستخدم المعقدة بسرعة مذهلة وببساطة عبر كتابة فئات الخدمات البديهية في قوالب HTML أو Markdown، دون الحاجة لفتح ملف CSS.&lt;/p>
&lt;p>علاوة على ذلك، نظراً لأن حجم CSS الناتج يكون دائماً في حده الأدنى، فإن ذلك ينعكس بشكل مباشر على تحسين درجات Core Web Vitals، مما يمنحك ميزة كبيرة من منظور تحسين محركات البحث (SEO).&lt;/p>
&lt;p>يظل الجمع بين Hugo و Tailwind CSS أحد &amp;ldquo;أفضل الخيارات&amp;rdquo; لأي مشروع، من المدونات التقنية الشخصية إلى مواقع الشركات الضخمة. تأكد من الاستفادة من سلسلة الأدوات القوية هذه واستمتع بتجربة تطوير ويب مريحة!&lt;/p></description></item><item><title>مقدمة إلى منشئ المواقع الثابتة باستخدام Hugo (خطوات الانتقال من WordPress)</title><link>http://kenji.blog/ar/p/hugo-static-site-generator-wordpress-migration/</link><pubDate>Sun, 13 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/hugo-static-site-generator-wordpress-migration/</guid><description>&lt;img src="http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/img/eyecatch.jpg" alt="Featured image of post مقدمة إلى منشئ المواقع الثابتة باستخدام Hugo (خطوات الانتقال من WordPress)" />&lt;p>في تطوير الويب وإدارة المدونات الحديثة، أصبحت سرعة عرض الموقع والأمان وقابلية الصيانة عوامل في غاية الأهمية. لطالما حظي &amp;ldquo;WordPress&amp;rdquo;، الذي استحوذ على حصة ساحقة كأساس للمدونات ومواقع الشركات لفترة طويلة، بشعبية لدى العديد من المستخدمين بفضل نظام الإضافات المرن وواجهة الإدارة البديهية. ومع ذلك، نظراً لأنه يتضمن الاتصال بقاعدة البيانات وتوليد الصفحات ديناميكياً على جانب الخادم (المعالجة بواسطة PHP)، فإنه يواجه تحديات مثل الضعف أمام الزيادات المفاجئة في حركة المرور وتأخير العرض (زمن الانتقال).&lt;/p>
&lt;p>لذلك، وفي السنوات الأخيرة، انتشر &amp;ldquo;منشئ المواقع الثابتة (SSG: Static Site Generator)&amp;rdquo; بسرعة. في هذه المقالة، سنتعمق في &amp;ldquo;&lt;strong>Hugo&lt;/strong>&amp;quot;، والذي تم تطويره بلغة Go ويُعرف بسرعة بنائه الهائلة من بين العديد من منشئات المواقع الثابتة. سنشرح بالتفصيل مقارنة البنية التقنية مع أنظمة إدارة المحتوى الديناميكية (CMS) مثل WordPress، وخطوات الانتقال المحددة، وتقييم الأداء باستخدام النماذج الرياضية، وحتى هيكل الدليل الفريد لـ Hugo وترتيب البحث عن القوالب.&lt;/p>
&lt;hr>
&lt;h2 id="1-الاختلافات-التقنية-بين-نظام-إدارة-المحتوى-الديناميكي-wordpress-ومنشئ-المواقع-الثابتة-hugo">1. الاختلافات التقنية بين نظام إدارة المحتوى الديناميكي (WordPress) ومنشئ المواقع الثابتة (Hugo)
&lt;/h2>&lt;p>تتخذ WordPress و Hugo مناهج مختلفة جذرياً في آلية تقديم المواقع الإلكترونية.&lt;/p>
&lt;h3 id="11-بنية-wordpress-التوليد-الديناميكي">1.1 بنية WordPress (التوليد الديناميكي)
&lt;/h3>&lt;p>WordPress هو ممثل نموذجي لأنظمة إدارة المحتوى الديناميكية التي تقوم بتجميع الصفحات على جانب الخادم مع كل طلب. عندما يصل المستخدم (المتصفح) إلى صفحة، يقوم خادم الويب (مثل Apache أو Nginx) بتنفيذ برامج PHP النصية ويرسل استعلامات إلى قاعدة بيانات علائقية مثل MySQL (أو MariaDB). يقوم بدمج المحتوى المسترجع من قاعدة البيانات (بيانات المقالات، الفئات، العلامات، إعدادات الموقع، إلخ) مع ملفات القوالب، وينشئ ملف HTML النهائي ويعيده إلى العميل.&lt;/p>
&lt;p>تتميز هذه الآلية بميزة القدرة على توليد محتوى مختلف في الوقت الفعلي لكل زائر (مثل: عربة التسوق في مواقع التجارة الإلكترونية، صفحات خاصة بالمستخدمين المسجلين للدخول)، ولكن ما لم يتم تصميم آلية التخزين المؤقت (مثل البروكسي العكسي أو الإضافات) بشكل مناسب، فإنها تستهلك موارد الخادم بشكل كبير.&lt;/p>
&lt;h3 id="12-بنية-hugo-التوليد-المسبق-وقت-البناء">1.2 بنية Hugo (التوليد المسبق وقت البناء)
&lt;/h3>&lt;p>من ناحية أخرى، وكما يوحي الاسم &amp;ldquo;منشئ المواقع الثابتة&amp;rdquo;، يقوم Hugo بتوليد المحتوى في &amp;ldquo;وقت البناء&amp;rdquo; وليس في &amp;ldquo;وقت الطلب&amp;rdquo;. يتم الاحتفاظ بالمحتوى ليس في قاعدة بيانات، بل كملفات &amp;ldquo;Markdown&amp;rdquo; محلية يتم التحكم في إصداراتها بواسطة أنظمة مثل Git.
عندما ينفذ المطور الأمر (&lt;code>hugo&lt;/code>)، يقوم Hugo بقراءة ملفات Markdown، ويصب البيانات في قوالب HTML المحددة (ملفات التخطيط)، لإنشاء مجموعة مكتملة من ملفات HTML/CSS/JS النقية.&lt;/p>
&lt;p>يمكن تسليم مجموعة الملفات التي تم إنشاؤها (الأصول الثابتة) ببساطة عن طريق وضعها في &amp;ldquo;بيئة استضافة ثابتة&amp;rdquo; مثل Amazon S3 أو Cloudflare Pages أو Netlify أو Vercel أو حتى خادم Nginx بسيط. نظراً لعدم الحاجة إلى قاعدة بيانات أو لغة جانب الخادم (مثل PHP)، تنخفض المخاطر الأمنية (مثل حقن SQL ونقاط الضعف في PHP) بشكل كبير، وتزيد سرعة التوصيل إلى أقصى حد من خلال التخزين المؤقت على العقد الطرفية لشبكة توصيل المحتوى (CDN).&lt;/p>
&lt;p>فيما يلي توضيح للاختلافات بين البنيتين باستخدام مخطط Mermaid.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph WordPress[&amp;#34;نظام إدارة المحتوى الديناميكي (WordPress)&amp;#34;]
direction TB
Req1[&amp;#34;طلب المستخدم&amp;#34;] --&amp;gt; WebServer1[&amp;#34;خادم الويب (Nginx/Apache)&amp;#34;]
WebServer1 --&amp;gt; PHP[&amp;#34;معالجة PHP&amp;#34;]
PHP &amp;lt;--&amp;gt; DB[&amp;#34;قاعدة البيانات (MySQL)&amp;#34;]
PHP --&amp;gt; HTML1[&amp;#34;توليد HTML&amp;#34;]
HTML1 --&amp;gt; Res1[&amp;#34;إرجاع الاستجابة&amp;#34;]
end
subgraph Hugo[&amp;#34;منشئ المواقع الثابتة (Hugo)&amp;#34;]
direction TB
Dev[&amp;#34;المطور / CI・CD&amp;#34;] --&amp;gt; HugoBuild[&amp;#34;عملية بناء Hugo&amp;#34;]
Markdown[&amp;#34;مجموعة ملفات Markdown&amp;#34;] --&amp;gt; HugoBuild
Templates[&amp;#34;القوالب (HTML)&amp;#34;] --&amp;gt; HugoBuild
HugoBuild --&amp;gt; StaticFiles[&amp;#34;مجموعة الملفات الثابتة (HTML/CSS/JS)&amp;#34;]
StaticFiles --&amp;gt; CDN[&amp;#34;CDN / الاستضافة الثابتة&amp;#34;]
Req2[&amp;#34;طلب المستخدم&amp;#34;] --&amp;gt; CDN
CDN --&amp;gt; Res2[&amp;#34;إرجاع استجابة فورية&amp;#34;]
end
&lt;/pre>
&lt;hr>
&lt;h2 id="2-تقييم-الأداء-باستخدام-النماذج-الرياضية">2. تقييم الأداء باستخدام النماذج الرياضية
&lt;/h2>&lt;p>أحد أكبر فوائد الانتقال من WordPress إلى Hugo هو تحسين الأداء (سرعة العرض). لفهم ذلك بشكل كمي، دعونا نمثله بنموذج رياضي بسيط.&lt;/p>
&lt;p>ينقسم الوقت المستغرق لاكتمال تحميل الصفحة (Load Time: $T_{load}$) بشكل أساسي إلى وقت استجابة الخادم (TTFB: Time To First Byte) ووقت عرض المتصفح واسترداد الموارد ($T_{render}$).&lt;/p>
$$ T_{load} = T_{ttfb} + T_{render} $$&lt;p>في حالة نظام إدارة المحتوى الديناميكي (WordPress)، فإن $T_{ttfb}$ هو مجموع العناصر التالية: تأخير الشبكة ($T_{network}$)، وقت تنفيذ البرنامج النصي من جانب الخادم ($T_{php}$)، ووقت معالجة استعلام قاعدة البيانات ($T_{db}$).&lt;/p>
$$ T_{ttfb\_wp} = T_{network} + T_{php} + T_{db} $$&lt;p>في ظل ظروف الوصول الكثيف (الحمل العالي)، يزداد كل من $T_{php}$ و $T_{db}$ بشكل غير خطي، مما قد يؤدي إلى اختناق النظام بأكمله. عند التعبير عنها رياضياً، يمكن ملاحظة التدهور التالي في وقت الاستجابة نسبة إلى عدد الطلبات ($N$) (حيث $k$ هو معامل عبء المعالجة الإضافي).&lt;/p>
$$ T_{php}(N) \approx O(N^k), \quad T_{db}(N) \approx O(N^k) \quad \text{where } k > 1 $$&lt;p>من ناحية أخرى، في بنية تجمع بين منشئ المواقع الثابتة (Hugo) و CDN، لا توجد معالجة ديناميكية على جانب الخادم (PHP أو استعلامات DB). نظراً لأنه يتم تخزين المحتوى مؤقتاً على خوادم طرفية موزعة حول العالم، فإن $T_{ttfb}$ يعتمد فقط على تأخير الشبكة من العميل إلى أقرب خادم طرفي ($T_{edge}$).&lt;/p>
$$ T_{ttfb\_hugo} = T_{edge} $$&lt;p>ونتيجة لذلك، يتحقق $T_{edge} \ll (T_{network} + T_{php} + T_{db})$، ويتم تقليل TTFB بشكل كبير إلى بضعة ميلي ثانية إلى عشرات الميلي ثانية. كما أنه حتى مع زيادة عدد الطلبات $N$، يظل وقت الاستجابة ثابتاً تقريباً ($O(1)$) بفضل وظيفة موازنة الحمل في الخوادم الطرفية.&lt;/p>
$$ \lim_{N \to \infty} T_{ttfb\_hugo}(N) \approx \text{Constant} $$&lt;p>هذا هو الأساس الرياضي لسبب كون Hugo (الموقع الثابت) قوياً للغاية ضد الارتفاعات المفاجئة في حركة المرور (على سبيل المثال، عند انتشار المحتوى بشكل فيروسي).&lt;/p>
&lt;hr>
&lt;h2 id="3-الهيكل-الأساسي-ومبدأ-عمل-hugo">3. الهيكل الأساسي ومبدأ عمل Hugo
&lt;/h2>&lt;p>لإتقان استخدام Hugo، من الضروري فهم هيكل الدليل الفريد الخاص به، بالإضافة إلى مفاهيم &amp;ldquo;Front Matter&amp;rdquo; و &amp;ldquo;Template Lookup Order&amp;rdquo; (ترتيب البحث عن القوالب).&lt;/p>
&lt;h3 id="31-شرح-مفصل-لهيكل-الدليل">3.1 شرح مفصل لهيكل الدليل
&lt;/h3>&lt;p>عند إنشاء مشروع Hugo جديد (&lt;code>hugo new site mysite&lt;/code>)، يتم إنشاء هيكل الدليل التالي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">mysite/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── archetypes/ # قوالب عند إنشاء محتوى جديد (نماذج لـ Front Matter)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── assets/ # مجموعة الملفات التي ستتم معالجتها بواسطة Hugo Pipes (مثل SCSS/Sass و JavaScript)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── content/ # محتوى الموقع الفعلي (مجموعة ملفات Markdown). هذا هو بديل قاعدة البيانات.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── data/ # البيانات والإعدادات الخارجية المستخدمة في جميع أنحاء الموقع (مثل JSON و TOML و YAML و CSV)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── layouts/ # مجموعة قوالب HTML التي تحدد مظهر الموقع (باستخدام Go html/template)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── public/ # المكان الذي يتم فيه إخراج الملفات الثابتة الناتجة بعد تشغيل أمر البناء
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── static/ # الملفات الثابتة التي يتم نشرها كما هي (الصور، favicon، ملفات نصية للروبوتات، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── themes/ # أدلة القوالب (الثيمات) من طرف ثالث أو التي تم إنشاؤها ذاتياً
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── hugo.toml # ملف الإعدادات للموقع بأكمله (سابقاً كان config.toml هو السائد)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>في WordPress، يتم تخزين المحتوى في جدول &lt;code>wp_posts&lt;/code> في MySQL، بينما في Hugo يتم إدارة كل شيء كملفات نصية (بشكل رئيسي Markdown) داخل دليل &lt;code>content/&lt;/code>. هذا يسهل التحكم في إصدارات المحتوى (Git).&lt;/p>
&lt;h3 id="32-إدارة-المحتوى-markdown-و-front-matter">3.2 إدارة المحتوى: Markdown و Front Matter
&lt;/h3>&lt;p>يتكون كل ملف مقالة في Hugo من كتلة بيانات وصفية في الأعلى تسمى &amp;ldquo;Front Matter&amp;rdquo; (المقدمة)، يليها النص الأساسي (Markdown). يمكن كتابة Front Matter باستخدام TOML أو YAML أو JSON، ولكن YAML هو الأكثر استخداماً.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;فهم التصنيف (Taxonomy) في Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2026-09-13T10:00:00&lt;/span>&lt;span class="m">+09&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;شروحات تقنية&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Go&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">aliases&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;/old-category/hugo-taxonomy/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">من هنا يبدأ النص الأساسي. سيتم كتابته باستخدام **Markdown**.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">سنشرح الميزات القوية لـ Hugo...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>ما يجب ملاحظته هنا هو مفتاح &lt;code>aliases&lt;/code>. عند الانتقال من WordPress، إذا تغيرت الروابط الدائمة (URL)، فسيكون لذلك تأثير سلبي كبير على تحسين محركات البحث (SEO). باستخدام ميزة الأسماء المستعارة (aliases) في Hugo، يمكنك ببساطة تحديد عنوان URL القديم، وسيقوم Hugo تلقائياً بإنشاء HTML لإعادة التوجيه (التحويل باستخدام meta refresh). هذا مريح للغاية لأنه يلغي الحاجة إلى إعدادات إعادة التوجيه على جانب الخادم (مثل .htaccess).&lt;/p>
&lt;h3 id="33-ترتيب-البحث-عن-القوالب-template-lookup-order">3.3 ترتيب البحث عن القوالب (Template Lookup Order)
&lt;/h3>&lt;p>إحدى ميزات Hugo القوية هي آلية البحث المرنة عن القوالب (Template Lookup Order). عند عرض صفحة معينة، يبحث Hugo في الأدلة وأسماء الملفات بترتيب معين للعثور على القالب الأمثل.&lt;/p>
&lt;p>على سبيل المثال، عند عرض مقالة مفردة (Single Page) مثل &lt;code>content/post/hello-world.md&lt;/code>، يبحث Hugo عموماً عن ملفات التخطيط بالترتيب التالي:&lt;/p>
&lt;ol>
&lt;li>&lt;code>layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>layouts/post/list.html&lt;/code> (هذا ليس خطأً، ولكنه عادةً ما يكون للقوائم)&lt;/li>
&lt;li>&lt;code>layouts/_default/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/_default/single.html&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>يمكن للمطورين &lt;strong>تجاوز (override)&lt;/strong> قوالب السمة (الثيم) بمجرد إنشاء ملف بنفس الاسم في دليل &lt;code>layouts/&lt;/code> الخاص بمشروعهم، دون الحاجة إلى تعديل الكود المصدري للسمة مباشرة. يتيح ذلك إجراء تخصيصات فريدة دون إعاقة تحديثات السمة الأساسية.&lt;/p>
&lt;h3 id="34-التصنيف-taxonomy">3.4 التصنيف (Taxonomy)
&lt;/h3>&lt;p>يُطلق على نظام التصنيف المعادل لـ &amp;ldquo;الفئات (categories)&amp;rdquo; و &amp;ldquo;العلامات (tags)&amp;rdquo; في WordPress اسم &amp;ldquo;التصنيف (Taxonomy)&amp;rdquo; في Hugo.
يدعم Hugo التصنيفين &lt;code>categories&lt;/code> و &lt;code>tags&lt;/code> افتراضياً، ولكن من خلال تعديل &lt;code>hugo.toml&lt;/code>، يمكنك إضافة تصنيفات مخصصة بحرية (مثل: &lt;code>series&lt;/code>, &lt;code>authors&lt;/code>، إلخ).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># مثال على hugo.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">taxonomies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">category&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;categories&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;tags&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">series&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;series&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">author&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يتيح ذلك تنظيم المحتوى وإدراجه بناءً على محاور متنوعة.&lt;/p>
&lt;hr>
&lt;h2 id="4-عملية-الانتقال-الترحيل-من-wordpress-إلى-hugo">4. عملية الانتقال (الترحيل) من WordPress إلى Hugo
&lt;/h2>&lt;p>مفتاح النجاح في الانتقال من WordPress إلى Hugo هو كيفية تحويل المحتوى الديناميكي في قاعدة البيانات إلى ملفات ثابتة نظيفة (Markdown + Front Matter) مع الحفاظ على هيكل URL الحالي.&lt;/p>
&lt;p>فيما يلي، نعرض سير عمل خط أنابيب الانتقال العام.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
WPDB[&amp;#34;قاعدة بيانات WP&amp;#34;] --&amp;gt;|إضافة| Exporter[&amp;#34;أداة التصدير&amp;#34;]
Exporter --&amp;gt;|&amp;#34;استخراج النصوص، \nالبيانات الوصفية، الصور&amp;#34;| ZipFile[&amp;#34;ملف مضغوط / مجلد&amp;#34;]
ZipFile --&amp;gt;|فك الضغط| MarkdownFiles[&amp;#34;ملفات Markdown \n(content/)&amp;#34;]
ZipFile --&amp;gt;|فك الضغط| ImageFiles[&amp;#34;الصور \n(static/wp-content/)&amp;#34;]
MarkdownFiles --&amp;gt; Formatting[&amp;#34;المراجعة والتنسيق \n(إصلاح الأكواد القصيرة)&amp;#34;]
Formatting --&amp;gt; Git[&amp;#34;تأكيد التغييرات إلى Git&amp;#34;]
&lt;/pre>
&lt;h3 id="41-استخراج-البيانات-وتحويلها-إلى-markdown">4.1 استخراج البيانات وتحويلها إلى Markdown
&lt;/h3>&lt;p>لتصدير بيانات WordPress لاستخدامها في Hugo، فإن استخدام إضافات مخصصة هو الطريقة الأسهل والأكثر موثوقية. إليك بعض المناهج النموذجية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>استخدام إضافة Jekyll Exporter&lt;/strong>
نظراً لأن بنية البيانات في Hugo تشبه إلى حد كبير Jekyll، وهو أيضاً منشئ مواقع ثابتة، فإن استخدام إضافة &amp;ldquo;Jekyll Exporter&amp;rdquo; لـ WordPress يعد نهجاً شائعاً. عند تثبيت هذه الإضافة وتشغيلها، يتم تحويل جميع المقالات والصفحات الثابتة إلى ملفات Markdown مع Front Matter، ويمكن تنزيلها كملف ZIP جنباً إلى جنب مع ملفات الصور.&lt;/li>
&lt;li>&lt;strong>برامج نصية مخصصة باستخدام واجهة برمجة تطبيقات WordPress (WordPress API)&lt;/strong>
هذه طريقة لإنشاء برنامج نصي باستخدام Python أو Node.js وما إلى ذلك لاستدعاء واجهة برمجة تطبيقات REST الخاصة بـ WordPress (&lt;code>/wp-json/wp/v2/posts&lt;/code>)، وتحليل بيانات JSON، وإنشاء ملفات Markdown الخاصة بك. هذا مفيد للمواقع التي تستخدم بكثافة حقولاً مخصصة معقدة (مثل ACF) والتي لا يمكن التعامل معها بواسطة الإضافات.&lt;/li>
&lt;li>&lt;strong>الاستفادة من أداة wp2hugo&lt;/strong>
هناك أيضاً نهج يستخدم أداة سطر أوامر (CLI) مكتوبة بلغة Go وما شابهها للتحويل المباشر من ملف تصدير XML الخاص بـ WordPress (WXR) إلى تنسيق Hugo.&lt;/li>
&lt;/ol>
&lt;h3 id="42-الحفاظ-على-هيكل-الروابط-الدائمة-url">4.2 الحفاظ على هيكل الروابط الدائمة (URL)
&lt;/h3>&lt;p>للحفاظ على تقييم تحسين محركات البحث (SEO)، من المهم للغاية الحفاظ على عناوين URL الخاصة بفترة استخدام WordPress كما هي. إذا كانت إعدادات الروابط الدائمة في WordPress مثل &lt;code>https://example.com/2026/09/13/my-post/&lt;/code>، حدد هيكل الروابط الدائمة في ملف &lt;code>hugo.toml&lt;/code> الخاص بـ Hugo.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">permalinks&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">post&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;/:year/:month/:day/:slug/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بدلاً من ذلك، من الممكن أيضاً تثبيت عنوان URL إجبارياً عن طريق تحديد المعلمة &lt;code>url&lt;/code> مباشرة في الـ Front Matter لكل مقالة.
بالإضافة إلى ذلك، بالنسبة للصفحات التي تتغير عناوين URL الخاصة بها، قم بإعداد عمليات إعادة التوجيه باستخدام &lt;code>aliases&lt;/code> المذكورة سابقاً.&lt;/p>
&lt;h3 id="43-تحويل-الأكواد-القصيرة-shortcodes">4.3 تحويل الأكواد القصيرة (Shortcodes)
&lt;/h3>&lt;p>غالباً ما تبقى الأكواد القصيرة الخاصة بـ WordPress (مثل &lt;code>[gallery]&lt;/code>, &lt;code>[caption]&lt;/code> والأكواد الفريدة للإضافات المختلفة) كسلاسل نصية كما هي عند التصدير، لذلك يجب التعامل معها.
يتم نقلها إما بحذفها دفعة واحدة باستخدام برامج نصية للاستبدال (مثل sed أو Python)، أو بالاستفادة من &lt;strong>ميزة الأكواد القصيرة المخصصة&lt;/strong> القوية في Hugo (من خلال إنشاء تخطيطات مخصصة داخل &lt;code>layouts/shortcodes/&lt;/code>) بحيث يتم عرضها بشكل صحيح على جانب Hugo.&lt;/p>
&lt;hr>
&lt;h2 id="5-أدوات-سطر-الأوامر-cli-الخاصة-بـ-hugo-والبناء-والنشر">5. أدوات سطر الأوامر (CLI) الخاصة بـ Hugo والبناء والنشر
&lt;/h2>&lt;p>بمجرد اكتمال عملية الانتقال، حان الوقت أخيراً لبناء الموقع باستخدام Hugo ونشره للعالم. يتميز Hugo، الذي يتوفر كملف ثنائي للغة Go، بسرعة مذهلة حيث يكمل بناء المواقع التي تتكون من آلاف أو عشرات الآلاف من الصفحات في بضع ثوانٍ فقط.&lt;/p>
&lt;h3 id="51-بدء-تشغيل-خادم-التطوير-المحلي">5.1 بدء تشغيل خادم التطوير المحلي
&lt;/h3>&lt;p>عند كتابة المقالات أو تعديل التصميم، قم بتشغيل الخادم المحلي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># أمر تشغيل خادم التطوير (استخدم -D لتضمين مسودات المقالات Draft)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>عند تشغيل هذا الأمر، يصبح من الممكن معاينة الموقع على &lt;code>http://localhost:1313/&lt;/code>. يحتوي Hugo على ميزة &amp;ldquo;LiveReload&amp;rdquo; مدمجة قوية، حيث يتم تحديث شاشة المتصفح تلقائياً وبسرعة فائقة في اللحظة التي تقوم فيها بتحرير وحفظ ملفات Markdown أو القوالب أو CSS. وهذا يجعل تجربة الكتابة والتطوير أكثر راحة بكثير من شاشة إدارة WordPress.&lt;/p>
&lt;h3 id="52-البناء-للإنتاج-وتحسين-الأداء">5.2 البناء للإنتاج وتحسين الأداء
&lt;/h3>&lt;p>لإنشاء الملفات الثابتة لنشرها في بيئة الإنتاج، ما عليك سوى كتابة &lt;code>hugo&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># تنفيذ البناء للإنتاج. استخدم خيار --minify لتصغير HTML/CSS/JS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo --minify
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>يُخرج هذا الأمر ملفات الموقع بأكمله إلى دليل &lt;code>public/&lt;/code>. تؤدي إضافة خيار &lt;code>--minify&lt;/code> إلى إزالة الأسطر الجديدة والمسافات غير الضرورية، مما يقلل من حجم الملفات بشكل أكبر. ويساهم هذا بشكل مباشر في تقليل تأخير الشبكة ($T_{network}$) في النموذج الرياضي المذكور سابقاً.&lt;/p>
&lt;h3 id="53-أتمتة-النشر-cicd">5.3 أتمتة النشر (CI/CD)
&lt;/h3>&lt;p>ليس من الفعال إنشاء الملفات الثابتة على جهاز كمبيوتر محلي في كل مرة وتحميلها عبر FTP أو ما شابه. في تشغيل SSG الحديث، من أفضل الممارسات بناء بيئة CI/CD تقوم تلقائياً بعمليات البناء والنشر باستخدام عملية الدفع (push) إلى مستودع Git (مثل GitHub) كمحفز (trigger).&lt;/p>
&lt;p>على سبيل المثال، يكون الشكل الأساسي للإعدادات (ملف YAML) للنشر على Cloudflare Pages أو GitHub Pages باستخدام GitHub Actions على النحو التالي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># مثال على .github/workflows/hugo.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy Hugo site to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># في حالة إدارة السمة كنموذج فرعي (submodule)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">peaceiris/actions-hugo@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hugo --minify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال إعداد هذا، بمجرد القيام بإجراء &amp;ldquo;كتابة مقالة باستخدام Markdown ودفعها إلى GitHub&amp;rdquo;، يكتمل خط الأنابيب الآلي الذي ينشر أحدث إصدار من الموقع في بيئة الإنتاج في غضون بضع دقائق.&lt;/p>
&lt;hr>
&lt;h2 id="6-تحسين-محركات-البحث-seo-والمزايا-التشغيلية-بعد-الانتقال">6. تحسين محركات البحث (SEO) والمزايا التشغيلية بعد الانتقال
&lt;/h2>&lt;p>غالباً ما يلاحظ مديرو المواقع الذين أكملوا عملية الانتقال من WordPress إلى Hugo المزايا الثلاث البارزة التالية.&lt;/p>
&lt;h3 id="61-تحسن-جذري-في-سرعة-الموقع-ومؤشرات-حيوية-الويب-الأساسية-core-web-vitals">6.1 تحسن جذري في سرعة الموقع ومؤشرات حيوية الويب الأساسية (Core Web Vitals)
&lt;/h3>&lt;p>نتيجة لإلغاء استعلامات قاعدة البيانات والعرض على جانب الخادم، يتم تقليل أوقات تحميل الصفحة إلى أجزاء من الألف من الثانية. يرتبط هذا بشكل مباشر بتحسن كبير في درجات &amp;ldquo;مؤشرات حيوية الويب الأساسية&amp;rdquo; (Core Web Vitals) (مثل LCP و FID/INP و CLS)، والتي تعد من عوامل التصنيف في Google. يمكن توقع انخفاض في معدل الارتداد للمستخدمين وتحسين في تقييمات تحسين محركات البحث (SEO).&lt;/p>
&lt;h3 id="62-التحرر-من-التهديدات-الأمنية">6.2 التحرر من التهديدات الأمنية
&lt;/h3>&lt;p>نظراً لأن WordPress يُستخدم على نطاق واسع في جميع أنحاء العالم، فإنه يمثل دائماً هدفاً للهجمات. هناك مخاطر مستمرة مثل اختراق الموقع وتشويهه من خلال استغلال نقاط الضعف في الإضافات، أو اختراق تسجيل الدخول من خلال هجمات القوة الغاشمة (Brute-force attacks).
ومع ذلك، فإن الموقع الثابت الذي يتم إنشاؤه بواسطة Hugo لا يحتوي على قاعدة بيانات أو بيئة PHP أو حتى شاشة إدارة (نموذج تسجيل دخول). لا يوجد مجال للقراصنة لاختراق الخادم وتعديل قاعدة البيانات، وتقترب المخاطر الأمنية من الصفر.&lt;/p>
&lt;h3 id="63-تشغيل-خال-من-الصيانة">6.3 تشغيل خالٍ من الصيانة
&lt;/h3>&lt;p>يتطلب تشغيل WordPress أعمال صيانة مستمرة، مثل ترقية إصدار النظام الأساسي، وتحديث الإضافات، ومواكبة إصدارات PHP. عليك دائماً أن تقلق من خطر تعطل الموقع بسبب مشاكل التوافق.
في حالة Hugo، لا يلزم تحديث الأداة نفسها إلا عند الضرورة، ونظراً لأن كود الموقع بحد ذاته عبارة عن مجموعة من الملفات النصية المستقلة، فهناك شعور غامر براحة البال لأنه &amp;ldquo;لن يتعطل حتى لو تُرك دون تدخل&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-الخلاصة">7. الخلاصة
&lt;/h2>&lt;p>في هذه المقالة، قمنا بشرح مفصل للانتقال من نظام إدارة محتوى ديناميكي مثل WordPress إلى &amp;ldquo;Hugo&amp;rdquo;، وهو منشئ مواقع ثابتة قوي مبني على لغة Go. غطينا الاختلافات في البنية التقنية، وإثبات الأداء من خلال النماذج الرياضية، وصولاً إلى خطوات الانتقال المحددة.&lt;/p>
&lt;p>يتطلب الانتقال إلى منشئ مواقع ثابتة تكلفة تعليمية أولية (مثل تشغيل Git، وصياغة Markdown، وتنفيذ أوامر CLI من الطرفية (Terminal)، وفهم مواصفات محرك القوالب)، ولكنه يوفر عائداً يفوق ذلك بكثير يتمثل في &amp;ldquo;سرعة عرض هائلة&amp;rdquo;، &amp;ldquo;أمان قوي&amp;rdquo;، و&amp;quot;تشغيل خالٍ من الصيانة&amp;rdquo;.&lt;/p>
&lt;p>إذا كان موقعك الإلكتروني لا يتطلب تغييرات متكررة في التصميم أو معالجة ديناميكية معقدة (مثل الميزات الخاصة بالأعضاء أو وظائف التجارة الإلكترونية المتقدمة)، وكان هدفه الأساسي هو نشر المعلومات (مدونة، وسائط إعلامية، موقع شركة)، فإن الانتقال إلى Hugo سيكون أحد أكثر الاستثمارات التقنية فعالية. نأمل أن تستخدم هذه المقالة كمرجع لاتخاذ خطوتك الأولى نحو إدارة مواقع الويب من الجيل التالي باستخدام Hugo.&lt;/p></description></item></channel></rss>