الفرق بين المراجعتين ل"Next.js/image optimization"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(مراجعة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:مكوّن الصورة وتحسين الصور في Next.js}}</noinclude>
+
<noinclude>{{DISPLAYTITLE:مكون الصورة وتحسين الصور في Next.js}}</noinclude>
يُعدّ مكون الصورة في Next.js امتدادًا لعنصر الصورة <code><img></code> في [[HTML]] وقد طُوِّر ليماشي تقنيات ويب الحديثة. يتضمن العنصر العديد من محسنات الأداء المدمجة معه ليساعدك في تحقيق نتيجة جيدة [https://web.dev/vitals/#core-web-vitals لمؤشرات ويب الحيوية] Core Web Vitals التي طوّرتها Google. تمثل هذه النتائج مقياسًا مهمًا لتجربة المستخدم خلال زيارته لموقعك، كما تؤثر على ترتيب نتائج البحث في Google.
+
يُعدّ مكون الصورة في Next.js امتدادًا لعنصر الصورة <code>[[HTML/img|<img>]]</code> في [[HTML]] وقد طُوِّر ليماشي تقنيات ويب الحديثة. يتضمن العنصر العديد من محسنات الأداء المدمجة معه ليساعدك في تحقيق نتيجة جيدة [https://web.dev/vitals/#core-web-vitals لمؤشرات ويب الحيوية] Core Web Vitals التي طوّرتها Google. تمثل هذه النتائج مقياسًا مهمًا لتجربة المستخدم خلال زيارته لموقعك، كما تؤثر على ترتيب نتائج البحث في Google.
  
 
إليك بعض محسنات الأداء المدمجة في مكوِّن الصورة:
 
إليك بعض محسنات الأداء المدمجة في مكوِّن الصورة:
  
* أداء محسّن Improved Performance: يقدّم دومًا صورًا بالقياس الملائم لكل جهاز باستخدام التنسيقات الحديثة للصور.
+
* '''أداء محسّن Improved Performance''': يقدّم دومًا صورًا بالقياس الملائم لكل جهاز باستخدام التنسيقات الحديثة للصور.
* ثباتية بصرية Visual Stability: يمنع تلقائيًا مشكلة الانزياح التراكمي للتخطيط Cumulative Layout Shift.
+
* '''ثباتية بصرية Visual Stability''': يمنع تلقائيًا مشكلة الانزياح التراكمي للتخطيط Cumulative Layout Shift.
* تحميل أسرع للصفحة Faster Page Loads: تُحمّل الصور عندما تدخل نافذة العرض viewport فقط، مع خيار تغشية مساحة الصورة blur-up.
+
* '''تحميل أسرع للصفحة Faster Page Loads''': تُحمّل الصور عندما تدخل نافذة العرض viewport فقط، مع خيار تغشية مساحة الصورة blur-up.
* مرونة الموجودات Asset Flexibility: وذلك لإعادة تحجيم الصورة حتى لو كانت مخزّنة على خوادم بعيدة.
+
* '''مرونة في الحجم Asset Flexibility''': وذلك لإعادة تحجيم الصورة حتى لو كانت مخزّنة على خوادم بعيدة.
  
== استخدام مكوِّن الصورة في Next.js ==
+
== استخدام مكون الصورة Image في Next.js ==
 
لإضافة صورة إلى تطبيقك، أدرج المكوِّن [[Next.js/next image|<code>next/image</code>]]:<syntaxhighlight lang="javascript">
 
لإضافة صورة إلى تطبيقك، أدرج المكوِّن [[Next.js/next image|<code>next/image</code>]]:<syntaxhighlight lang="javascript">
 
import Image from 'next/image'
 
import Image from 'next/image'
</syntaxhighlight>بإمكانك الآن تعريف السمة <code>src</code> لصورتك (سواء عنوان محلي أو بعيد)
+
</syntaxhighlight>بإمكانك الآن تعريف السمة <code>src</code> لصورتك (سواء عنوان محلي أو بعيد).
  
 
=== الصور المحلية ===
 
=== الصور المحلية ===
 
أدرج ملفات الصور المحلية التي تمتلك أحد الامتدادات التالية <code>jpg.</code> أو <code>png.</code> أو <code>webp.</code>:<syntaxhighlight lang="javascript">
 
أدرج ملفات الصور المحلية التي تمتلك أحد الامتدادات التالية <code>jpg.</code> أو <code>png.</code> أو <code>webp.</code>:<syntaxhighlight lang="javascript">
 
import profilePic from '../public/me.png'
 
import profilePic from '../public/me.png'
</syntaxhighlight>لا تدعم Next.js الدوال الديناميكية التالية: <code>()await import</code> أو <code>()require</code>، ولا بد أن يكون الإدراج <code>import</code> ساكنًا لكي يُحلل أثناء بناء التطبيق. تحدد Next.js تلقائيًا ارتفاع <code>height</code> واتساع <code>width</code> الصورة وفقًا للملف المُدرج. وتستخدم هاتين القيميتن في منع الانزياح التراكمي للتخطيط أثناء تحميل الصورة.<syntaxhighlight lang="javascript">
+
</syntaxhighlight>لا تدعم Next.js الدوال الديناميكية التالية هنا: <code>()await import</code> أو <code>()require</code>، ولا بد أن يكون الإدراج <code>import</code> ساكنًا لكي يُحلل أثناء بناء التطبيق، إذ تحدد تلقائيًا ارتفاع <code>height</code> واتساع <code>width</code> الصورة وفقًا للملف المُدرج. وتستخدم هاتين القيميتن في منع الانزياح التراكمي للتخطيط أثناء تحميل الصورة.<syntaxhighlight lang="javascript">
 
import Image from 'next/image'
 
import Image from 'next/image'
 
import profilePic from '../public/me.png'
 
import profilePic from '../public/me.png'
سطر 59: سطر 59:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== النطاقات ===
+
=== النطاقات Domains ===
قد تريد أحيانًا الوصول إلى صورة على خادم بعيد باستخدام الواجهة البرمجية الخاصة بتحسين الصورة والمدمجة مع Next.js. لهذا، أبقِ على الإعدادت الافتراضية للمُحمِّل <code>loader</code> وضع عنوان URL المطلق للصورة كقيمة للخاصية <code>src</code>. ولتحمي تطبيقك من المستخدمين المشبوهين، لا بد من إعداد قائمة بأسماء النطاقات البعيدة التي تنوي الوصول إليها وفق هذا الأسلوب. هيّئ الأمر ضمن الملف <code>next.config.js</code> كما يلي:<syntaxhighlight lang="javascript">
+
قد تريد أحيانًا الوصول إلى صورة على خادم بعيد باستخدام الواجهة البرمجية الخاصة بتحسين الصورة والمدمجة مع Next.js. لهذا، أبقِ على الإعدادت الافتراضية للمُحمِّل <code>loader</code> وضع عنوان URL المطلق للصورة كقيمة للخاصية <code>src</code>. ولتحمي تطبيقك من المستخدمين المشبوهين، لا بد من إعداد قائمة بأسماء النطاقات البعيدة التي تنوي الوصول إليها مع المكون <code>next/image</code>. انظر ضبط <code>[[Next.js/next image#.D8.A7.D9.84.D8.AE.D8.A7.D8.B5.D9.8A.D8.A9 remotePatterns|remoatePatters]]</code> من توثيق <code>[[Next.js/next image|next/image]]</code>.
module.exports = {
+
=== المُحمِّلات Loaders ===
  images: {
 
    domains: ['example.com', 'example2.com'],
 
  },
 
}
 
</syntaxhighlight>
 
 
 
=== المُحمِّلات ===
 
 
لاحظ كيف استخدمنا عنوان URL نسبي (<code>"me.png/"</code>) في المثال السابق، وهذا ممكن نظرًا لمعمارية [[Next.js/next image|المُحمّلات]] loader في Next.js. والمُحمِّل هو دالة تولّد عناوين URL للصور، وتلحق نطاقًا جذريًا بالعنوان الموجود في الخاصية <code>src</code>، ومن ثم يوّلد مجموعة عناوين URL لطلب الصورة بقياسات مختلفة. تُستخدم تلك العناوين في توليد مجموعة الموارد <code>srcset</code> لكي يقدم التطبيق أو الموقع الصورة التي تناسب واجهة عرض الجهاز.
 
لاحظ كيف استخدمنا عنوان URL نسبي (<code>"me.png/"</code>) في المثال السابق، وهذا ممكن نظرًا لمعمارية [[Next.js/next image|المُحمّلات]] loader في Next.js. والمُحمِّل هو دالة تولّد عناوين URL للصور، وتلحق نطاقًا جذريًا بالعنوان الموجود في الخاصية <code>src</code>، ومن ثم يوّلد مجموعة عناوين URL لطلب الصورة بقياسات مختلفة. تُستخدم تلك العناوين في توليد مجموعة الموارد <code>srcset</code> لكي يقدم التطبيق أو الموقع الصورة التي تناسب واجهة عرض الجهاز.
  
 
يُستخدم المحمِّل الافتراضي في الواجهة البرمجية المدمجة لتحسين الصورة والتي تحرص على تحسين الصورة أيًا كان موقعها، وتقدمها إلى التطبيق مباشرة من خادم Next.js. وإن أردت أن تحمّل الصورة مباشرة من شبكة إدارة محتوى CDN أو من خادم للصور، يمكنك استخدام أحد المُحمِّلات المدمجة أو أن تكتب شيفرة محمِّل خاص بك باستخدام JavaScript.
 
يُستخدم المحمِّل الافتراضي في الواجهة البرمجية المدمجة لتحسين الصورة والتي تحرص على تحسين الصورة أيًا كان موقعها، وتقدمها إلى التطبيق مباشرة من خادم Next.js. وإن أردت أن تحمّل الصورة مباشرة من شبكة إدارة محتوى CDN أو من خادم للصور، يمكنك استخدام أحد المُحمِّلات المدمجة أو أن تكتب شيفرة محمِّل خاص بك باستخدام JavaScript.
  
يمكن أن تُعرِّف المحمِّلات لتكون خاصة بصورة محددة أو على مستوى التطبيق ككل.
+
يمكن أن تُعرِّف المحمِّلات لتكون خاصة بصورة محددة عبر الخاصية <code>loader</code> أو على مستوى التطبيق ككل عبر الضبط <code>[[Next.js/next image|loaderFile]]</code>.
  
 
=== الأولوية ===
 
=== الأولوية ===
ينبغي أن تضيف الخاصية <code>priority</code> إلى الصورة التي تُعدُّ أضخم عنصر أثناء رسم الصفحة ضمن نافذة العرض Largest Contentful Paint (LCP) (يُعد زمن تصييرها مؤشرًا من مؤشرات ويب الحيوية) ولأي صورة يُحتمل أن تكون كذلك. يتيح ذلك لخادم Next.js أن يضع أولوية محددة للصورة عند تحميلها (من خلال وسوم ما قبل التحميل أو تلميحات الأولوية) مما يعزز قيمة مؤشر LCP.
+
ينبغي أن تضيف الخاصية <code>priority</code> إلى الصورة التي تُعدُّ أضخم عنصر أثناء رسم الصفحة ضمن نافذة العرض Largest Contentful Paint (تختصر إلى LCP ويُعد زمن تصييرها مؤشرًا من مؤشرات ويب الحيوية) ولأي صورة يُحتمل أن تكون كذلك. يتيح ذلك لخادم Next.js أن يضع أولوية محددة للصورة عند تحميلها (من خلال وسوم ما قبل التحميل أو تلميحات الأولوية) مما يعزز قيمة مؤشر LCP.
  
 
إن عنصر LCP هو نمطيًا الصورة الأضخم أو الكتلة النصية المرئية من الصفحة ضمن نافذة العرض. وعندما تنفذ الأمر <code>next dev</code> سترى تحذيرًا من قبل الطرفية إن كان هذا العنصر صورة <code><Image></code> لا تمتلك الخاصية <code>priority</code>.
 
إن عنصر LCP هو نمطيًا الصورة الأضخم أو الكتلة النصية المرئية من الصفحة ضمن نافذة العرض. وعندما تنفذ الأمر <code>next dev</code> سترى تحذيرًا من قبل الطرفية إن كان هذا العنصر صورة <code><Image></code> لا تمتلك الخاصية <code>priority</code>.
سطر 98: سطر 91:
 
   )
 
   )
 
}
 
}
</syntaxhighlight>للحصول على معلومات أكثر عن الأولولية راجع توثيق العنصر [[Next.js/next image|<code>next/image</code>]]  
+
</syntaxhighlight>للحصول على معلومات أكثر عن الأولولية راجع توثيق العنصر [[Next.js/next image|<code>next/image</code>]].
  
 
== تحجيم الصورة ==
 
== تحجيم الصورة ==
يُعد انزياح التخطيط من أكثر أسباب انخفاض الأداء نتيجة استخدام الصور. إذ تدفع فيها الصورة العناصر الأخرى في الصفحة عند تحميلها مسببةً مشكلةً مزعجةً للمستخدمين تُعرف بالانزياح التراكمي للتخطيط والتي تؤثر على المؤشرات الحيوية لويب. وللتخلص من هذه المشكلة التي تسببها الصور، لابد من تحجيم الصور دائمًا. يتيح هذا الأمر للمتصفح أن يحجز القدر الكافي من المساحة للصورة قبل تحميلها.  
+
يُعد انزياح التخطيط layout shift من أكثر أسباب انخفاض الأداء نتيجة استخدام الصور. إذ تدفع فيها الصورة العناصر الأخرى في الصفحة عند تحميلها مسببةً مشكلةً مزعجةً للمستخدمين تُعرف [https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D9%85%D8%A4%D8%B4%D8%B1-%D8%A7%D9%86%D8%B2%D9%8A%D8%A7%D8%AD-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84-%D8%A7%D9%84%D8%AA%D8%B1%D8%A7%D9%83%D9%85%D9%8A-cls-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AD%D8%B3%D9%8A%D9%86%D9%87-%D9%81%D9%8A-%D9%85%D9%88%D9%82%D8%B9%D9%83-r1563/ بالانزياح التراكمي للتخطيط] Cumulative Layout Shift أو CLS والتي تؤثر على المؤشرات الحيوية لويب. وللتخلص من هذه المشكلة التي تسببها الصور، لابد من تحجيم الصور دائمًا. يتيح هذا الأمر للمتصفح أن يحجز القدر الكافي من المساحة للصورة قبل تحميلها.  
  
 
ولأن الصور مصممةٌ لتضمن أداءً جيدًا، لن تتمكن من استخدامها بشكل يعزز المشكلة السابقة، وبالتالي لا بد من تحجيم الصور بإحدى الطرق التالية:
 
ولأن الصور مصممةٌ لتضمن أداءً جيدًا، لن تتمكن من استخدامها بشكل يعزز المشكلة السابقة، وبالتالي لا بد من تحجيم الصور بإحدى الطرق التالية:
سطر 107: سطر 100:
 
# تلقائيًا باستخدام الإدراج الساكن static import.
 
# تلقائيًا باستخدام الإدراج الساكن static import.
 
# صراحةً باستخدام الخاصيتين <code>width</code> و <code>height</code>.
 
# صراحةً باستخدام الخاصيتين <code>width</code> و <code>height</code>.
# ضمنًا باستخدام الخاصية <code>layout="fill"</code> التي تسمح للصورة بالتوسّع لتملأ مساحة العنصر الأب.
+
# ضمنًا باستخدام الخاصية <code>[[Next.js/next image|fill]]</code> التي تسمح للصورة بالتوسّع لتملأ مساحة العنصر الأب.
  
 
=== ماذا لو لم أستطع تحديد قياس الصورة؟ ===
 
=== ماذا لو لم أستطع تحديد قياس الصورة؟ ===
 
إن كنت تحاول الوصول إلى صور من مصدر دون أن تعرف قياسات هذه الصور فهنالك عدة أمور قد تساعدك:
 
إن كنت تحاول الوصول إلى صور من مصدر دون أن تعرف قياسات هذه الصور فهنالك عدة أمور قد تساعدك:
  
* استخدم القيمة <code>fill</code> للخاصية <code>layout</code>: يتيح هذا النمط أن تأخذ الصورة قياسات العنصر الأب. فلو افترضنا وجود تنسيقات CSS تعطي العنصر الأب للصورة مساحة محددة من الصفحة، يمكننا استخدام الخاصية <code>objectFit</code> وإسناد قيم لها مثل <code>contain</code> أو <code>cover</code> أو <code>fill</code> على التوازي مع استخدام الخاصية <code>objectPosition</code> لتحديد كيفية تموضع الصورة في المساحة المتاحة للعنصر الأب.
+
* استخدم القيمة <code>fill</code>: يتيح هذا النمط أن تأخذ الصورة قياسات العنصر الأب. فاعتمد وجود تنسيقات CSS تعطي العنصر الأب للصورة مساحة محددة من الصفحة مع الخاصية sizes لمطابقة أي نقاط استعلام media query. يمكنك استخدام الخاصية <code>object-fit</code> وإسناد قيم لها مثل <code>contain</code> أو <code>cover</code> أو <code>fill</code> على التوازي مع استخدام الخاصية <code>object-position</code> لتحديد كيفية تموضع الصورة في المساحة المتاحة للعنصر الأب.
* تسوية الصور Normalization: إن كنت تقدم صورًا تستطيع التحكم بمصدرها، فكّر في ضبط مجرى هذه الصور لكي تصلك بالقياس المناسب.
+
* تسوية الصور Normalization: إن كنت تقدم صورًا تستطيع التحكم بمصدرها (الخادم الموجودة عليه مثلًا)، فكّر في ضبط مجرى هذه الصور لكي تصلك بقياس مناسب أو موحد.
* عدّل استدعاءات الواجهة البرمجية: إن استخدم تطبيقك استدعاءات الواجهة البرمجية لإحضار عناوين للصور (من منظومة إدارة محتوى مثلًا)، قد تكون قادرًا على تعديل الدالة لإعادة الصورة مع أبعادها.
+
* تعديل استدعاءات الواجهة البرمجية: إن استخدم تطبيقك استدعاءات الواجهة البرمجية لإحضار عناوين للصور (من منظومة إدارة محتوى مثلًا)، قد تكون قادرًا على تعديل الدالة لإعادة الصورة مع أبعادها.
 
 
إن لم تفلح إحدى الطرق السابقة في تحديد قياس الصورة، فمكوّن الصورة في Next.js مصمم للعمل جيدًا في الصفحة إلى جانب عناصر الصور النمطية <code><img></code>.
 
  
== تنسيق الصور في Next.js ==
+
إن لم تفلح إحدى الطرق السابقة في تحديد قياس الصورة، فمكوّن الصورة في Next.js مصمم للعمل جيدًا في الصفحة إلى جانب عناصر الصور <code><img></code> النمطية كما لو استخدمتها مباشرةً.
لا يختلف تنسيق مكوّن الصورة في Next.js عن تنسيق الصور النمطية لكن لا بد من تذكر بعض الأشياء الهامة:
 
  
* اختر نمط التخطيط المناسب: لمكوّن الصور بعض [[Next.js/next image|أنماط التخطيط]] المختلفة التي تعرّف طريقة تحديد قياسها على الصفحة. فإن لم يجري تنسيق الصفحة كما أردت حاول أن تختبر تخطيطًا آخر.
+
== تنسيق الصور ==
* حاول أن تستهدف الصورة عبر اسم الصنف وليس هيكلية DOM: يمتلك مكوّن الصورة في أغلب التخطيطات شجرة DOM لعنصر الصورة النمطي <code><img></code> محاطًا بعنصر <code><nowiki><span></nowiki></code> واحد. وقد يوجد في بعض التخطيطيات عنصر <code><nowiki><span></nowiki></code> أخ لإضافة مساحة فارغة، وهذه العناصر مهمة جدًا لكي يتفادى المكوّن مشكلة انزياح التخطيط. إن الطريقة المحبّذة لتنسيق عنصر الصورة الداخلي <code><img></code> هو ضبط قيمة الخاصية <code>className</code> في مكوّن الصورة على القيمة [[Next.js/built in css support|<code>CSS Module</code>]] وستطبق هذه القيمة تلقائيًا على العنصر <code><img></code> داخله.
+
لا يختلف تنسيق مكوّن الصورة في Next.js عن تنسيق عنصر الصور <code><img></code> في HTML لكن لا بد من تذكر بعض الأشياء المهمة.
  
لا يمكن استخدام تنسيق [[Next.js/built in css support|styled-jsx]] لأنه لا يتعدى مجال المكوّن الحالي.
+
استعمل <code>className</code> أو <code>style</code> وليس styled-jsx: يفضل استخدام الخاصية <code>className</code> في أغلب الحالات للتنسيق سواءً عبر [[Next.js/built in css support#.D8.A5.D8.B6.D8.A7.D9.81.D8.A9 .D8.AA.D9.86.D8.B3.D9.8A.D9.82.D8.A7.D8.AA CSS .D8.B9.D9.84.D9.89 .D9.85.D8.B3.D8.AA.D9.88.D9.89 .D8.A7.D9.84.D9.85.D9.83.D9.88.D9.86.D8.A7.D8.AA|CSS Module]] أو [[Next.js/built in css support#.D8.A5.D8.B6.D8.A7.D9.81.D8.A9 .D8.AA.D9.86.D8.B3.D9.8A.D9.82.D8.A7.D8.AA CSS .D8.B9.D9.84.D9.89 .D8.B9.D9.85.D9.88.D9.85 .D8.A7.D9.84.D8.AA.D8.B7.D8.A8.D9.8A.D9.82|تنسيق عام]] أو غيره، أو يمكنك استعمال الخاصية <code>style</code> مباشرة ولكن لا يمكنك استعمال صياغة [[Next.js/built in css support|styled-jsx]] لأنه لا يتعدى مجال المكوّن الحالي إلا إن جرى تحديد التنسيق على أنه عام <code>global</code>.
  
'''ملاحظة''': عند استخدام التخطيط <code>'layout='fill</code> لا بد وأن يُضبط موقع العنصر الأب كالتالي: <code>position: relative</code>، وهذا ضروري لتصيير عنصر الصورة بشكل صحيح في نمط التخطيط الذي اخترته.
+
'''ملاحظة''': عند استخدام <code>fill</code> لا بد وأن يُضبط موقع العنصر الأب كالتالي: <code>position: relative</code>، وهذا ضروري لتصيير عنصر الصورة بشكل صحيح في نمط التخطيط الذي اخترته.
  
'''ملاحظة''': عند استخدام التخطيط <code>'layout='responsive</code> لا بد وأن يُضبط موقع العنصر الأب كالتالي: <code>position: block</code>، هذه القيمة افتراضية للعنصر <code><nowiki><div></nowiki></code> لكن ينبغي ضبطها لبقية العناصر.
+
'''ملاحظة''': عند استخدام <code>fill</code> لا بد وأن يُضبط موقع العنصر الأب كالتالي: <code>display: block</code>، هذه القيمة افتراضية للعنصر <code><nowiki><div></nowiki></code> لكن ينبغي ضبطها لبقية العناصر.
  
== الخاصيات التي تُطبق على مكوّن الصورة في Next.js ==
+
== الخاصيات التي يأخذها مكون الصورة ==
 
لمعلومات أوسع عن الخاصيات المتاحة للمكوّن <code>next/image</code>، اطلع على [[Next.js/next image|مرجع الواجهة البرمجية الخاص بهذا المكوّن]].  
 
لمعلومات أوسع عن الخاصيات المتاحة للمكوّن <code>next/image</code>، اطلع على [[Next.js/next image|مرجع الواجهة البرمجية الخاص بهذا المكوّن]].  
  
سطر 136: سطر 126:
 
راجع [https://image-component.nextjs.gallery معرض الأمثلة الخاص] بمكوّن الصور في Next.js.
 
راجع [https://image-component.nextjs.gallery معرض الأمثلة الخاص] بمكوّن الصور في Next.js.
  
== تهيئة الواجهة البرمجية لمكوّن الصور في Next.js ==
+
== تهيئة الواجهة البرمجية لمكون الصور ==
يمكن تهيئة الواجهة البرمجية لتحسين المكوّن <code>next/image</code> من خلال الملف [[Next.js/next.config.js|<code>next.config.js</code>]]، إذ يمكنك تفعيل الاتصال بنطاقات بعيدة وتعريف نقاط تفتيش مخصصة للصور وتغيير سلوك التخزين المؤقت وغيرها الكثير.
+
يمكن تهيئة الواجهة البرمجية لتحسين المكوّن <code>next/image</code> من خلال الملف [[Next.js/next.config.js|<code>next.config.js</code>]]، إذ يمكنك تفعيل الاتصال بنطاقات بعيدة وتعريف نقاط عرض breakpoints مخصصة للصور وتغيير سلوك التخزين المؤقت وغيرها الكثير.
  
 
اطلع على جميع توجيهات التهيئة لهذا المكوّن من خلال [[Next.js/next image|مرجع الواجهة البرمجية الخاص بهذا المكوّن]].
 
اطلع على جميع توجيهات التهيئة لهذا المكوّن من خلال [[Next.js/next image|مرجع الواجهة البرمجية الخاص بهذا المكوّن]].
 +
 +
== أمثلة ==
 +
 +
* [https://github.com/vercel/next.js/tree/canary/examples/image-component Image Component]
  
 
== المصادر ==
 
== المصادر ==
  
 
* الصفحة [https://nextjs.org/docs/basic-features/image-optimization Image Component and Image optimization] من توثيق Next.js الرسمي.
 
* الصفحة [https://nextjs.org/docs/basic-features/image-optimization Image Component and Image optimization] من توثيق Next.js الرسمي.

مراجعة 12:01، 5 نوفمبر 2022

يُعدّ مكون الصورة في Next.js امتدادًا لعنصر الصورة <img> في HTML وقد طُوِّر ليماشي تقنيات ويب الحديثة. يتضمن العنصر العديد من محسنات الأداء المدمجة معه ليساعدك في تحقيق نتيجة جيدة لمؤشرات ويب الحيوية Core Web Vitals التي طوّرتها Google. تمثل هذه النتائج مقياسًا مهمًا لتجربة المستخدم خلال زيارته لموقعك، كما تؤثر على ترتيب نتائج البحث في Google.

إليك بعض محسنات الأداء المدمجة في مكوِّن الصورة:

  • أداء محسّن Improved Performance: يقدّم دومًا صورًا بالقياس الملائم لكل جهاز باستخدام التنسيقات الحديثة للصور.
  • ثباتية بصرية Visual Stability: يمنع تلقائيًا مشكلة الانزياح التراكمي للتخطيط Cumulative Layout Shift.
  • تحميل أسرع للصفحة Faster Page Loads: تُحمّل الصور عندما تدخل نافذة العرض viewport فقط، مع خيار تغشية مساحة الصورة blur-up.
  • مرونة في الحجم Asset Flexibility: وذلك لإعادة تحجيم الصورة حتى لو كانت مخزّنة على خوادم بعيدة.

استخدام مكون الصورة Image في Next.js

لإضافة صورة إلى تطبيقك، أدرج المكوِّن next/image:

import Image from 'next/image'

بإمكانك الآن تعريف السمة src لصورتك (سواء عنوان محلي أو بعيد).

الصور المحلية

أدرج ملفات الصور المحلية التي تمتلك أحد الامتدادات التالية jpg. أو png. أو webp.:

import profilePic from '../public/me.png'

لا تدعم Next.js الدوال الديناميكية التالية هنا: ()await import أو ()require، ولا بد أن يكون الإدراج import ساكنًا لكي يُحلل أثناء بناء التطبيق، إذ تحدد تلقائيًا ارتفاع height واتساع width الصورة وفقًا للملف المُدرج. وتستخدم هاتين القيميتن في منع الانزياح التراكمي للتخطيط أثناء تحميل الصورة.

import Image from 'next/image'
import profilePic from '../public/me.png'

function Home() {
  return (
    <>
      <h1>My Homepage</h1>
      <Image
        src={profilePic}
        alt="Picture of the author"
        // width={500} يُحدد تلقائيًا
        // height={500} يُحدد تلقائيًا
        // blurDataURL="data:..." يُحدد تلقائيًا
        // placeholder="blur" // سيُحمل خيار التغشية
      />
      <p>Welcome to my homepage!</p>
    </>
  )
}

الصور البعيدة

لاستخدام صور موجودة على خادم بعيد، لا بد من استخدام عنوان URL كقيمة للخاصية src، وقد يكون هذا العنوان نسبي أو مطلق. لا بد من تحديد قيم ارتفاع واتساع الصورة والخاصية الاختيارية blurDataURL يدويًا، إذ لن تتمكن Next.js من الوصول إلى الملفات البعيدة أثناء عملية بناء التطبيق:

import Image from 'next/image'

export default function Home() {
  return (
    <>
      <h1>My Homepage</h1>
      <Image
        src="/me.png"
        alt="Picture of the author"
        width={500}
        height={500}
      />
      <p>Welcome to my homepage!</p>
    </>
  )
}

النطاقات Domains

قد تريد أحيانًا الوصول إلى صورة على خادم بعيد باستخدام الواجهة البرمجية الخاصة بتحسين الصورة والمدمجة مع Next.js. لهذا، أبقِ على الإعدادت الافتراضية للمُحمِّل loader وضع عنوان URL المطلق للصورة كقيمة للخاصية src. ولتحمي تطبيقك من المستخدمين المشبوهين، لا بد من إعداد قائمة بأسماء النطاقات البعيدة التي تنوي الوصول إليها مع المكون next/image. انظر ضبط remoatePatters من توثيق next/image.

المُحمِّلات Loaders

لاحظ كيف استخدمنا عنوان URL نسبي ("me.png/") في المثال السابق، وهذا ممكن نظرًا لمعمارية المُحمّلات loader في Next.js. والمُحمِّل هو دالة تولّد عناوين URL للصور، وتلحق نطاقًا جذريًا بالعنوان الموجود في الخاصية src، ومن ثم يوّلد مجموعة عناوين URL لطلب الصورة بقياسات مختلفة. تُستخدم تلك العناوين في توليد مجموعة الموارد srcset لكي يقدم التطبيق أو الموقع الصورة التي تناسب واجهة عرض الجهاز.

يُستخدم المحمِّل الافتراضي في الواجهة البرمجية المدمجة لتحسين الصورة والتي تحرص على تحسين الصورة أيًا كان موقعها، وتقدمها إلى التطبيق مباشرة من خادم Next.js. وإن أردت أن تحمّل الصورة مباشرة من شبكة إدارة محتوى CDN أو من خادم للصور، يمكنك استخدام أحد المُحمِّلات المدمجة أو أن تكتب شيفرة محمِّل خاص بك باستخدام JavaScript.

يمكن أن تُعرِّف المحمِّلات لتكون خاصة بصورة محددة عبر الخاصية loader أو على مستوى التطبيق ككل عبر الضبط loaderFile.

الأولوية

ينبغي أن تضيف الخاصية priority إلى الصورة التي تُعدُّ أضخم عنصر أثناء رسم الصفحة ضمن نافذة العرض Largest Contentful Paint (تختصر إلى LCP ويُعد زمن تصييرها مؤشرًا من مؤشرات ويب الحيوية) ولأي صورة يُحتمل أن تكون كذلك. يتيح ذلك لخادم Next.js أن يضع أولوية محددة للصورة عند تحميلها (من خلال وسوم ما قبل التحميل أو تلميحات الأولوية) مما يعزز قيمة مؤشر LCP.

إن عنصر LCP هو نمطيًا الصورة الأضخم أو الكتلة النصية المرئية من الصفحة ضمن نافذة العرض. وعندما تنفذ الأمر next dev سترى تحذيرًا من قبل الطرفية إن كان هذا العنصر صورة <Image> لا تمتلك الخاصية priority.

حالما تُعرّف الصورة LCP، بإمكانك إضافة الخاصية كالتالي:

import Image from 'next/image'

export default function Home() {
  return (
    <>
      <h1>My Homepage</h1>
      <Image
        src="/me.png"
        alt="Picture of the author"
        width={500}
        height={500}
        priority
      />
      <p>Welcome to my homepage!</p>
    </>
  )
}

للحصول على معلومات أكثر عن الأولولية راجع توثيق العنصر next/image.

تحجيم الصورة

يُعد انزياح التخطيط layout shift من أكثر أسباب انخفاض الأداء نتيجة استخدام الصور. إذ تدفع فيها الصورة العناصر الأخرى في الصفحة عند تحميلها مسببةً مشكلةً مزعجةً للمستخدمين تُعرف بالانزياح التراكمي للتخطيط Cumulative Layout Shift أو CLS والتي تؤثر على المؤشرات الحيوية لويب. وللتخلص من هذه المشكلة التي تسببها الصور، لابد من تحجيم الصور دائمًا. يتيح هذا الأمر للمتصفح أن يحجز القدر الكافي من المساحة للصورة قبل تحميلها.

ولأن الصور مصممةٌ لتضمن أداءً جيدًا، لن تتمكن من استخدامها بشكل يعزز المشكلة السابقة، وبالتالي لا بد من تحجيم الصور بإحدى الطرق التالية:

  1. تلقائيًا باستخدام الإدراج الساكن static import.
  2. صراحةً باستخدام الخاصيتين width و height.
  3. ضمنًا باستخدام الخاصية fill التي تسمح للصورة بالتوسّع لتملأ مساحة العنصر الأب.

ماذا لو لم أستطع تحديد قياس الصورة؟

إن كنت تحاول الوصول إلى صور من مصدر دون أن تعرف قياسات هذه الصور فهنالك عدة أمور قد تساعدك:

  • استخدم القيمة fill: يتيح هذا النمط أن تأخذ الصورة قياسات العنصر الأب. فاعتمد وجود تنسيقات CSS تعطي العنصر الأب للصورة مساحة محددة من الصفحة مع الخاصية sizes لمطابقة أي نقاط استعلام media query. يمكنك استخدام الخاصية object-fit وإسناد قيم لها مثل contain أو cover أو fill على التوازي مع استخدام الخاصية object-position لتحديد كيفية تموضع الصورة في المساحة المتاحة للعنصر الأب.
  • تسوية الصور Normalization: إن كنت تقدم صورًا تستطيع التحكم بمصدرها (الخادم الموجودة عليه مثلًا)، فكّر في ضبط مجرى هذه الصور لكي تصلك بقياس مناسب أو موحد.
  • تعديل استدعاءات الواجهة البرمجية: إن استخدم تطبيقك استدعاءات الواجهة البرمجية لإحضار عناوين للصور (من منظومة إدارة محتوى مثلًا)، قد تكون قادرًا على تعديل الدالة لإعادة الصورة مع أبعادها.

إن لم تفلح إحدى الطرق السابقة في تحديد قياس الصورة، فمكوّن الصورة في Next.js مصمم للعمل جيدًا في الصفحة إلى جانب عناصر الصور <img> النمطية كما لو استخدمتها مباشرةً.

تنسيق الصور

لا يختلف تنسيق مكوّن الصورة في Next.js عن تنسيق عنصر الصور <img> في HTML لكن لا بد من تذكر بعض الأشياء المهمة.

استعمل className أو style وليس styled-jsx: يفضل استخدام الخاصية className في أغلب الحالات للتنسيق سواءً عبر CSS Module أو تنسيق عام أو غيره، أو يمكنك استعمال الخاصية style مباشرة ولكن لا يمكنك استعمال صياغة styled-jsx لأنه لا يتعدى مجال المكوّن الحالي إلا إن جرى تحديد التنسيق على أنه عام global.

ملاحظة: عند استخدام fill لا بد وأن يُضبط موقع العنصر الأب كالتالي: position: relative، وهذا ضروري لتصيير عنصر الصورة بشكل صحيح في نمط التخطيط الذي اخترته.

ملاحظة: عند استخدام fill لا بد وأن يُضبط موقع العنصر الأب كالتالي: display: block، هذه القيمة افتراضية للعنصر <div> لكن ينبغي ضبطها لبقية العناصر.

الخاصيات التي يأخذها مكون الصورة

لمعلومات أوسع عن الخاصيات المتاحة للمكوّن next/image، اطلع على مرجع الواجهة البرمجية الخاص بهذا المكوّن.

أمثلة عن التنسيق

راجع معرض الأمثلة الخاص بمكوّن الصور في Next.js.

تهيئة الواجهة البرمجية لمكون الصور

يمكن تهيئة الواجهة البرمجية لتحسين المكوّن next/image من خلال الملف next.config.js، إذ يمكنك تفعيل الاتصال بنطاقات بعيدة وتعريف نقاط عرض breakpoints مخصصة للصور وتغيير سلوك التخزين المؤقت وغيرها الكثير.

اطلع على جميع توجيهات التهيئة لهذا المكوّن من خلال مرجع الواجهة البرمجية الخاص بهذا المكوّن.

أمثلة

المصادر