الفرق بين المراجعتين لصفحة: «Next.js/next image»

من موسوعة حسوب
لا ملخص تعديل
 
(16 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الواجهة البرمجية للمكوّن Next/image}}</noinclude>
<noinclude>{{DISPLAYTITLE:الواجهة البرمجية للمكوّن Next/image في Next.js}}</noinclude>
<blockquote>'''ملاحظة''': كُتب هذا التوثيق للواجهة البرمجية الخاصة بالمكوّن image ولتحسين الصور. للاطلاع أكثر على هذه الميزة واستخدامها في Next.js عُد إلى صفحة "[[Next.js/image optimization|تحسين الصور]]" من هذا التوثيق.</blockquote>
<blockquote>'''ملاحظة''': كُتب هذا التوثيق للواجهة البرمجية الخاصة بالمكوّن image ولتحسين الصور. للاطلاع أكثر على هذه الميزة واستخدامها في Next.js عُد إلى صفحة "[[Next.js/image optimization|تحسين الصور]]" من هذا التوثيق.
 
'''ملاحظة''': إن كنت تستخدم إصدارًا أقدم من 13، فارجع إلى توثيق [[Next.js/next legacy image|next/legacy/image]] إذ جرى تغيير اسم المكون بدءًا من ذلك الإصدار.
 
'''تنبيه:''' ظهرت بعض الثغرات في متصفحي Safari (نسخة 15 وما بعد) و فايرفوكس (نسخة 67 وما بعد) وإليك بعض الحلول المقترحة:
 
* تظهر في سفاري حواف رمادية عند تحميل الصورة، قد يكون الحل باستخدام قواعد CSS التالية:
<syntaxhighlight lang="css">
@supports (font: -apple-system-body)
          (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }
</syntaxhighlight>
 
* تظهر خلفية بيضاء أثناء التحميل في فايرفوكس وقد يكون الحل هو تمكين تنسيق AVIF أو استخدام الخاصية <code>placeholder="blur</code>
</blockquote>


== الخاصيات الضرورية ==
== الخاصيات الضرورية ==
سطر 6: سطر 19:


=== الخاصية <code>src</code> ===
=== الخاصية <code>src</code> ===
لا بد ان تكون هذه الخاصية واحدة من هذه:
لا بد أن تكون هذه الخاصية واحدة من هذه:


# ملف صورة [[Next.js/image optimization#.D8.A7.D9.84.D8.B5.D9.88.D8.B1%20.D8.A7.D9.84.D9.85.D8.AD.D9.84.D9.8A.D8.A9|مُدرج بشكل ساكن]].
# ملف صورة [[Next.js/image optimization#.D8.A7.D9.84.D8.B5.D9.88.D8.B1%20.D8.A7.D9.84.D9.85.D8.AD.D9.84.D9.8A.D8.A9|مُدرج بشكل ساكن]].
سطر 14: سطر 27:


=== الخاصية <code>width</code> ===
=== الخاصية <code>width</code> ===
وتمثّل هذه الخاصية الاتساع المُصيَّر أو الاتساع الأصلي مقدرًا بالبكسل، وذلك وفقًا لقيم الخاصيتين <code>layout</code> و <code>sizes</code>.
وتمثّل هذه الخاصية الاتساع المُصيَّر مقدرًا بالبكسل، وبالتالي سيؤثر على حجم الصورة عند عرضها. تُعد هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية <code>layout</code> لها هي <code>"fill"</code>.
 
* تمثل الخاصية <code>width</code> الاتساع المُصيّر مقدرًا بالبكسل عند استخدام القيم <code>layout="intrinsic"</code> أو <code>layout="fixed"</code>، وسيؤثر ذلك على حجم الصورة التي تظهر.
* تمثل الخاصية <code>width</code> الاتساع الأصلي مقدرًا بالبكسل عند استخدام القيم <code>layout="responsive"</code> و <code>layout="fill"</code>، وسيؤثر ذلك فقط على نسبة العرض aspect ratio.
 
هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية <code>layout</code> لها هي <code>"fill"</code>.  


=== الخاصية <code>height</code> ===
=== الخاصية <code>height</code> ===
وتمثّل هذه الخاصية الارتفاع المُصيَّر أو الإرتفاع الأصلي مقدرًا بالبكسل، وذلك وفقًا لقيم الخاصيتين <code>layout</code> و <code>sizes</code>.
وتمثّل هذه الخاصية الارتفاع المُصيَّر مقدرًا بالبكسل، وبالتالي سيؤثر على حجم الصورة عند عرضها. تُعد هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية <code>layout</code> لها هي <code>"fill"</code>.


* تمثل الخاصية <code>width</code> الإرتفاع المُصيّر مقدرًا بالبكسل عند استخدام القيم <code>layout="intrinsic"</code> أو <code>layout="fixed"</code>، وسيؤثر ذلك على حجم الصورة التي تظهر.
=== الخاصية <code>alt</code> ===
* تمثل الخاصية <code>width</code> الإرتفاع الأصلي مقدرًا بالبكسل عند استخدام القيم <code>layout="responsive"</code> و <code>layout="fill"</code>، وسيؤثر ذلك فقط على نسبة العرض aspect ratio.
وتستخدم لوصف الصورة كتابيًا كي تتمكن قارئات الشاشة ومحركات البحث من تمييزها. كما يُعد الوصف طريقة لتفادي حالة عدم تحميل الصورة سواء كان عرض الصور معطلًا في المتصفح أو حدث خطأ ما أثناء التحميل. ينبغي أن تضم هذه الخاصية نصًا يمكن أن نستبدل به الصورة دون يغيّر معنى الصفحة، وليس الغرض منه تعزيز محتوى الصورة. وبالتالي يجب ألا يكرر هذا النص المعلومات الت تعرضها العناوين أعلى وأسفل الصورة. اما إذا كانت الصورة للديكور فقط ولا تحوي معلومات أساسية للمستخدم  ينبغي أن يكون النص فارغًا (<code>""=alt</code>)
 
هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية <code>layout</code> لها هي <code>"fill"</code>.


== الخاصيات الاختيارية ==
== الخاصيات الاختيارية ==
يقبل المكوّن <code></ Image></code> مجموعة من الخاصيات الاختيارية إضافة إلى تلك الإجبارية. لهذا نلقي نظرة في هذا القسم على أكثر الخاصيات المستخدمة شيوعًا، كما سنتعرف لاحقًا إلى بعض الخاصيات نادرة الاستعمال.
يقبل المكوّن <code></ Image></code> مجموعة من الخاصيات الاختيارية إضافة إلى تلك الإجبارية. لهذا نلقي نظرة في هذا القسم على أكثر الخاصيات المستخدمة شيوعًا، كما سنتعرف لاحقًا إلى بعض الخاصيات نادرة الاستعمال.


=== الخاصية <code>layout</code> ===
=== الخاصية <code>loader</code> ===
إليك جدولًا بسلوك التخطيط layout عندما تتغير نافذة العرض view port:
وهي دالة تعيد عنوان URL نصي للصورة وتقبل المعاملات التالية:
{| class="wikitable"
|+
!لتخطيط <code>layout</code>
!السلوك
!السمة <code>srcSet</code>
!السمة <code>sizes</code>
!هل تمتلك مُغلِّف  ومُحجّم؟
|-
|<code>intrinsic</code> افتراضي
|يُصغِّر الصورة ليلائم اتساع الحاوية حجم الصورة.
|<code>1x</code> أو <code>2x</code> وفقًا لحجم الصورة imageSize
|غير متاحة
|نعم
|-
|<code>fixed</code>
|يضبط الاتساع <code>width</code> والارتفاع <code>height</code> تمامًا.
|<code>1x</code> أو <code>2x</code> وفقًا لحجم الصورة imageSize
|غير متاحة
|نعم
|-
|<code>responsive</code>
|يُغيّر الحجم ليلائم اتساع الحاوية
|<code>640w</code> أو <code>750w</code> أو <code>2048w</code> أو <code>3840w</code> وفقًا لحجم الصورة وأبعاد جهاز العرض
|<code>100vw</code>
|نعم
|-
|<code>fill</code>
|يغير الحجم وفق المحورين X و Y ليلائم الحاوية
|<code>640w</code> أو <code>750w</code> أو <code>2048w</code> أو <code>3840w</code> وفقًا لحجم الصورة وأبعاد جهاز العرض
|<code>100vw</code>
|نعم
|}
 
* التخطيط الافتراضي <code>intrinsic</code>:
** يُصغّر أبعاد الصورة لتلائم نافذة عرض أصغر، لكن ستحافظ على أبعاد الصورة في نوافذ العرض الأوسع.
* التخطيط <code>fixed</code>:
** لا تتغير أبعاد الصورة عندما تتغير نافذة العرض (لا تجاوب) ويشابه في ذلك سلوك العنصر <code>img</code>.
* التخطيط <code>responsive</code>:
** يُصغّر أبعاد الصورة لتلائم نافذة عرض أصغر، ويكبر أبعاد الصورة في نوافذ العرض الأوسع.
** عليك التأكد من استخدام <u>العنصر للتنسيق <code>display:</code></u> <code>block</code> ضمن صفحة التنسيقات المورّثة.
* التخطيط <code>fill</code>:
** يمدد الصورة في كلا الاتجاهين أي وفق الطول والعرض لتطابق أبعاد العنصر الأب، بحيث يكون تنسيق موقع الأب "نسبي relative">
** يترافق استخدام التخطيط مع الخاصية <code>objectFit</code>.
** تأكد من تطبيق قاعدة التنسيق <code>position: relative</code> على العنصر الأب.
* في حال كان الخيار <code>raw</code>:
** تُصيَّر الصورة على شكل عنصر صورة مفرد دون مُغلّف أو مُحجّم أو أي سلوك متجاوب.
** إن غيّرت قواعد التنسيق حجم الصورة ذات التخطيط <code>raw</code>‘ عليك تضمين الخاصية <code>sizes</code> كي تُقدَّم الصورة بالشكل الصحيح، وإلا ستُطلب هذه الصورة على أنها ذات أبعاد ثابتة.
 
=== المُحمِّل ===
وهي دالة مخصصة تُستخدم لتحليل عناوين URL. يُلغي استخدام المحمِّل كخاصية في المكوِّن المُحمِّل الافتراضي المُعرَّف في القسم <code>images</code> ضمن الملف <code>next.config.js</code>.
 
تأخذ دالة المحمّل <code>loader</code> التي تعيد عنوان URL نصي للصورة المعاملات التالية:


* <code>src</code>
* <code>src</code>
سطر 109: سطر 63:
   )
   )
}
}
</syntaxhighlight>
</syntaxhighlight>بإمكانك بدلًا من ذلك استخدام إعدادات <code>loaderFile</code> في <code>next.config.js</code> لتهيئة كل نسخة من الكائن  <code>next/image</code>  في تطبيقك دون تمرير أية خاصيات.
 
=== الخاصية <code>fill</code> ===
تأخذ الخاصية قيمة منطقية تحدد فيما إذا كانت الصورة ستملأ مساحة العنصر الأب بدلًا من ضبط الخاصيتين <code>width</code> و <code>height</code>
 
ينبغي في هذه الحالة أن يمتلك العنصر الأب خاصية التنسيق <code>position: "relative"‎</code> أو <code>position: "fixed"‎</code> أو <code>position: "absolute"‎</code>.
 
يمتلك العنصر <code>img</code> افتراضيًا التنسيق <code>position: "absolute"‎</code> وبالتالي ستتوسع الصورة حتى تملأ المساحة المخصصة لها، لهذا يمكنك استخدام الخاصية <code>object-fit: "contain"‎</code> لتملأ الصورة الحاوية التي تضمها وتحتفظ بتناسب أبعادها. بينما سيؤدي التنسيق إلى تمدد الصورة واقتصاصها حتى تحافظ على تناسب الأبعاد، ولكي يبدو  الأمر صحيحًا،لا بد من ضبط تنسيق الطفحان للعنصر الأب بالشكل <code>overflow: "hidden"</code>.
 
=== الخاصية <code>sizes</code> ===
تؤثر قيمة الخاصية <code>sizes</code> بشدة على أداء الصورة التي تستخدم الخاصية <code>fill</code> أو التي تُنسّق لتكون متجاوبة. وللخاصية <code>sizes</code> غايتان أساسيتان تتعلقان بأداء الصورة:
 
'''الأولى''': يستخدم المتصفح هذه الخاصية حجم الصورة التي ينبغي تحميلها من مجموعة الأحجام التي يوّلدها المكون <code>next/image</code> تلقائيًا. عندما يختار المتصفح حجم الصورة، فهو لا يعرف بعد حجم الصورة على الصفحة، لهذا سيختار الصورة التي تمتلك أبعادًا أكبر أو تعادل أبعاد نافذة العرض. وهكذا تخبر الخاصية <code>sizes</code> المتصفح أن الصورة ستكون أقل من حجم الشاشة الكامل. وانتبه إلى أن عرض الصورة سيكون <code>100vw</code> إن لم تستخدم الخاصية مع صورة تستخدم الخاصية <code>fill</code>.


=== الخاصية sizes ===
'''الثانية''': تضبط الخاصية <code>sizes</code> طريقة توليد الكائن <code>next/image</code> لمجموعة أحجام الصورة. فإن لم تكن الخاصية <code>sizes</code> موجودة ستوُلد مجموعة صغيرة من القياسات التي تناسب الصور ثابتة الحجم. لكن إذا عُرفت هذه الخاصية ستكون المجموعة المولَّدة أكبر وملائمة أكثر للصور المتجاوبة.  
وهي نص يزودنا بمعلومات عن اتساع الصورة في أوضاع مختلفة، وقيمته الافتراضية <code>100vw</code> (الاتساع الكامل للشاشة) عند استخدام <code>layout="responsive"</code> أو <code>layout="fill"</code> . إن كنت ستستخدم <code>layout="fill"</code> or <code>layout="responsive"</code>، فمن المهم تعيين الخاصية <code>sizes</code> لأي صورة تشغل حيزًا أقل من الاتساع الكامل لنافذة العرض.


عندما يقيد العنصر الأب الصورة كي يكون اتساعها دائمًا  أقل من نصف اتساع نافذة العرض مثلًا، استخدم القيمة <code>sizes="50vw"</code>. فبدون استخدام هذه الخاصية ستُرسل الصورة بضعفي الدقة المطلوبة مما يخفّض الأداء.
إن ضمت الخاصية <code>sizes</code> قياسات مثل <code>50vw</code> والتي تشير إلى نسبة مئوية من اتساع نافذة العرض، ستُختصر قائمة الأحجام كي لا تتضمن أية قيم أصغر بكثير من اللازم.


إن كنت تستخدم <code>layout="intrinsic"</code> أو <code>layout="fixed"</code> ، فلن تحتاج إلى الخاصة <code>sizes</code> لأن حدود الصورة مقيدة أصلًا.
فإن عرفت مثلًا أن التنسيق الذي تستخدمه سيسبب تمدد الصورة لتحتل اتساع النافذة في أجهزة الهاتف المحمول أو في تخطيط العمودين الخاص بالأجهزة اللوحية أو تخطيط الأعمدة الثلاث في شاشات الحواسب المكتبية، لا بد أن تستخدم الخاصية <code>sizes</code> كالتالي:<syntaxhighlight lang="javascript">
import Image from 'next/image'
const Example = () => (
  <div className="grid-element">
    <Image
      src="/example.png"
      fill
      sizes="(max-width: 768px) 100vw,
              (max-width: 1200px) 50vw,
              33vw"
    />
  </div>
)
</syntaxhighlight>قد يؤثر ستخدام الخاصية <code>sizes</code> في المثال السابق بشكل واضح على معايير الأداء. فمن دون استخدام القياس <code>33vw</code> ستكون اتساع الصورة التي تحملها الصفحة من الخادم أكبر بثلاث مرات من المطلوب، ولأن حجم الملف يتناسب طردًا مع مربّع الاتساع، سيحمّل المستخدم صورة أكبر بتسع مرات من المطلوب إن لم نستخدم <code>sizes</code>.


=== الخاصية <code>quality</code> ===
=== الخاصية <code>quality</code> ===
سطر 122: سطر 100:


=== الخاصية <code>priority</code> ===
=== الخاصية <code>priority</code> ===
تُعد الصور عندما تأخذ هذه الخاصية القيمة ذات أولوية عالية ويُعاد تحميلها، وتعطل ميزة التحميل الكسول تلقائيًا في حال استخدام هذه الخاصية.
تُعد الصور ذات أولوية عالية عندما تأخذ هذه الخاصية القيمة <code>true</code>  ويُعاد تحميلها، وتعطل ميزة التحميل الكسول تلقائيًا في حال استخدام هذه الخاصية. القيمة الافتراضية هي <code>false</code>.


لا بد من استخدام هذه الخاصية لأي صورة يعتبرها المتصفح "أكبر عنصر سيُرسم على الشاشة LCP". من الملائم أحيانًا وجود عدة صورة تستخدم الخاصية <code>priority</code>، لأن العديد من الصور قد تكون LCP لواجهات عرض مختلفة.
لا بد من استخدام هذه الخاصية لأي صورة يعدّها المتصفح "أكبر عنصر سيُرسم على الشاشة LCP". من الملائم أحيانًا وجود عدة صور تستخدم الخاصية <code>priority</code>، لأن العديد من الصور قد تكون LCP لواجهات عرض مختلفة.


إن القيم الافتراضية للخاصية هي <code>false</code>، ولا ينبغي استخدامها ما لم تكن الصورة مرئية في الجزء الظاهرمن الصفحة.
إن القيم الافتراضية للخاصية <code>priority</code> هي <code>false</code>، ولا ينبغي استخدامها ما لم تكن الصورة مرئية في الجزء الظاهر من الصفحة.


=== الخاصية <code>placeholder</code> ===
=== الخاصية <code>placeholder</code> ===
تستخدم لحجز مساحة كافية للصورة أثناء التحميل. ولها قيمتان: الافتراضية <code>empty</code> و <code>blur</code>.
تستخدم لحجز مساحة كافية للصورة أثناء التحميل. ولها قيمتان: الافتراضية <code>empty</code> و <code>blur</code>.


* عندما تكون قيمة الخاصية <code>blur</code>، تُستخدم الخاصية <code>blurDataURL</code> لحجز حيّز الصورة. وإن كانت قيمة الخاصية <code>src</code> كائنًا مصدره إدراج ساكن لصورة لها أحد الامتدادات <code>jpg.</code> أو <code>png.</code> أو <code>webp.</code> أو <code>avif.</code>، سيُحدد <code>blurDataURL</code> حيّز الصورة تلقائيًا. يجب استخدام الخاصية <code>blurDataURL</code> مع الصور الدينياميكية، كما أن حلولًا مثل [https://github.com/joe-bell/plaiceholder Plaiceholder] قد تساعد عند تمثيل العناصر باستخدام التشفير <code>base64</code>.
* عندما تكون قيمة الخاصية <code>blur</code>، تُستخدم الخاصية <code>blurDataURL</code> لحجز حيّز الصورة. وإن كانت قيمة الخاصية <code>src</code> كائنًا مصدره إدراج ساكن لصورة لها أحد الامتدادات <code>jpg.</code> أو <code>png.</code> أو <code>webp.</code> أو <code>avif.</code>، سيُحدد <code>blurDataURL</code> حيّز الصورة تلقائيًا. يجب استخدام الخاصية <code>blurDataURL</code> مع الصور الديناميكية، كما أن حلولًا مثل [https://github.com/joe-bell/plaiceholder Plaiceholder] قد تساعد عند تمثيل العناصر باستخدام التشفير <code>base64</code>.
* عندما تكون قيمة الخاصية <code>empty</code>، لن يكون هناك حيّز لتحميل الصورة بل فقط مسافة فارغة. جرّب الامثلة التالية:
* عندما تكون قيمة الخاصية <code>empty</code>، لن يكون هناك حيّز لتحميل الصورة بل فقط مسافة فارغة. جرّب الامثلة التالية:
** [https://image-component.nextjs.gallery/placeholder مثال] عن حيّز التحميل مع <code>blur</code>.
** [https://image-component.nextjs.gallery/placeholder مثال] عن حيّز التحميل مع <code>blur</code>.
سطر 143: سطر 121:
تسمح هذه الخاصية بتمرير تنسيقات CSS إلى عنصر الصورة التحتي <code><img></code>.  
تسمح هذه الخاصية بتمرير تنسيقات CSS إلى عنصر الصورة التحتي <code><img></code>.  


تطبق جميع أوضاع التخطيطيات <code>layout</code> تنسيقاتها الخاصة على عنصر الصورة ولهذه التنسيقات الأولوية على التنسيق باستخدام الخاصية <code>style</code>. وتذكر أن الخاصيتين <code>width</code> و<code>height</code> قد تتفاعلان مع تنسيقك، فإن ضبطت الاتساع <code>width</code>لا بد من ضبط الارتفاع أيضًا بالشكل <code>height="auto"</code> وإلا ستتشوه الصورة.
تذكر أن الخاصيتين الإجباريتين <code>width</code> و <code>height</code> قد تتفاعلان مع تنسيقك، فإن ضبطت الاتساع <code>width</code> لا بد من ضبط الارتفاع أيضًا بالشكل <code>"height="auto</code> وإلا ستتشوه الصورة.


=== الخاصية <code>objectFit</code> ===
=== الدالة <code>onLoadingComplete</code> ===
وتعرّف طريقة ضبط الصورة لتتلائم مع حاوية العنصر الأب عند استخدام التخطيط <code>layout="fill"</code>. تمرر هذه الخاصية إلى خاصية CSS التي تماثلها بالاسم <code>object-fit</code> والعائدة للصورة التي تحددها الخاصية <code>src</code>.
وهي دالة تُنفَّذ بمجرد أن يكتمل تحميل الصورة ويُزال الحيّز المحدد لها أثناء التحميل. تقبل هذه الدالة معاملًا واحدًا هو مرجع إلى العنصر التحتي للصورة  <code><img></code>.


=== الدالة <code>onLoadingComplete</code> ===
=== الدالة <code>onLoad</code> ===
وهي دالة تُنفَّذ بمجرد أن يكتمل تحميل الصورة ويُزال الحيّز المحدد لها أثناء التحميل. تقبل هذه الدالة معاملًا واحدًا وهو كائن له الخاصيات التالية:
وهي دالة تُستدعى عند بداية تحميل الصورة. وتجدر الملاحظة هنا أن حدث التحميل قد يحدث قبل إزالة الحيز المحدد للصورة واكتمال عرض الصورة. وبإمكانك استخدام <code>onLoadingComplete</code> بدلًا عنها.


* <code>naturalWidth</code>
=== الدالة <code>onErorr</code> ===
* <code>naturalHeight</code>
وهي دالة تُستدعى إن أخفق تحميل الصورة.


=== الخاصية <code>loading</code> ===
=== الخاصية <code>loading</code> ===
<blockquote>'''تنبيه''': صممت هذه الخاصية للاستخدام المتقدم. فقد يسيئ استخدام التحميل الشره <code>eager</code> إلى الأداء. لهذا ننصح باستخدام الخاصية <code>priority</code> بدلًا عنها، إذ تحمّل هذه الخاصية الصورة "بشراهة" في معظم الحالات تقريبًا.</blockquote>تحدد الخاصية سلوك تحميل الصورة، وقيمتها الافتراضية <code>lazy</code> (كسول). ففي حالة السلوك الكسول <code>lazy</code>، لا تُحمّل الصورة حتى تقترب مسافة محددة من نافذة العرض (قبل أن تُعرض بقليل). أما في حالة السلوك الشره <code>eager</code>، ستُحمّل الصورة مباشرة.
<blockquote>'''تنبيه''': صممت هذه الخاصية للاستخدام المتقدم. فقد يسيء استخدام التحميل الشره <code>eager</code> إلى الأداء. لهذا ننصح باستخدام الخاصية <code>priority</code> بدلًا عنها، إذ تحمّل هذه الخاصية الصورة "بشراهة" في معظم الحالات تقريبًا.</blockquote>تحدد الخاصية سلوك تحميل الصورة، وقيمتها الافتراضية <code>lazy</code> (كسول). ففي حالة السلوك الكسول <code>lazy</code>، لا تُحمّل الصورة حتى تقترب مسافة محددة من نافذة العرض (قبل أن تُعرض بقليل). أما في حالة السلوك الشره <code>eager</code>، ستُحمّل الصورة مباشرة.


=== الخاصية <code>blurDataURL</code> ===
=== الخاصية <code>blurDataURL</code> ===
وهو عنوان URL خاص بالبيانات (له البادئة ":data") يُستخدم كحّيز تحميل صورة قبل تحميل الصورة المحددة في الخاصية <code>src</code>. يظهر تأثير هذه الخاصية عندما تُستخدم مع الخاصية <code>placeholder="blur"</code>.
وهو عنوان URL خاص بالبيانات (له البادئة ":data") يُستخدم كحيّز تحميل صورة قبل تحميل الصورة المحددة في الخاصية <code>src</code>. يظهر تأثير هذه الخاصية عندما تُستخدم مع الخاصية <code>"placeholder="blur</code>.
 
ينبغي أن تكون الصورة مرمّزة وفق القاعدة <code>base64</code>، إذ تُكبّر الصورة وتُغشّى. لهذا يستحسن أن تكون هذه الصورة صغيرة (10 بكسل أو أقل)، فإضافة صور كبيرة إلى حيّز التحميل قد يسيئ إلى الأداء. راجع الأمثلة السابقة في فقرة الخاصية <code>placeholder</code>.


=== الخاصية <code>lazyBoundary</code> ===
ينبغي أن تكون الصورة مرمّزة وفق القاعدة <code>base64</code>، إذ تُكبّر الصورة وتُغشّى. لهذا يستحسن أن تكون هذه الصورة صغيرة (10 بكسل أو أقل)، فإضافة صور كبيرة إلى حيّز التحميل قد يسيء إلى الأداء. راجع الأمثلة السابقة في فقرة الخاصية <code>placeholder</code>.
وهي نص (يشابه في صيغته الخاصية <code>margin</code>) يعمل كصندوق إحاطة لاكتشاف التقاطع بين نافذة العرض والصورة ويسبب بدأ التحميل الكسول لها، وتأخذ الخاصية القيمة الافتراضية <code>"200px"</code>. إن وضعت الصورة ضمن عنصر أب يدعم التمرير بدلًا من أن تكون في جذر الصفحة، ستحتاج أيضًا إلى تحديد قيمة الخاصية <code>lazyRoot</code>.
 
=== الخاصية <code>lazyRoot</code> ===
وهي [[React/refs and the dom|مرجع React]] يدل على العنصر الأب الذي يدعم التمرير، وتأخذ القيمة الافتراضية <code>null</code> (نافذة العرض تحتجزها الصفحة). ينبغي أن يشير المرجع إلى عنصر DOM أو مكوّن React يوجّه المرجع إلى عنصر DOM التحتي.
 
إليك مثالًا يشير إلى عنصر DOM: <syntaxhighlight lang="javascript">
import Image from 'next/image'
import React from 'react'
 
const lazyRoot = React.useRef(null)
 
const Example = () => (
  <div ref={lazyRoot} style={{ overflowX: 'scroll', width: '500px' }}>
    <Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
    <Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
  </div>
)
</syntaxhighlight>وإليك مثالًا آخر يشير إلى مكوّن React: <syntaxhighlight lang="javascript">
import Image from 'next/image'
import React from 'react'
 
const Container = React.forwardRef((props, ref) => {
  return (
    <div ref={ref} style={{ overflowX: 'scroll', width: '500px' }}>
      {props.children}
    </div>
  )
})
 
const Example = () => {
  const lazyRoot = React.useRef(null)
 
  return (
    <Container ref={lazyRoot}>
      <Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
      <Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
    </Container>
  )
}
</syntaxhighlight>


=== الخاصية <code>unoptimized</code> ===
=== الخاصية <code>unoptimized</code> ===
تُقدم الصورة في حال كانت قيمة هذه الخاصية <code>true</code> كما هي دون تغيير في النوعية أو الحجم. القيمة الافتراضية لهذه الخاصية <code>false</code>.
تُقدم الصورة في حال كانت قيمة هذه الخاصية <code>true</code> كما هي دون تغيير في النوعية أو الحجم أو التنسيق. القيمة الافتراضية لهذه الخاصية <code>false</code>.


يمكن تعيين هذه الخاصية لكل الصور بتحديث الملف <code>next.config.js</code> من خلال إضافة الإعدادات التجريبية التالية:<syntaxhighlight lang="javascript">
يمكن تعيين هذه الخاصية لكل الصور بتحديث الملف <code>next.config.js</code> من خلال إضافة الإعدادات التالية:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   experimental: {
   images: {
     images: {
     unoptimized: true,
      unoptimized: true,
    },
   },
   },
}
}
سطر 221: سطر 155:


* <code>srcSet</code>: استعمل <code>DeviceSizes</code> بدلًا عنها.
* <code>srcSet</code>: استعمل <code>DeviceSizes</code> بدلًا عنها.
* <code>ref</code>: استعمل <code>onLoadingComplete</code> بدلًا عنها.
* <code>decoding</code>: وتكون دائمًا <code>"async"</code>.
* <code>decoding</code>: وتكون دائمًا <code>"async"</code>.


سطر 227: سطر 160:


=== الخاصية <code>remotePatterns</code> ===
=== الخاصية <code>remotePatterns</code> ===
<blockquote>'''ملاحظة''': يُعد الإعداد <code>remotePatterns</code> تجريبيًا حاليًا وعرضة للتغيير. استخدم <code>domains</code> في نسخ الإنتاج.</blockquote>لا بد من تهيئة تطبيقك حتى يستخدم صورًا من مصادر خارجية دون أن يتسلل المستخدمين المشبوهين من خلالها إلى تطبيقك. وبهذا تتأكد أن الصور الخارجية التي تأتي من حساباتك فقط يمكن تخديمها بواسطة واجهة Next.js البرمجية لتحسين الصور. يمكن أن تُهيأ هذه الصور من خلال الخاصية <code>remotePatterns</code> في الملف <code>next.config.js</code> كما يلي:<syntaxhighlight lang="javascript">
<blockquote>'''ملاحظة''': يُعد الإعداد <code>remotePatterns</code> تجريبيًا حاليًا وعرضة للتغيير. استخدم <code>domains</code> في نسخ الإنتاج.</blockquote>لا بد من تهيئة تطبيقك حتى يستخدم صورًا من مصادر خارجية دون أن يتسلل المستخدمين المشبوهين من خلالها إلى تطبيقك. وبهذا تتأكد أن الصور الخارجية التي تأتي من حساباتك فقط يمكن تخديمها بواسطة واجهة Next.js البرمجية لتحسين الصور. يمكن أن تُهيأ هذه الصور من خلال الخاصية <code>remotePatterns</code> في الملف <code>next.config.js</code> كما يلي:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   experimental: {
   experimental: {
سطر 242: سطر 175:
   },
   },
}
}
</syntaxhighlight><blockquote>'''ملاحظة''': يتأكد المثال السابق من ضرورة أن تبدأ الخاصية <code>src</code> للمكوّن <code>next/image</code> بالعنوان <code>/<nowiki>https://example.com/account123</nowiki></code>. وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيوّلد الخطأ 400 (طلب خاطئ bad request)</blockquote>إليك مثالًا آخر عن استخدام الخاصية <code>remotePatterns</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
</syntaxhighlight><blockquote>'''ملاحظة''': يتأكد المثال السابق من ضرورة أن تبدأ الخاصية <code>src</code> للمكوّن <code>next/image</code> بالعنوان <code>/<nowiki>https://example.com/account123</nowiki></code>. وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيولّد الخطأ 400 (طلب خاطئ bad request)</blockquote>إليك مثالًا آخر عن استخدام الخاصية <code>remotePatterns</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   experimental: {
   experimental: {
سطر 255: سطر 188:
   },
   },
}
}
</syntaxhighlight><blockquote>'''ملاحظة''': يتأكد المثال السابق من ضرورة أن تبدأ الخاصية <code>src</code> للمكوّن <code>next/image</code> بأحد العنوانين <code><nowiki>https://img1.example.com</nowiki></code> أو <code><nowiki>https://me.avatar.example.com</nowiki></code> . وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيوّلد الخطأ 400 (طلب خاطئ bad request).</blockquote>يمكن استخدام أنماط الأخرف البديلة لترميز <code>pathname</code> أو <code>hostname</code> وفقًا للصيغتين التاليتين:
</syntaxhighlight><blockquote>'''ملاحظة''': يتأكد المثال السابق من ضرورة أن تبدأ الخاصية <code>src</code> للمكوّن <code>next/image</code> بأحد العناوين <code><nowiki>https://img1.example.com</nowiki></code> أو <code><nowiki>https://me.avatar.example.com</nowiki></code>. وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيولّد الخطأ 400 (طلب خاطئ bad request).</blockquote>يمكن استخدام أنماط الأحرف البديلة لترميز <code>pathname</code> أو <code>hostname</code> وفقًا للصيغتين التاليتين:


* <code>*</code>: يتطابق من قسم مسار مفرد أو نطاق فرعي.
* <code>*</code>: يتطابق من قسم مسار مفرد أو نطاق فرعي.
* <code>**</code>: يتطابق مع أي عدد من أقسام المسارات في نهايتها أو مع النطاقات الفرعية في بدايتها.
* <code>**</code>: يتطابق مع أي عدد من أقسام المسارات في نهايتها أو مع النطاقات الفرعية في بدايتها.


لا تعمل الصيغة <code>**</code> وسط النمط.
لا تعمل الصيغة <code>**</code> وسط النمط.


=== النطاقات <code>domain</code> ===
=== النطاقات <code>domain</code> ===
تقدم قائمة بأسماء المضيف المتاحة لاستخدام الصور الخارجية. لكن لا تدعم هذه الخاصية المحارف البديلة، ولا يمكن أن تمنع بروتوكولًا أو منفذًا أو مسارًا.
'''ملاحظة''': ننصح باستخدام الخاصية بدلًا عنها كي تتمكن من تحديد بروتوكول أو مسار


إليك مثالًا آخر عن استخدام الخاصية <code>domains</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
تقدم قائمة بأسماء المضيف المتاحة لاستخدام الصور الخارجية. لكن لا تدعم هذه الخاصية المحارف البديلة، ولا يمكن أن تحدد بروتوكولًا أو منفذًا أو مسارًا.
 
إليك مثالًا عن استخدام الخاصية <code>domains</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   images: {
   images: {
سطر 274: سطر 209:


=== إعدادات المحمِّل ===
=== إعدادات المحمِّل ===
إن أردت استخدام مزوّد سحابي لتحسين الصور بدلًا من استخدام واجهة Next.js البرمجية المدمجة لتحسين الصور، يمكنك إعداد الخاصية <code>loader</code> والبادئة <code>path</code> في ملف <code>next.config.js</code>. يسمح لك ذلك استخدام عناوين URL النسبية ضمن الخاصية <code>src</code> لمكوّن الصورة وتوليد المسارالمطلق الصحيح تلقائيَا لمزوّدك.<syntaxhighlight lang="javascript">
إن أردت استخدام مزوّد سحابي لتحسين الصور بدلًا من استخدام واجهة Next.js البرمجية المدمجة لتحسين الصور، يمكنك إعداد الخاصية <code>loaderFile</code> في ملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   images: {
   images: {
     loader: 'imgix',
     loader: 'custom',
     path: 'https://example.com/myaccount/',
     loaderFile: './my/image/loader.js',
   },
   },
}
}
</syntaxhighlight>
</syntaxhighlight>لا بد أن تشير إلى ملف بالنسبة إلى جذر تطبيق Next.js، ولا بد أن يصدّر الملف دالة تعيد نصًا. إليك مثالًا:<syntaxhighlight lang="javascript">
 
export default function myImageLoader({ src, width, quality }) {
=== المحمِّلات المدمجة ===
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
إليك بعض المزودات السحابية المدمجة لتحسين الصورة:
}
 
</syntaxhighlight>بإمكانك أيضًا استخدام الخاصية <code>loader</code> لتهيئة كل نسخة من الكائن <code>next/image</code> على حدى.
* الافتراضي: يعمل تلقائيًا مع أو خادم مخصص.
* [https://vercel.com/ Vercel]: يعمل تلقائيًا عندما تنشر التطبيق على Vercel، ولا يحتاج أية إعدادات.
* [https://www.imgix.com/ Imgix]: من خلال المحمّل <code>loader: 'imgix'</code>.
* [https://cloudinary.com/ Cloudinary]: من خلال المحمّل <code>loader: 'cloudinary'</code>.
* [https://www.akamai.com/ Akamai]: من خلال المحمّل <code>loader: 'akamai'</code>.
* مخصص: من خلال المحمّل <code>loader: 'custom'</code> ويستخدم أي مزوّد سحابي من خلال تهيئة الخاصية <code>loader</code> في المكوّن <code>next/image</code>.
 
<blockquote>لا يمكن تحسين الصور أثناء بناء التطبيق باستخدام <code>next export</code>، بل فقط عند الطلب. لهذا عليك استخدام محمّل آخر غير المحمّل الافتراضي إن أردت استخدام <code>next/image</code> مع <code>next export</code>.</blockquote><blockquote>يستخدم المحمّل الافتراضي للمكوّن المكتبة <code>[https://www.npmjs.com/package/@squoosh/lib squoosh]</code> لأنها سريعة التثبيت ومناسبة لبيئة التطوير. ننصح بشدة عند استعمال الأمر  <code>next start</code> في بيئة التطوير أن تثبِّت المكتبة <code>[https://www.npmjs.com/package/sharp sharp]</code> بتنفيذ الأمر <code>yarn add sharp</code> في جذر المشروع. لا يُعد ذلك ضروريًا للنشر على Vercel لأنها مثبّته تلقائيًا عليه.</blockquote>


== إعدادات متقدمة ==
== إعدادات متقدمة ==
تُعد الإعدادات التالية متقدمة ولحالات محدودة وليست ضرورية عادة. فإن اخترت أن تضبط الخاصيات القادمة، فستبدّل كل التغييرات التي ستحصل على إعدادات Next.js الافتراضية في التحديثات المستقبلية.
تُعد الإعدادات التالية متقدمة ولحالات محدودة وليست ضرورية عادة. فإن اخترت أن تضبط الخاصيات القادمة، فستبدّل كل التغييرات التي ستحصل على إعدادات Next.js الافتراضية في التحديثات المستقبلية.


=== الخاصية <code>deviceSizes</code> ===
=== الخاصية <code>deviceSizes</code> ===
إن كنت تعرف اتساع اجهزة مستخدميك، يمكنك وضع قائمة بالاتساعات الممكنة باستخدام الخاصية <code>deviceSizes</code> وذلك ضمن الملف <code>next.config.js</code>. تُستخدم هذه القائمة عندما يستخدم المكوّن <code>next/image</code> الخاصيتين <code>"layout="responsive</code> أو <code>"layout="fill</code> للتأكد من تقديم الصورة الصحيحة الملائمة لجهاز المستخدم.  
إن كنت تعرف اتساع اجهزة مستخدميك، يمكنك وضع قائمة بالاتساعات الممكنة باستخدام الخاصية <code>deviceSizes</code> وذلك ضمن الملف <code>next.config.js</code>. تُستخدم هذه القائمة عندما يستخدم المكوّن <code>next/image</code> الخاصية <code>sizes</code> للتأكد من تقديم الصورة الصحيحة الملائمة لجهاز المستخدم.  


إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:<syntaxhighlight lang="javascript">
إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:<syntaxhighlight lang="javascript">
سطر 325: سطر 252:
تكتشف الواجهة البرمجية الافتراضية لتحسين الصور التنسيقات التي يدعمها المتصفح تلقائيًا من خلال الترويسة <code>Accept</code> للطلب.
تكتشف الواجهة البرمجية الافتراضية لتحسين الصور التنسيقات التي يدعمها المتصفح تلقائيًا من خلال الترويسة <code>Accept</code> للطلب.


إن تطابقت الترويسة <code>Accept</code> مع أكثر من تنسيق من التنسيقات المهيأة يُستخدم التنسيق الأول في القائمة، لهذا ينبغي الانتباه إلى ترتيب عناصر القائمة. إن لم تجد الواجهة أي تطابق ( أو كانت الصورة المصدرية متحركة)، ستتراجع واجهة تحسين الصور إلى تنسيق الصورة الأصلي.
إن تطابقت الترويسة <code>Accept</code> مع أكثر من تنسيق من التنسيقات المهيأة يُستخدم التنسيق الأول في القائمة، لهذا ينبغي الانتباه إلى ترتيب عناصر القائمة. إن لم تجد الواجهة أي تطابق (أو كانت الصورة المصدرية متحركة)، ستتراجع واجهة تحسين الصور إلى تنسيق الصورة الأصلي.


إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:<syntaxhighlight lang="javascript">
إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:<syntaxhighlight lang="javascript">
سطر 333: سطر 260:
   },
   },
}
}
</syntaxhighlight>بإمكانك تفعيّل التنسيق AVIF من خلال الإعداد التالي:<syntaxhighlight lang="javascript">
</syntaxhighlight>بإمكانك تفعيل التنسيق AVIF من خلال الإعداد التالي:<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   images: {
   images: {
سطر 339: سطر 266:
   },
   },
}
}
</syntaxhighlight><blockquote>'''ملاحظة''': تتطلب الصورة وفق تنسيق AVIF زمنًا أطول بحوالي 20% لتشفيرها، لكن يمكن أن تُضغط أكثر موفرة 20% مقارنة بالتنسيق WebP. وهذا يعني أن تحميل تلك الصور للمرة الأولى سيكون ابطأ لكن التحميلات التالية من الذاكرة المؤقتة سيكون أسرع.</blockquote>
</syntaxhighlight><blockquote>'''ملاحظة''': تتطلب الصورة وفق تنسيق AVIF زمنًا أطول بحوالي 20% لتشفيرها، لكن يمكن أن تُضغط أكثر موفرة 20% موازنةً بالتنسيق WebP. وهذا يعني أن تحميل تلك الصور للمرة الأولى سيكون أبطأ لكن التحميلات التالية من الذاكرة المؤقتة سيكون أسرع.
 
'''ملاحظة''': إن قررت أن تستضيف تطبيقك باستخدام مخدم وكيل أو شبكة توزيع محتوى Proxy/CDN أمام تطبيق Next.js، لا بد من ضبط الخادم الوكيل لتوجيه الترويسة <code>Accept</code>.</blockquote>


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


تُحسن الطلب تلقائيًا عند الطلب وتُخزّن في المجلد <code><distDir>/cache/images</code>. تُقدّم الصورة المحسنة لاحقًا من هذا المجلد حتى تنتهي فترة صلاحيتها. عندما يتطابق الطلب معع ملف انتهت صلاحته، تُقدّم الصورة كما هي مباشرة ثم تُحسّن الصورة مجددًا في الخلفية (يُدعى هذا أيضًا إعادة التحقق) وتُخزَّن في نفس المجلد وتُعطى فترة صلاحية جديدة.
تُحسن الطلب تلقائيًا عند الطلب وتُخزّن في المجلد <code><distDir>/cache/images</code>. تُقدّم الصورة المحسنة لاحقًا من هذا المجلد حتى تنتهي فترة صلاحيتها. عندما يتطابق الطلب مع ملف انتهت صلاحيته، تُقدّم الصورة كما هي مباشرة ثم تُحسّن الصورة مجددًا في الخلفية (يُدعى هذا أيضًا إعادة التحقق) وتُخزَّن في نفس المجلد وتُعطى فترة صلاحية جديدة.


تُحدد حالة التخزين المؤقت لصورة بقراءة قيمة ترويسة الاستجابة <code>x-nextjs-cache</code> التي تمتلك إحدى القيم التالية:
تُحدد حالة التخزين المؤقت لصورة بقراءة قيمة ترويسة الاستجابة <code>x-nextjs-cache</code> التي تمتلك إحدى القيم التالية:


* <code>MISS</code>: المسار غير موجود في الذاكرة المؤقتة (يحدث ذلك غالبًا مرة واحدة عند أول زيارة).
* <code>MISS</code>: المسار غير موجود في الذاكرة المؤقتة (يحدث ذلك غالبًا مرة واحدة عند أول زيارة).
سطر 352: سطر 281:
* <code>HIT</code>: المسار في الذاكرة المؤقتة وضمن فترة الصلاحية.
* <code>HIT</code>: المسار في الذاكرة المؤقتة وضمن فترة الصلاحية.


تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد <code>minimumCacheTTL</code> أو ترويسة تيار رفع الصورة <code>Cache-Control</code>، وخاصة القيمة <code>max-age</code> للترويسة <code>Cache-Control</code>. وإن وجدت كلتا القيمتين <code>s-maxage</code> و <code>max-age</code> ستؤخذ القيمة <code>s-maxage</code>. تمرر قيمة <code>max-age</code> أيضًا ضمن أي تيار تنزيل للصور نحو العميل بما في ذلك شبكات إيصال المحتوى و المتصفحات.
تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد <code>minimumCacheTTL</code> أو ترويسة تيار رفع الصورة <code>Cache-Control</code>، وخاصة القيمة <code>max-age</code> للترويسة <code>Cache-Control</code>. وإن وجدت كلتا القيمتين <code>s-maxage</code> و <code>max-age</code> ستؤخذ القيمة <code>s-maxage</code>. تمرر قيمة <code>max-age</code> أيضًا ضمن أي تيار تنزيل للصور نحو العميل بما في ذلك شبكات إيصال المحتوى والمتصفحات.


* بإمكانك ضبط الإعداد <code>minimumCacheTTL</code> لزيادة زمن الصلاحية عندما لا يتضمن تيار رفع الصورة الترويسة <code>Cache-Control</code> أو أن قيمته صغيرة جدًا.
* بإمكانك ضبط الإعداد <code>minimumCacheTTL</code> لزيادة زمن الصلاحية عندما لا يتضمن تيار رفع الصورة الترويسة <code>Cache-Control</code> أو أن قيمته صغيرة جدًا.
* بإمكانك تهيئة <code>deviceSizes</code> و <code>imageSizes</code> لتقليل العدد الكلي للصور التي يمكن توليدها.
* بإمكانك تهيئة <code>deviceSizes</code> و <code>imageSizes</code> لتقليل العدد الكلي للصور التي يمكن توليدها.
* يمكنك استخدام الإعداد <code>formats</code> لتعطيل التنسيقات المتعددة للصورة لصالح تنسيق محدد.
* يمكنك استخدام الإعداد <code>formats</code> لتعطيل التنسيقات المتعددة للصورة لصالح تنسيق محدد.


=== الخاصية <code>minimumCacheTTL</code> ===
=== الخاصية <code>minimumCacheTTL</code> ===
بإمكانك ضبط زمن الصلاحية (زمن البقاء) Time To Live بالثانية للصور المخزنة في الذاكرة المؤقتة. لكن من الأفضل في حالات كثيرة استخدام [[Next.js/image optimization|الإدراج الساكن للصور]] الذي يرمّز مباشرة محتوى الملف ويخزّن الذاكرة يشكل دائم من خلال ضبط قيمة الترويسة <code>Cache-Control</code> على <code>immutable</code>.<syntaxhighlight lang="javascript">
بإمكانك ضبط زمن الصلاحية (زمن البقاء) Time To Live بالثانية للصور المخزنة في الذاكرة المؤقتة. لكن من الأفضل في حالات كثيرة استخدام [[Next.js/image optimization|الإدراج الساكن للصور]] الذي يرمّز مباشرة محتوى الملف ويخزّن الذاكرة بشكل دائم من خلال ضبط قيمة الترويسة <code>Cache-Control</code> على <code>immutable</code>.<syntaxhighlight lang="javascript">
module.exports = {
module.exports = {
   images: {
   images: {
سطر 365: سطر 294:
   },
   },
}
}
</syntaxhighlight>تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد <code>minimumCacheTTL</code> أو ترويسة تيار رفع الصورة <code>Cache-Control</code>، وخاصة القيمة <code>max-age</code> للترويسة <code>Cache-Control</code>. فإن أردت تغيير هذا السلوك لكل صورة على حدى، تستطيع ذلك من خلال تهيئة الترويسات <code>headers</code> لكي تضيف الترويسة <code>Cache-Control</code> إلى تيار رفع الصورة (الصورة <code>some-asset.jpg/</code> مثلًا وليست الصورة <code>next/image_/</code> نفسها).
</syntaxhighlight>تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد <code>minimumCacheTTL</code> أو ترويسة تيار رفع الصورة <code>Cache-Control</code>، وخاصة القيمة <code>max-age</code> للترويسة <code>Cache-Control</code>. فإن أردت تغيير هذا السلوك لكل صورة على حدى، تستطيع ذلك من خلال تهيئة الترويسات <code>headers</code> لكي تضيف الترويسة <code>Cache-Control</code> إلى تيار رفع الصورة (الصورة <code>some-asset.jpg/</code> مثلًا وليست الصورة <code>next/image_/</code> نفسها).


لا توجد آلية للتحقق من الذاكرة المؤقتة حاليًا، لذلك من الأفضل أن تبقي قيمة منخفضةً وإلا قد تضطر إلى تغيير الخاصية <code>src</code> يدويًا أو تلغي المجلد <code><distDir>/cache/images</code>.
لا توجد آلية للتحقق من الذاكرة المؤقتة حاليًا، لذلك من الأفضل أن تبقي قيمة <code>minimumCacheTTL</code> منخفضةً وإلا قد تضطر إلى تغيير الخاصية <code>src</code> يدويًا أو تلغي المجلد <code>distDir>/cache/images></code>.


=== تعطيل الإدراج الساكن ===
=== تعطيل الإدراج الساكن ===
يسمح لك السلوك الافتراضي لمكوذن الصور أن تدرج ملفات صور ساكنة من خلال الأمر <code>import icon from './icon.png</code> ثم تمررها إلى الخاصية . لكن قد ترغب في بعض الحالات أن تُعطِّل هذه الميزة إن تعرضت مع ملحقات أخرى تتوقع أن يكون إدراج الملفات مختلفًا.  
يسمح لك السلوك الافتراضي لمكون الصور أن تدرج ملفات صور ساكنة من خلال الأمر <code>import icon from './icon.png</code> ثم تمررها إلى الخاصية <code>src</code>. لكن قد ترغب في بعض الحالات أن تُعطِّل هذه الميزة إن تعارضت مع ملحقات أخرى تتوقع أن يكون إدراج الملفات مختلفًا.  


تستطيع تعطيل الإدراج الساكن للصور من خلال ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
تستطيع تعطيل الإدراج الساكن للصور من خلال ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
سطر 391: سطر 320:
}
}
</syntaxhighlight>
</syntaxhighlight>
=== نمط التخطيط <code>raw</code> التجريبي ===
نُقل التخطيط التجريبي <code>"layout="raw</code> إلى وحدة برمجية جديدة، لذلك لا بد من استخدام <code>next/future/image</code> بدلًا عنه.


=== الصور المتحركة ===
=== الصور المتحركة ===
يتجاوز المحمّل الافتراضي عملية تحسين الصور المتحركة تلقائيًا ويقدم الصورة كما هي. يدعم الكشف التلقائي عن الصور المتحركة التنسيقات GIF و APNG و WebP. لكن إن أردت أن تتجاوز صراحة تحسين صورة محددة، استخدم الخاصية <code>unoptimized</code>
يتجاوز المحمّل الافتراضي عملية تحسين الصور المتحركة تلقائيًا ويقدم الصورة كما هي. يدعم الكشف التلقائي عن الصور المتحركة التنسيقات GIF و APNG و WebP. لكن إن أردت أن تتجاوز صراحة تحسين صورة محددة، استخدم الخاصية <code>unoptimized</code>.


== اقرأ أيضًا ==
== اقرأ أيضًا ==


* [[Next.js/image optimization|تحسين الصور في Next.js]]
* [[Next.js/image optimization|تحسين الصور في Next.js]]
== أمثلة ==
* [https://github.com/vercel/next.js/tree/canary/examples/image-component Image Component]


== المصادر ==
== المصادر ==


* الصفحة [https://nextjs.org/docs/api-reference/next/image Next/image] من توثيق Next.js الرسمي.
* الصفحة [https://nextjs.org/docs/api-reference/next/image Next/image] من توثيق Next.js الرسمي.
[[تصنيف:Next.js|{{SUBPAGENAME}}]]
[[تصنيف:Next.js API|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 16:27، 4 فبراير 2023

ملاحظة: كُتب هذا التوثيق للواجهة البرمجية الخاصة بالمكوّن image ولتحسين الصور. للاطلاع أكثر على هذه الميزة واستخدامها في Next.js عُد إلى صفحة "تحسين الصور" من هذا التوثيق.

ملاحظة: إن كنت تستخدم إصدارًا أقدم من 13، فارجع إلى توثيق next/legacy/image إذ جرى تغيير اسم المكون بدءًا من ذلك الإصدار.

تنبيه: ظهرت بعض الثغرات في متصفحي Safari (نسخة 15 وما بعد) و فايرفوكس (نسخة 67 وما بعد) وإليك بعض الحلول المقترحة:

  • تظهر في سفاري حواف رمادية عند تحميل الصورة، قد يكون الحل باستخدام قواعد CSS التالية:
@supports (font: -apple-system-body)
          (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }
  • تظهر خلفية بيضاء أثناء التحميل في فايرفوكس وقد يكون الحل هو تمكين تنسيق AVIF أو استخدام الخاصية placeholder="blur

الخاصيات الضرورية

نستعرض في هذا القسم الخاصيات الضرورية لعمل المكوّن </ Image>.

الخاصية src

لا بد أن تكون هذه الخاصية واحدة من هذه:

  1. ملف صورة مُدرج بشكل ساكن.
  2. مسار مطلق absolute لعنوان URL خارجي أو داخلي وفقًا للمحمّل loader أو وفقًا لإعدادات المحمّل المخصصة.

عند استخدام عنوان URL خارجي، لا بد من إضافته إلى النطاقات domains في ملف التهيئة next.config.js.

الخاصية width

وتمثّل هذه الخاصية الاتساع المُصيَّر مقدرًا بالبكسل، وبالتالي سيؤثر على حجم الصورة عند عرضها. تُعد هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية layout لها هي "fill".

الخاصية height

وتمثّل هذه الخاصية الارتفاع المُصيَّر مقدرًا بالبكسل، وبالتالي سيؤثر على حجم الصورة عند عرضها. تُعد هذه الخاصية مطلوبة ما عدا حالة الصورة المدرجة بشكل ساكن أو تلك التي تكون قيمة الخاصية layout لها هي "fill".

الخاصية alt

وتستخدم لوصف الصورة كتابيًا كي تتمكن قارئات الشاشة ومحركات البحث من تمييزها. كما يُعد الوصف طريقة لتفادي حالة عدم تحميل الصورة سواء كان عرض الصور معطلًا في المتصفح أو حدث خطأ ما أثناء التحميل. ينبغي أن تضم هذه الخاصية نصًا يمكن أن نستبدل به الصورة دون يغيّر معنى الصفحة، وليس الغرض منه تعزيز محتوى الصورة. وبالتالي يجب ألا يكرر هذا النص المعلومات الت تعرضها العناوين أعلى وأسفل الصورة. اما إذا كانت الصورة للديكور فقط ولا تحوي معلومات أساسية للمستخدم ينبغي أن يكون النص فارغًا (""=alt)

الخاصيات الاختيارية

يقبل المكوّن </ Image> مجموعة من الخاصيات الاختيارية إضافة إلى تلك الإجبارية. لهذا نلقي نظرة في هذا القسم على أكثر الخاصيات المستخدمة شيوعًا، كما سنتعرف لاحقًا إلى بعض الخاصيات نادرة الاستعمال.

الخاصية loader

وهي دالة تعيد عنوان URL نصي للصورة وتقبل المعاملات التالية:

  • src
  • width
  • quality

إليك مثالًا عن استخدام محمّل مخصص مع next/image:

import Image from 'next/image'

const myLoader = ({ src, width, quality }) => {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}

const MyImage = (props) => {
  return (
    <Image
      loader={myLoader}
      src="me.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

بإمكانك بدلًا من ذلك استخدام إعدادات loaderFile في next.config.js لتهيئة كل نسخة من الكائن next/image في تطبيقك دون تمرير أية خاصيات.

الخاصية fill

تأخذ الخاصية قيمة منطقية تحدد فيما إذا كانت الصورة ستملأ مساحة العنصر الأب بدلًا من ضبط الخاصيتين width و height

ينبغي في هذه الحالة أن يمتلك العنصر الأب خاصية التنسيق position: "relative"‎ أو position: "fixed"‎ أو position: "absolute"‎.

يمتلك العنصر img افتراضيًا التنسيق position: "absolute"‎ وبالتالي ستتوسع الصورة حتى تملأ المساحة المخصصة لها، لهذا يمكنك استخدام الخاصية object-fit: "contain"‎ لتملأ الصورة الحاوية التي تضمها وتحتفظ بتناسب أبعادها. بينما سيؤدي التنسيق إلى تمدد الصورة واقتصاصها حتى تحافظ على تناسب الأبعاد، ولكي يبدو الأمر صحيحًا،لا بد من ضبط تنسيق الطفحان للعنصر الأب بالشكل overflow: "hidden".

الخاصية sizes

تؤثر قيمة الخاصية sizes بشدة على أداء الصورة التي تستخدم الخاصية fill أو التي تُنسّق لتكون متجاوبة. وللخاصية sizes غايتان أساسيتان تتعلقان بأداء الصورة:

الأولى: يستخدم المتصفح هذه الخاصية حجم الصورة التي ينبغي تحميلها من مجموعة الأحجام التي يوّلدها المكون next/image تلقائيًا. عندما يختار المتصفح حجم الصورة، فهو لا يعرف بعد حجم الصورة على الصفحة، لهذا سيختار الصورة التي تمتلك أبعادًا أكبر أو تعادل أبعاد نافذة العرض. وهكذا تخبر الخاصية sizes المتصفح أن الصورة ستكون أقل من حجم الشاشة الكامل. وانتبه إلى أن عرض الصورة سيكون 100vw إن لم تستخدم الخاصية مع صورة تستخدم الخاصية fill.

الثانية: تضبط الخاصية sizes طريقة توليد الكائن next/image لمجموعة أحجام الصورة. فإن لم تكن الخاصية sizes موجودة ستوُلد مجموعة صغيرة من القياسات التي تناسب الصور ثابتة الحجم. لكن إذا عُرفت هذه الخاصية ستكون المجموعة المولَّدة أكبر وملائمة أكثر للصور المتجاوبة.

إن ضمت الخاصية sizes قياسات مثل 50vw والتي تشير إلى نسبة مئوية من اتساع نافذة العرض، ستُختصر قائمة الأحجام كي لا تتضمن أية قيم أصغر بكثير من اللازم.

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

import Image from 'next/image'
const Example = () => (
  <div className="grid-element">
    <Image
      src="/example.png"
      fill
      sizes="(max-width: 768px) 100vw,
              (max-width: 1200px) 50vw,
              33vw"
    />
  </div>
)

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

الخاصية quality

وتمثل نوعية الصورة المحسنة كرقم صحيح بين 1 و 100. تمثّل 100 الدقة الأفضل والقيمة الافتراضية 75.

الخاصية priority

تُعد الصور ذات أولوية عالية عندما تأخذ هذه الخاصية القيمة true ويُعاد تحميلها، وتعطل ميزة التحميل الكسول تلقائيًا في حال استخدام هذه الخاصية. القيمة الافتراضية هي false.

لا بد من استخدام هذه الخاصية لأي صورة يعدّها المتصفح "أكبر عنصر سيُرسم على الشاشة LCP". من الملائم أحيانًا وجود عدة صور تستخدم الخاصية priority، لأن العديد من الصور قد تكون LCP لواجهات عرض مختلفة.

إن القيم الافتراضية للخاصية priority هي false، ولا ينبغي استخدامها ما لم تكن الصورة مرئية في الجزء الظاهر من الصفحة.

الخاصية placeholder

تستخدم لحجز مساحة كافية للصورة أثناء التحميل. ولها قيمتان: الافتراضية empty و blur.

  • عندما تكون قيمة الخاصية blur، تُستخدم الخاصية blurDataURL لحجز حيّز الصورة. وإن كانت قيمة الخاصية src كائنًا مصدره إدراج ساكن لصورة لها أحد الامتدادات jpg. أو png. أو webp. أو avif.، سيُحدد blurDataURL حيّز الصورة تلقائيًا. يجب استخدام الخاصية blurDataURL مع الصور الديناميكية، كما أن حلولًا مثل Plaiceholder قد تساعد عند تمثيل العناصر باستخدام التشفير base64.
  • عندما تكون قيمة الخاصية empty، لن يكون هناك حيّز لتحميل الصورة بل فقط مسافة فارغة. جرّب الامثلة التالية:
    • مثال عن حيّز التحميل مع blur.
    • مثال عن تأثير الوميض مع الخاصية blurDataURL.
    • مثال عن التأثير اللوني مع الخاصية blurDataURL.

الخاصيات المتقدمة

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

الخاصية style

تسمح هذه الخاصية بتمرير تنسيقات CSS إلى عنصر الصورة التحتي <img>.

تذكر أن الخاصيتين الإجباريتين width و height قد تتفاعلان مع تنسيقك، فإن ضبطت الاتساع width لا بد من ضبط الارتفاع أيضًا بالشكل "height="auto وإلا ستتشوه الصورة.

الدالة onLoadingComplete

وهي دالة تُنفَّذ بمجرد أن يكتمل تحميل الصورة ويُزال الحيّز المحدد لها أثناء التحميل. تقبل هذه الدالة معاملًا واحدًا هو مرجع إلى العنصر التحتي للصورة <img>.

الدالة onLoad

وهي دالة تُستدعى عند بداية تحميل الصورة. وتجدر الملاحظة هنا أن حدث التحميل قد يحدث قبل إزالة الحيز المحدد للصورة واكتمال عرض الصورة. وبإمكانك استخدام onLoadingComplete بدلًا عنها.

الدالة onErorr

وهي دالة تُستدعى إن أخفق تحميل الصورة.

الخاصية loading

تنبيه: صممت هذه الخاصية للاستخدام المتقدم. فقد يسيء استخدام التحميل الشره eager إلى الأداء. لهذا ننصح باستخدام الخاصية priority بدلًا عنها، إذ تحمّل هذه الخاصية الصورة "بشراهة" في معظم الحالات تقريبًا.

تحدد الخاصية سلوك تحميل الصورة، وقيمتها الافتراضية lazy (كسول). ففي حالة السلوك الكسول lazy، لا تُحمّل الصورة حتى تقترب مسافة محددة من نافذة العرض (قبل أن تُعرض بقليل). أما في حالة السلوك الشره eager، ستُحمّل الصورة مباشرة.

الخاصية blurDataURL

وهو عنوان URL خاص بالبيانات (له البادئة ":data") يُستخدم كحيّز تحميل صورة قبل تحميل الصورة المحددة في الخاصية src. يظهر تأثير هذه الخاصية عندما تُستخدم مع الخاصية "placeholder="blur.

ينبغي أن تكون الصورة مرمّزة وفق القاعدة base64، إذ تُكبّر الصورة وتُغشّى. لهذا يستحسن أن تكون هذه الصورة صغيرة (10 بكسل أو أقل)، فإضافة صور كبيرة إلى حيّز التحميل قد يسيء إلى الأداء. راجع الأمثلة السابقة في فقرة الخاصية placeholder.

الخاصية unoptimized

تُقدم الصورة في حال كانت قيمة هذه الخاصية true كما هي دون تغيير في النوعية أو الحجم أو التنسيق. القيمة الافتراضية لهذه الخاصية false.

يمكن تعيين هذه الخاصية لكل الصور بتحديث الملف next.config.js من خلال إضافة الإعدادات التالية:

module.exports = {
  images: {
    unoptimized: true,
  },
}

خاصيات أخرى

تمرر الخاصيات الأخرى للمكوّن </ Image> إلى عنصر الصورة التحتي img ما عدا الخاصيات التالية:

  • srcSet: استعمل DeviceSizes بدلًا عنها.
  • decoding: وتكون دائمًا "async".

خاصيات الإعداد

الخاصية remotePatterns

ملاحظة: يُعد الإعداد remotePatterns تجريبيًا حاليًا وعرضة للتغيير. استخدم domains في نسخ الإنتاج.

لا بد من تهيئة تطبيقك حتى يستخدم صورًا من مصادر خارجية دون أن يتسلل المستخدمين المشبوهين من خلالها إلى تطبيقك. وبهذا تتأكد أن الصور الخارجية التي تأتي من حساباتك فقط يمكن تخديمها بواسطة واجهة Next.js البرمجية لتحسين الصور. يمكن أن تُهيأ هذه الصور من خلال الخاصية remotePatterns في الملف next.config.js كما يلي:

module.exports = {
  experimental: {
    images: {
      remotePatterns: [
        {
          protocol: 'https',
          hostname: 'example.com',
          port: '',
          pathname: '/account123/**',
        },
      ],
    },
  },
}

ملاحظة: يتأكد المثال السابق من ضرورة أن تبدأ الخاصية src للمكوّن next/image بالعنوان /https://example.com/account123. وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيولّد الخطأ 400 (طلب خاطئ bad request)

إليك مثالًا آخر عن استخدام الخاصية remotePatterns في الملف next.config.js:

module.exports = {
  experimental: {
    images: {
      remotePatterns: [
        {
          protocol: 'https',
          hostname: '**.example.com',
        },
      ],
    },
  },
}

ملاحظة: يتأكد المثال السابق من ضرورة أن تبدأ الخاصية src للمكوّن next/image بأحد العناوين https://img1.example.com أو https://me.avatar.example.com. وأي بروتوكول أو اسم مضيف أو منفذ أو مسار لا يتطابق معه سيولّد الخطأ 400 (طلب خاطئ bad request).

يمكن استخدام أنماط الأحرف البديلة لترميز pathname أو hostname وفقًا للصيغتين التاليتين:

  • *: يتطابق من قسم مسار مفرد أو نطاق فرعي.
  • **: يتطابق مع أي عدد من أقسام المسارات في نهايتها أو مع النطاقات الفرعية في بدايتها.

لا تعمل الصيغة ** وسط النمط.

النطاقات domain

ملاحظة: ننصح باستخدام الخاصية بدلًا عنها كي تتمكن من تحديد بروتوكول أو مسار

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

إليك مثالًا عن استخدام الخاصية domains في الملف next.config.js:

module.exports = {
  images: {
    domains: ['assets.acme.com'],
  },
}

إعدادات المحمِّل

إن أردت استخدام مزوّد سحابي لتحسين الصور بدلًا من استخدام واجهة Next.js البرمجية المدمجة لتحسين الصور، يمكنك إعداد الخاصية loaderFile في ملف next.config.js:

module.exports = {
  images: {
    loader: 'custom',
    loaderFile: './my/image/loader.js',
  },
}

لا بد أن تشير إلى ملف بالنسبة إلى جذر تطبيق Next.js، ولا بد أن يصدّر الملف دالة تعيد نصًا. إليك مثالًا:

export default function myImageLoader({ src, width, quality }) {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}

بإمكانك أيضًا استخدام الخاصية loader لتهيئة كل نسخة من الكائن next/image على حدى.

إعدادات متقدمة

تُعد الإعدادات التالية متقدمة ولحالات محدودة وليست ضرورية عادة. فإن اخترت أن تضبط الخاصيات القادمة، فستبدّل كل التغييرات التي ستحصل على إعدادات Next.js الافتراضية في التحديثات المستقبلية.

الخاصية deviceSizes

إن كنت تعرف اتساع اجهزة مستخدميك، يمكنك وضع قائمة بالاتساعات الممكنة باستخدام الخاصية deviceSizes وذلك ضمن الملف next.config.js. تُستخدم هذه القائمة عندما يستخدم المكوّن next/image الخاصية sizes للتأكد من تقديم الصورة الصحيحة الملائمة لجهاز المستخدم.

إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:

module.exports = {
  images: {
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
  },
}

الخاصية imageSizes

بإمكانك تحديد قائمة بالاتساعات التي قد تأخذها صورة من خلال الخاصية images.imageSizes وذلك ضمن ملف التهيئة next.config.js. تُضم هذه القيم إلى مصفوفة deviceSizes لتشكيل مصفوفة من القياسات التي تُستخدم في توليد قيم مجموعات srcset التي تحدد الأبعاد الملائمة لكل نافذة عرض.

يعود السبب في وجود قائمتين منفصلتين هو أن الخاصية imageSizes تُستخدم فقط للصورة التي تمتلك الخاصية sizes، التي تدل على أن اتساع الصورة أقل من اتساع الشاشة، وبالتالي يجب أن تكون القياسات في الخاصية imageSizes أصغر من قيمة الخاصية deviceSizes.

إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:

module.exports = {
  images: {
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
}

تنسيقات الصور المقبولة

تكتشف الواجهة البرمجية الافتراضية لتحسين الصور التنسيقات التي يدعمها المتصفح تلقائيًا من خلال الترويسة Accept للطلب.

إن تطابقت الترويسة Accept مع أكثر من تنسيق من التنسيقات المهيأة يُستخدم التنسيق الأول في القائمة، لهذا ينبغي الانتباه إلى ترتيب عناصر القائمة. إن لم تجد الواجهة أي تطابق (أو كانت الصورة المصدرية متحركة)، ستتراجع واجهة تحسين الصور إلى تنسيق الصورة الأصلي.

إن لم تكن هناك أية إعدادات بهذا الخصوص، تُطبق القيم الافتراضية التالية:

module.exports = {
  images: {
    formats: ['image/webp'],
  },
}

بإمكانك تفعيل التنسيق AVIF من خلال الإعداد التالي:

module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
}

ملاحظة: تتطلب الصورة وفق تنسيق AVIF زمنًا أطول بحوالي 20% لتشفيرها، لكن يمكن أن تُضغط أكثر موفرة 20% موازنةً بالتنسيق WebP. وهذا يعني أن تحميل تلك الصور للمرة الأولى سيكون أبطأ لكن التحميلات التالية من الذاكرة المؤقتة سيكون أسرع. ملاحظة: إن قررت أن تستضيف تطبيقك باستخدام مخدم وكيل أو شبكة توزيع محتوى Proxy/CDN أمام تطبيق Next.js، لا بد من ضبط الخادم الوكيل لتوجيه الترويسة Accept.

سلوك التخزين المؤقت

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

تُحسن الطلب تلقائيًا عند الطلب وتُخزّن في المجلد ‎<distDir>/cache/images. تُقدّم الصورة المحسنة لاحقًا من هذا المجلد حتى تنتهي فترة صلاحيتها. عندما يتطابق الطلب مع ملف انتهت صلاحيته، تُقدّم الصورة كما هي مباشرة ثم تُحسّن الصورة مجددًا في الخلفية (يُدعى هذا أيضًا إعادة التحقق) وتُخزَّن في نفس المجلد وتُعطى فترة صلاحية جديدة.

تُحدد حالة التخزين المؤقت لصورة بقراءة قيمة ترويسة الاستجابة x-nextjs-cache التي تمتلك إحدى القيم التالية:

  • MISS: المسار غير موجود في الذاكرة المؤقتة (يحدث ذلك غالبًا مرة واحدة عند أول زيارة).
  • STALE: المسار موجود في الذاكرة المؤقتة لكنه تجاوز فترة الصلاحية لذا سيُحدّث في الخلفية.
  • HIT: المسار في الذاكرة المؤقتة وضمن فترة الصلاحية.

تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد minimumCacheTTL أو ترويسة تيار رفع الصورة Cache-Control، وخاصة القيمة max-age للترويسة Cache-Control. وإن وجدت كلتا القيمتين s-maxage و max-age ستؤخذ القيمة s-maxage. تمرر قيمة max-age أيضًا ضمن أي تيار تنزيل للصور نحو العميل بما في ذلك شبكات إيصال المحتوى والمتصفحات.

  • بإمكانك ضبط الإعداد minimumCacheTTL لزيادة زمن الصلاحية عندما لا يتضمن تيار رفع الصورة الترويسة Cache-Control أو أن قيمته صغيرة جدًا.
  • بإمكانك تهيئة deviceSizes و imageSizes لتقليل العدد الكلي للصور التي يمكن توليدها.
  • يمكنك استخدام الإعداد formats لتعطيل التنسيقات المتعددة للصورة لصالح تنسيق محدد.

الخاصية minimumCacheTTL

بإمكانك ضبط زمن الصلاحية (زمن البقاء) Time To Live بالثانية للصور المخزنة في الذاكرة المؤقتة. لكن من الأفضل في حالات كثيرة استخدام الإدراج الساكن للصور الذي يرمّز مباشرة محتوى الملف ويخزّن الذاكرة بشكل دائم من خلال ضبط قيمة الترويسة Cache-Control على immutable.

module.exports = {
  images: {
    minimumCacheTTL: 60,
  },
}

تُحدد الصلاحية (أو العمر الأقصى) بالقيمة الأعلى للإعداد minimumCacheTTL أو ترويسة تيار رفع الصورة Cache-Control، وخاصة القيمة max-age للترويسة Cache-Control. فإن أردت تغيير هذا السلوك لكل صورة على حدى، تستطيع ذلك من خلال تهيئة الترويسات headers لكي تضيف الترويسة Cache-Control إلى تيار رفع الصورة (الصورة some-asset.jpg/ مثلًا وليست الصورة next/image_/ نفسها).

لا توجد آلية للتحقق من الذاكرة المؤقتة حاليًا، لذلك من الأفضل أن تبقي قيمة minimumCacheTTL منخفضةً وإلا قد تضطر إلى تغيير الخاصية src يدويًا أو تلغي المجلد distDir>/cache/images>.

تعطيل الإدراج الساكن

يسمح لك السلوك الافتراضي لمكون الصور أن تدرج ملفات صور ساكنة من خلال الأمر import icon from './icon.png ثم تمررها إلى الخاصية src. لكن قد ترغب في بعض الحالات أن تُعطِّل هذه الميزة إن تعارضت مع ملحقات أخرى تتوقع أن يكون إدراج الملفات مختلفًا.

تستطيع تعطيل الإدراج الساكن للصور من خلال ملف التهيئة next.config.js:

module.exports = {
  images: {
    disableStaticImages: true,
  },
}

خطورة السماح بالصور الشعاعية SVG

لا يُحسن المُحمّل الافتراضي الصور الشعاعية ذات التنسيق SVG لأسباب عدة أولها أنه بالإمكان تغيير أبعاد الصور الشعاعية دون أن تفقد شيئًا، والثاني أن للتنسيق SVG الكثير من الميزات التي تشابه HTML/CSS مما قد يسبب ثغرات ما لم تُضبط ترويسات سياسة أمان المحتوى CSP بشكل ملائم.

إن أردت تقديم صور SVG من خلال واجهة التحسين الافتراضية، اضبط الخاصيتين dangerouslyAllowSVG و contentSecurityPolicy ضمن ملف next.config.js:

module.exports = {
  images: {
    dangerouslyAllowSVG: true,
    contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
  },
}

الصور المتحركة

يتجاوز المحمّل الافتراضي عملية تحسين الصور المتحركة تلقائيًا ويقدم الصورة كما هي. يدعم الكشف التلقائي عن الصور المتحركة التنسيقات GIF و APNG و WebP. لكن إن أردت أن تتجاوز صراحة تحسين صورة محددة، استخدم الخاصية unoptimized.

اقرأ أيضًا

أمثلة

المصادر

  • الصفحة Next/image من توثيق Next.js الرسمي.