⏱️ جاري الحساب…

شرح حزمة @wordpress/scripts: التطوير والبناء وفحص ملفات الإصدار

رسم مفاهيمي يوضح شرح wordpress scripts ضمن سلسلة تطوير ووردبريس
📋 فهرس محتويات المقال (اضغط للتنقل السريع) ▾

أهلاً بيك يا صديقي المطور في الأداة السحرية التي حولت حياة مطوري ووردبريس من جحيم إعدادات الـ Webpack وتضارب إصدارات Babel، إلى راحة البال المطلقة وزر واحد ينهي كل شيء: حزمة @wordpress/scripts الرسمية.

لو كنت بتشتغل في تطوير الواجهات قبل 2018، فأنت أكيد فاكر المعاناة الأزلية لما كنت تحب تبدأ مشروع جديد: تقضي يومين كاملين تنزل في حزم webpack، و webpack-cli، و babel-loader، و eslint، و prettier، وتكتب ملف webpack.config.js فيه 300 سطر، وأول ما تعمل npm update تلاقي حزمة ضربت وكل التكوينات انهارت في وشك!

فريق نواة ووردبريس أدرك المعضلة دي وقال: “المطور المفروض يركز في برمجة البلوك وتجربة المستخدم، مش في صيانة أدوات البناء!”. ومن هنا اتولدت حزمة @wordpress/scripts كمنظومة أدوات متكاملة بتعتمد على فلسفة “Zero-Configuration Tooling” (أدوات بدون إعدادات يدوية). بضغطة زر واحدة وأمر بسيط في Terminal، الحزمة دي بتوفر لك: وضع التطوير والمراقبة الحية (Watch Mode)، التجميع والضغط للإنتاج (Build)، الفحص اللغوي وتنسيق الكود (Linting & Formatting)، تشغيل اختبارات الوحدة الآلية (Jest Unit Testing)، وحتى تجهيز ملف الـ ZIP النهائي المضغوط الصالح للنشر على متجر ووردبريس الرسمي بـ plugin-zip! في الدليل الشامل ده، هنفكك كل أوامر الحزمة، إزاي تخصصها بأمان، ودراسة حالة حقيقية لمصانع أثاث بدمياط بالعامية المصرية التقنية الأصيلة.

المعيار المعماريحزمة @wordpress/scripts الرسميةأنظمة البناء اليدوية المخصصة (Custom Webpack)أداة Create React App (CRA) القديمة
التوافق مع نواة ووردبريس ومحرر Gutenbergتوافق تام بنسبة 100% وتحديث مستمر مع كل إصدار رئيسي لووردبريس.يحتاج لمتابعة مستمرة وتعديل يدوي دوري لمواكبة تغييرات واجهات النواة.مخصصة لتطبيقات React العامة المستقلة وتجهل تماماً بيئة ووردبريس ونظام البلوكات.
استخراج الاعتماديات وتوليد .asset.phpمدمج تلقائياً دون كتابة سطر كود واحد عبر إضافة Dependency Extraction.يتطلب تثبيت وضبط إضافة الـ Webpack يدوياً وربط مصفوفات الـ Externals.غير مدعوم؛ يحزم نسخة كاملة من React داخل ملف الـ JS النهائي.
حزمة الأوامر المدمجة (Out-of-the-box Tooling)شاملة: Build, Start, Lint, Format, Test (Unit & E2E), Packages Update, Plugin-Zip.المطور مسؤول عن تثبيت وتكوين كل أداة بمفردها وربط الـ Scripts في package.json.تحتوي على أوامر أساسية فقط وتفتقر لأدوات فحص وتجهيز إضافات ووردبريس.
تخصيص الإعدادات دون كسر النظام (Extensibility)مرن وسلس للغاية؛ تمديد ملفات Webpack أو ESLint بملفات مخصصة خفيفة.مرن جداً ولكنه هش وعرضة للانهيار عند تحديث أي حزمة من الـ npm.معقد ويتطلب عمل Eject يدمر التحديثات التلقائية للأبد.
تجهيز ملف التوزيع النهائي (Release Packaging)يوفر أمر wp-scripts plugin-zip الذي يستثني ملفات التطوير تلقائياً.يتطلب كتابة سكربتات Bash أو استخدام برامج ضغط يدوية قد تسرب ملفات حساسة.ينتج مجلد build لتطبيقات الويب العادية ولا ينشئ إضافات ووردبريس مضغوطة.

الترسانة الكاملة: الأوامر الرسمية لحزمة @wordpress/scripts

حزمة @wordpress/scripts توفر مجموعة من الأوامر الثورية التي يمكنك استدعاؤها عبر قسم scripts في ملف package.json:

1. أوامر التطوير والبناء (Core Lifecycle Commands):

  • wp-scripts start:

    يشغل خادم التطوير ووضع المراقبة الحية (Watch Mode). مع كل حفظ لأي ملف في مجلد src، يقوم بإعادة البناء في أجزاء من الثانية مع توليد Source Maps لتسهيل التنقيح.

  • wp-scripts build:

    أمر الإنتاج النهائي؛ يقوم بضغط وتصغير كود الـ JS والـ CSS، وإزالة تعليقات المطورين، وحذف خرائط المصدر الحساسة، وتوليد ملفات .asset.php برقم تجزئة (Hash) مشفر.

2. أوامر جودة الكود وتنسيقه (Code Quality & Formatting):

  • wp-scripts lint-js & wp-scripts lint-style:

    فحص ملفات الجافاسكريبت والـ CSS وفق معايير الكود الرسمية المعتمدة لمجتمع ووردبريس العالمي، ورصد الأخطاء الشائعة وحقول الـ a11y المفقودة.

  • wp-scripts format:

    الأمر السحري الذي يصلح كافة المسافات والأسطر تلقائياً عبر Prettier المجهز بأسلوب ووردبريس المعتمد.

3. أوامر الاختبارات الآلية (Automated Testing Commands):

  • wp-scripts test-unit-js:

    تشغيل اختبارات الوحدة باستخدام محرك Jest المجهز ببيئة محاكاة ووردبريس الرسمية (@wordpress/jest-preset-default).

  • wp-scripts test-e2e:

    تشغيل اختبارات التكامل الشاملة (End-to-End Tests) باستخدام متصفح Playwright أو Puppeteer لمحاكاة ضغطات المحرر في لوحة التحكم الحقيقية.

4. أمر التجهيز والنشر النهائي (Packaging):

  • wp-scripts plugin-zip:

    يقوم بإنشاء ملف أرشيف مضغوط جاهز للتثبيت .zip باسم إضافتك، مع استبعاد مجلد node_modules، ومجلد src، وملفات الاختبار، وملفات التكوين، وتضمين ملفات الإنتاج فقط!

تطبيق عملي كامل: إعداد ملف package.json الشامل والتكوينات المخصصة

1. ملف package.json المحترف لبيئة الإنتاج

{
  "name": "enterprise-furniture-catalog",
  "version": "1.0.0",
  "description": "إضافة كتالوج مصانع أثاث دمياط المعتمدة على محرر Gutenberg.",
  "author": "Mohamed Abozaid",
  "license": "GPL-2.0-or-later",
  "main": "build/index.js",
  "scripts": {
    "start": "wp-scripts start",
    "build": "wp-scripts build",
    "lint:js": "wp-scripts lint-js",
    "lint:js:fix": "wp-scripts lint-js --fix",
    "lint:css": "wp-scripts lint-style",
    "format": "wp-scripts format",
    "test": "wp-scripts test-unit-js",
    "test:watch": "wp-scripts test-unit-js --watch",
    "packages-update": "wp-scripts packages-update",
    "plugin-zip": "wp-scripts plugin-zip"
  },
  "devDependencies": {
    "@wordpress/scripts": "^27.0.0"
  },
  "dependencies": {
    "@wordpress/block-editor": "^12.0.0",
    "@wordpress/blocks": "^12.0.0",
    "@wordpress/components": "^25.0.0",
    "@wordpress/data": "^9.0.0",
    "@wordpress/element": "^5.0.0",
    "@wordpress/i18n": "^4.0.0"
  }
}

2. تمديد تكوين الـ Linter: ملف .eslintrc.js

إذا أردت تخصيص بعض القواعد الصارمة لفريقك (مثل حظر استخدام console.log في كود التطوير)، يمكنك إنشاء ملف .eslintrc.js خفيف يمدد إعدادات ووردبريس الرسمية:

/**
 * تخصيص قواعد ESLint مع الحفاظ على معايير ووردبريس
 * File: .eslintrc.js
 */
module.exports = {
    extends: [ 'plugin:@wordpress/eslint-plugin/recommended' ],
    rules: {
        'no-console': [ 'warn', { allow: [ 'warn', 'error' ] } ],
        'react-hooks/exhaustive-deps': 'error', // إلزام المطورين بتحديد مصفوفة الاعتماديات بدقة
    },
};

3. تخصيص قواعد التنسيق التلقائي: ملف .prettierrc.js

/**
 * تخصيص Prettier لتطابق أسلوب كتابة كود ووردبريس الرسمي
 * File: .prettierrc.js
 */
const defaultConfig = require( '@wordpress/prettier-config' );

module.exports = {
    ...defaultConfig,
    singleQuote: true,
    trailingComma: 'es5',
};

تشريح أمر wp-scripts plugin-zip: كيف تحمي إصداراتك من تسريب الملفات؟

من أكبر الأخطاء التي يقع فيها المطورون عندما ينتهون من برمجة إضافتهم هي الذهاب لمجلد الإضافة بالماوس، والضغط بالزر الأيمن واختيار: “Compress / ضغط إلى ZIP”!

لماذا يُعتبر الضغط اليدوي جريمة هندسية؟

  • يقوم بضغط مجلد node_modules الذي يحتوي أحياناً على أكثر من 40,000 ملف و 400 ميجابايت من ملفات بيئة التطوير غير المفيدة للمستخدم!
  • يرفع ملفات الكود المصدري غير المجمعة في مجلد src/، وملفات الـ .git السرية، ومفاتيح البيئة التجريبية.
  • يتسبب في فشل تثبيت الإضافة على خوادم الاستضافة المشتركة بسبب تجاوز حدود الـ Upload Limit المسموحة في PHP.

الحل مع wp-scripts plugin-zip:

عند تشغيل npm run plugin-zip، تبحث الأداة تلقائياً عن ملف .filesignore أو تعتمد على قائمة الاستثناءات الافتراضية الذكية، وتقوم بنسخ:

  1. الملف الرئيسي للإضافة (مثل my-plugin.php).
  2. مجلد build/ الذي يحتوي على ملفات الإنتاج المجمعة وملفات .asset.php فقط.
  3. ملف readme.txt وملفات التراخيص.

وتتجاهل تماماً كل ما دون ذلك، لينتج ملف ZIP نظيف ومحكم لا يتعدى حجمه بضع مئات من الكيلوبايتات!

دراسة حالة واقعية: أزمة بوابة مصانع أثاث دمياط وسقوط سيرفر الاستضافة المشتركة

خلفية المشروع وأبعاد الأزمة

بوابة إلكترونية وكتالوج صناعي كبرى في مصر تجمع أكثر من 300 مصنع وورشة لتصنيع الأثاث الخشبي والموبيليا في محافظة دمياط، تقدم معارض افتراضية وكتالوجات أسعار للمستوردين في الخليج وأوروبا. تم بناء كتالوج المنتجات باستخدام إضافة ووردبريس مخصصة تحتوي على 5 بلوكات لعرض الغرف، ومعارض الأقمشة، وحاسبة الشحن البحري.

الأزمة التشخيصية (The Crisis)

المطور المسؤول عن إطلاق التحديث الجديد قام بإنشاء ملف الـ ZIP الخاص بالإضافة بالضغط اليدوي المباشر:

  • الملف المضغوط تضمن مجلد node_modules بالكامل ومجلدات الـ Git وملفات الـ Cache، ووصل حجم ملف الـ ZIP إلى 485 ميجابايت!
  • أثناء محاولة مدير الموقع رفع التحديث عبر لوحة تحكم ووردبريس على خادم الاستضافة المشتركة، امتلأت مساحة القرص الصلب المخصصة للاستضافة (Disk Quota Exceeded) بالكامل!
  • توقفت قاعدة البيانات وسقطت البوابة بالكامل بخطأ 500 Internal Server Error في أول أيام انطلاق “معرض دمياط للأثاث”، وهو التوقيت الأهم لتعاقدات التصدير السنوية!
  • فقد الموقع آلاف الزيارات الدولية من المشترين، وتلقى مسؤولو الغرفة التجارية بدمياط عشرات الاتصالات الغاضبة من أصحاب المصانع الذين دفعوا اشتراكات سنوية للإعلان عن منتجاتهم.

الحل المعماري الجذري (The Architectural Solution)

تم استدعاء مهندس عمليات ووردبريس لإصلاح الكارثة وإعادة الموقع للخدمة:

  1. تنظيف خادم الاستضافة فوراً وحذف الملفات المؤقتة المتراكمة لاستعادة مساحة القرص وتشغيل قاعدة البيانات.
  2. دمج حزمة @wordpress/scripts الرسمية وتفعيل أمر wp-scripts plugin-zip داخل ملف package.json.
  3. تشغيل أمر الإنتاج المنضبط، مما أنتج ملف ZIP نهائي بحجم 420 كيلوبايت فقط (بدلاً من 485 ميجابايت)!
  4. تثبيت الإضافة في ثوانٍ معدودة، وتشغيل الكتالوج بكامل ميزاته التفاعلية السريعة واجتياز موسم المعرض بنجاح باهر.

جدول قياس مؤشرات الأداء والتحول الهيكلي (Metrics Table)

مؤشر الأداء والتشغيلأثناء الأزمة (الضغط اليدوي الفوضوي)بعد التحول لـ wp-scripts plugin-zipنسبة التحسن والوفر المحقق
حجم ملف تثبيت الإضافة (Release Zip)485.4 ميجابايت (تجاوز سعة الاستضافة)420 كيلوبايت فقط (فائق الخفة)تقليص حجم ملف التوزيع بنسبة 99.91%!
استهلاك مساحة القرص على السيرفرامتلاء بنسبة 100% وسقوط السيرفرأقل من 3% استهلاك طبيعيحماية استقرار السيرفر ومنع التوقف
زمن رفع وتثبيت الإضافة في لوحة التحكمفشل كامل وتوقف عند مهلة PHP Timeoutثانيتان فقط للرفع والتفعيل الفوريوفر زمني وتشغيلي فوري بنسبة 100%
أمان الملفات البرمجية والأسرار الداخليةتسريب كامل لكود التطوير وملفات Gitعزل تام وحماية لكافة أسرار الكودحماية الملكية الفكرية وسلامة الإضافة

الوصايا العشر للعمل بحزمة @wordpress/scripts

  1. اعتمد على wp-scripts build دائماً في الإنتاج: لا ترفع كوداً تم بناؤه بـ start على السيرفر الحي أبداً.
  2. استخدم wp-scripts plugin-zip لضغط الإصدارات: هو الضمان الوحيد لمنع تسريب ملفات node_modules والـ Git إلى ملف التوزيع.
  3. فعل أوامر التدقيق (Linting) قبل كل Commit: اجعل تشغيل npm run lint:js طقساً يومياً للحفاظ على جودة الكود.
  4. استفد من npm run format لإراحة فريقك: دع Prettier يتولى ضبط المسافات والفواصل بضغطة زر واحدة بدلاً من الجدال حول التنسيق.
  5. حدث حزمك دورياً بـ packages-update: استخدم wp-scripts packages-update للتأكد من مواكبة أحدث إصلاحات ووردبريس الأمنية.
  6. احفظ ملف package-lock.json في Git: لضمان أن كل المطورين وخوادم الـ CI/CD يقومون بتثبيت نفس الإصدارات الدقيقة للحزم.
  7. لا تعدل ملفات مجلد build يدوياً: أي تعديل داخل build/ سيتم مسحه في عملية البناء التالية؛ التعديل مكانه src/ دائماً.
  8. اكتب اختبارات وحدة للمكونات الحساسة: شغل npm test للتأكد من أن حساباتك المالية والمنطقية تعمل قبل إرسال الكود للعميل.
  9. تأكد من وجود ملف .asset.php بعد البناء: احرص دائماً على التحقق من أن ملف الأصول قد تم توليده بنجاح قبل رفعه للسيرفر.
  10. وثق أوامر الـ NPM في الـ Readme لفريقك: اشرح للمطورين الجدد في شركتك كيفية تشغيل npm start و npm run build للبدء فوراً دون عناء.

معمارية الاختبارات الشاملة (End-to-End Testing with Playwright)

يا صديقي المطور، اختبارات الوحدة (Unit Tests) ممتازة لفحص الدوال الحسابية والـ Reducers، لكنها لا تضمن أن البلوك يعمل بشكل حقيقي داخل متصفح ووردبريس الفعلي! هل زر الإدراج يفتح بنافذة منبثقة؟ هل السحب والإفلات يضع البلوك في مكانه الدقيق؟ هل الضغط على “نشر” يحفظ البيانات في قاعدة بيانات MySQL الحقيقية؟

هنا يأتي دور اختبارات الـ End-to-End (E2E Testing) المدمجة في @wordpress/scripts عبر أمر wp-scripts test-e2e بالاعتماد على محرك Playwright فائق التطور.

كود عملي متكامل: اختبار E2E لإدراج وتعديل البلوك في بيئة ووردبريس حقيقية

/**
 * فحص شامل لدورة حياة البلوك داخل متصفح حقيقي عبر Playwright
 * File: test/e2e/furniture-block.spec.js
 */
import { test, expect } from '@wordpress/e2e-test-utils-playwright';

test.describe( 'فحص سلامة بلوك كتالوج الأثاث (enterprise/furniture-catalog)', () => {
    test.beforeEach( async ( { admin } ) => {
        // إنشاء مقال جديد وتسجيل الدخول كمدير نظام تلقائياً
        await admin.createNewPost();
    } );

    test( 'يجب أن يدرج البلوك بنجاح ويسمح بتعديل مواصفات الخشب في الشريط الجانبي', async ( { editor, page } ) => {
        // 1. إدراج البلوك عبر محرك البحث في المحرر
        await editor.insertBlock( { name: 'enterprise/furniture-catalog' } );

        // 2. التحقق من ظهور البلوك على الشاشة
        const blockLocator = page.locator( '[data-type="enterprise/furniture-catalog"]' );
        await expect( blockLocator ).toBeVisible();

        // 3. كتابة عنوان الكتالوج داخل حقل RichText
        await editor.canvas.locator( '.az-furniture-title' ).fill( 'صالون كلاسيكي مذهب - خشب زان أحمر' );

        // 4. فتح شريط الإعدادات الجانبي وتعديل خيار نوع الخشب
        await page.click( 'button[aria-label="إعدادات البلوك"]' );
        await page.selectOption( 'select[label="نوع الخشب"]', 'beech_wood' );

        // 5. الضغط على زر نشر المقال الرسمي في ووردبريس
        await editor.publishPost();

        // 6. فتح المقال المنشور في الواجهة الأمامية والتأكد من مطابقة كود الـ HTML
        const publishedUrl = await editor.getPublishedPostUrl();
        await page.goto( publishedUrl );

        const frontendHeading = page.locator( '.az-furniture-card h3' );
        await expect( frontendHeading ).toHaveText( 'صالون كلاسيكي مذهب - خشب زان أحمر' );
    } );
} );

القوة الهندسية لاختبارات E2E:
هذا الاختبار يقوم بتشغيل متصفح Chromium في الخلفية، ويفتح لوحة تحكم ووردبريس، ويكتب المقال، وينشره، ويزور الموقع كزائر عادي ويتأكد من أن التصميم يعمل بنسبة 100%! هذا هو أعلى مستوى من الجودة البرمجية التي يمكن أن تقدمها لعملائك في المشاريع الكبرى.

فحص التراخيص والامتثال القانوني: أمر wp-scripts check-licenses

ووردبريس مبني على رخصة GPLv2 (أو أحدث) الحرة. عندما تقوم بتطوير إضافة تجارية أو إضافة ستنشرها على دليل ووردبريس الرسمي (WordPress.org Plugin Directory)، فأنت ملزم قانونياً بالتأكد من أن كافة الحزم والمكتبات التي قمت بتثبيتها عبر npm تتوافق مع ترخيص الـ GPL ولا تحتوي على رخص احتكارية مقيدة (Proprietary / Non-commercial Licenses).

توفر الحزمة أمراً رقابياً شديد الذكاء:

npm run wp-scripts check-licenses -- --gpl2

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

معمارية الـ Monorepo وإدارة الحزم المتعددة (Workspaces Integration)

في الشركات الكبرى التي تمتلك حزمة تضم 10 إضافات مختلفة أو قوالب متعددة تعتمد على نفس نظام التصميم، فإن إنشاء مستودع منفصل لكل إضافة يسبب تكراراً شاقاً لملفات الـ package.json وأدوات البناء.

باستخدام ميزة npm Workspaces مع @wordpress/scripts، يمكنك إنشاء مستودع موحد (Monorepo):

my-enterprise-suite/
├── package.json (يحتوي على: "workspaces": ["packages/*", "plugins/*"])
├── node_modules/ (نسخة موحدة لكافة المشاريع)
├── plugins/
│   ├── furniture-core/
│   │   ├── package.json
│   │   └── src/
│   └── furniture-shipping/
│       ├── package.json
│       └── src/
└── packages/
    └── design-system/
        ├── package.json
        └── src/

بتشغيل أمر واحد في جذر المشروع: npm run build --workspaces، تتولى @wordpress/scripts تجميع كافة الإضافات والبلوكات بالتوازي في وقت قياسي وبأقل استهلاك لمساحة التخزين على القرص الصلب.

مراقبة أحجام الحزم برمجياً: دمج Webpack Bundle Analyzer في بيئات CI/CD

يا صديقي العزيز، أكبر مصيبة ممكن تواجهك في مشاريع ووردبريس الضخمة هي ما نسميه “تسلل التبعيات الصامت” (Silent Dependency Creep). المطور يكتب كود جميل وسريع، وفجأة يقرر يعمل npm install moment عشان ينسق تاريخ بسيط في بلوك واحد، أو يجلب مكتبة أيقونات كاملة حجمها 4 ميجابايت عشان يستخدم أيقونة سهم واحدة! لو ما عندكش رادار بيكتشف الكارثة دي في مسار الـ CI/CD (Continuous Integration)، هتلاقي حجم حزمة الجافا سكريبت الخاصة بالقالب أو الإضافة تضخم بشكل مرعب، والعميل في مصر يشتكي من بطء المتجر وتحميل الصفحة على شبكات الموبايل الضعيفة.

عشان نمنع الجريمة دي قبل ما توصل للإنتاج، بنستخدم حزمة webpack-bundle-analyzer مع دمج فحص تلقائي في GitHub Actions أو GitLab CI يتحقق من ميزانية الأداء (Performance Budget). إليك الكود الاحترافي لتفعيل المحلل في ملف webpack.config.js المخصص بدون ما يبطئ بيئة التطوير اليومية:


// webpack.config.js
const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
const { BundleAnalyzerPlugin } = require( 'webpack-bundle-analyzer' );

module.exports = {
	...defaultConfig,
	plugins: [
		...defaultConfig.plugins,
		// بنشغل المحلل فقط لما نمرر متغير بيئة محدد ANALYZE=true في التيرمينال
		process.env.ANALYZE === 'true' &&
			new BundleAnalyzerPlugin( {
				analyzerMode: 'static',
				reportFilename: 'bundle-report.html',
				openAnalyzer: false, // مش عايزين نفتح المتصفح أوتوماتيك في سيرفر الـ CI
				generateStatsFile: true,
				statsFilename: 'bundle-stats.json',
			} ),
	].filter( Boolean ), // تنظيف القيم الزائفة (falsy values) بأمان تام
};

بمجرد ما تضيف الإعداد ده، تقدر تضيف سكريبت مخصص في package.json: "analyze": "ANALYZE=true wp-scripts build". لما تشغل الأمر ده، هيتولد ملف تقرير HTML تفاعلي يوريك شجرة الحزم بالمليمتر، مين المكتبة اللي واخدة أكبر مساحة، ومين الملفات المكررة اللي محتاجة معالجة عبر externals أو Dynamic Imports.

قواعد ذهبية لضمان عمل Tree-Shaking بكفاءة 100%

كتير من المطورين يعتقدوا إن Webpack بيعمل Tree-Shaking تلقائياً بمجرد تشغيل نمط الإنتاج (Production Mode)، لكن الواقع الصادم إنك لو استوردت دالة بطريقة خاطئة من مكتبة بتدعم الـ CommonJS فقط أو فيها Side Effects غير معلنة، المترجم هيحزم المكتبة كلها بالكامل! عشان تضمن إن الحزم تطلع رشيقة وخفيفة:

  • تأكد من تفعيل “sideEffects”: false: في ملف package.json الخاص بمشروعك أو الإضافة، إعلان "sideEffects": false بيعطي Webpack الضوء الأخضر لإسقاط أي ملف أو دالة مش مستخدمة دون خوف. لو عندك ملفات CSS بيتم استيرادها، حددها في المصفوفة: "sideEffects": ["*.css", "*.scss"].
  • الاعتماد الكامل على ES Modules: تجنب نهائياً استخدام require() داخل ملفات كود الواجهة الأمامية، واستخدم دائماً import { specificFunction } from 'package'. المترجم لا يستطيع تحليل الـ CommonJS استاتيكياً بنفس كفاءة الـ ESM.
  • فصل كود لوحة التحكم عن كود الواجهة: لا تجمع كود الـ Edit الخاص ببلوكات جوتنبرج مع كود الـ Frontend Scripts في ملف إدخال واحد (Entry Point). كود التحرير بيحتاج مكتبات UI ضخمة مثل @wordpress/components مش مفروض الزائر العادي يحمل منها بايت واحد في المتصفح!

الأسئلة الشائعة حول حزمة @wordpress/scripts (20 سؤالاً وجواباً تفصيلياً)

1. ما هي الفلسفة الأساسية لحزمة @wordpress/scripts؟

فلسفة “Zero-Configuration”؛ توفير بيئة تطوير وبناء كاملة مجهزة بـ Webpack، Babel، ESLint، Jest، و Prettier دون حاجة المطور لكتابة إعدادات يدوية معقدة.

2. كيف أثبت حزمة @wordpress/scripts في مشروعي؟

بتشغيل الأمر: npm install @wordpress/scripts --save-dev داخل مجلد إضافتك البرمجية.

3. ما الفارق بين wp-scripts start و wp-scripts build؟

الأمر start يشغل وضع المراقبة الحية أثناء التطوير مع Source Maps سريعة، بينما build يضغط الكود للإنتاج بأعلى أداء ويحذف أكواد التنقيح.

4. ماذا يفعل أمر wp-scripts plugin-zip بالتحديد؟

يقوم بإنشاء ملف .zip نهائي جاهز للنشر يحتوي على ملفات الإنتاج و build/ فقط مع استبعاد node_modules و src/ وملفات الاختبار.

5. كيف أصلح أخطاء التنسيق تلقائياً باستخدام الحزمة؟

بتشغيل الأمر npm run format الذي يستدعي Prettier ويعيد تنسيق الملفات وفق المعايير الرسمية لنواة ووردبريس.

6. هل يمكن تشغيل اختبارات Jest باستخدام @wordpress/scripts؟

نعم؛ عبر أمر wp-scripts test-unit-js الذي يأتي مجهزاً ببيئة محاكاة ووردبريس دون أي تكوين إضافي.

7. كيف أحدث كافة حزم @wordpress/* لأحدث إصدار مستقر بضغطة واحدة؟

بتشغيل الأمر المدمج wp-scripts packages-update الذي يفحص ملف package.json ويرقي الحزم آلياً.

8. ما هو ملف .filesignore وكيف يفيد أمر plugin-zip؟

هو ملف نصي يمكنك وضعه في جذر المشروع لتحديد ملفات ومجلدات إضافية ترغب في استبعادها من ملف الـ ZIP النهائي المضغوط.

9. كيف أخصص قواعد الـ ESLint دون كسر إعدادات ووردبريس الافتراضية؟

بإنشاء ملف .eslintrc.js يحتوي على extends: [ 'plugin:@wordpress/eslint-plugin/recommended' ] وإضافة قواعدك المخصصة بداخل كائن rules.

10. هل تدعم الحزمة لغة TypeScript تلقائياً؟

نعم بالكامل؛ بمجرد تسمية الملفات بصيغة .ts أو .tsx ووجود ملف tsconfig.json، يقوم خط البناء بترجمتها وتجميعها بسلاسة.

11. أين يضع أمر البناء الملفات الناتجة افتراضياً؟

يضعها تلقائياً داخل مجلد build/ في جذر المشروع، متضمناً ملفات الـ JS والـ CSS وملفات .asset.php المرافقة.

12. كيف أشغل فحص الأنماط والـ CSS فقط؟

بتشغيل الأمر wp-scripts lint-style الذي يفحص ملفات الـ CSS و الـ SCSS وفق معايير Stylelint الرسمية.

13. ما هي ميزة خيار --watch في اختبارات Jest؟

يقوم بمراقبة ملفات الاختبارات وإعادة تشغيل الفحوصات فورياً في كل مرة تقوم فيها بتعديل كود الدالة أو الاختبار.

14. هل يمكن استخدام الحزمة لبناء قوالب ووردبريس (Themes) وليس إضافات فقط؟

نعم بكل تأكيد؛ الحزمة مثالية لبناء سكريبتات وتنسيقات القوالب الكلاسيكية وقوالب الكتل الحديثة (Block Themes) بنفس الكفاءة.

15. كيف أمنع ارتكاب أكواد مخالفة للمعايير في مستودع Git؟

بربط أمر wp-scripts lint-js بأدوات Pre-commit Hooks مثل Husky و lint-staged لمنع عمل Commit إذا كانت هناك أخطاء برمجية.

16. ماذا يحدث إذا كان هناك خطأ لغوي (Syntax Error) أثناء تشغيل wp-scripts start؟

يطبع لك سطر الخطأ والملف ورقم السطر بوضوح في الـ Terminal، ويظل الخادم يعمل بانتظار تصحيحك للملف دون الحاجة لإعادة تشغيل الأمر.

17. كيف أتحقق من توافق إصدار Node.js مع الحزمة؟

بتشغيل الأمر wp-scripts check-engines الذي يتحقق من تطابق إصدارات Node و npm مع متطلبات الحزمة الرسمية.

18. هل تدعم الحزمة معالجة التنسيقات بواسطة PostCSS و Autoprefixer؟

نعم؛ يتم تطبيق PostCSS و Autoprefixer تلقائياً على كافة ملفات الـ CSS والـ SCSS المجمعة لضمان التوافق مع المتصفحات القديمة.

19. لماذا يُنصح بتثبيت الحزمة كـ devDependencies؟

لأنها أدوات بناء وتجميع تعمل فقط على جهاز المطور وفي خطوط الـ CI/CD، ولا حاجة لتحميلها على خادم الإنتاج الحي للموقع.

20. ما هي الحكمة الهندسية الذهبية في استخدام @wordpress/scripts؟

“لا تصارع أدوات البناء بمفردك؛ سلم أمر التجميع والتدقيق لـ @wordpress/scripts، وكرس عبقريتك لتصميم تجارب تحرير ساحرة لعملائك”.

الصورة الرمزية لـ Mohamed Abozaid

م. محمد أبو زيد

WordPress Architect & Enterprise Consultant

مهندس برمجيات متخصص في تطوير حلول ووردبريس المتقدمة، معمارية Block Themes، ومحرر Gutenberg، وتحسين الأداء لمواقع الشركات الكبرى في مصر والخليج العربي.


اترك تعليقاً