وقت تشغيل الحافة (Edge Runtime)

يحتوي Next.js على وقتين تشغيل للخادم يمكنك استخدامهما في تطبيقك:

محاذير

  • لا يدعم وقت تشغيل الحافة جميع واجهات برمجة تطبيقات Node.js. قد لا تعمل بعض الحزم كما هو متوقع.
  • لا يدعم وقت تشغيل الحافة التجديد الثابت التدريجي (ISR).
  • يمكن لكلا وقت التشغيل دعم البث (streaming) اعتمادًا على محول النشر الخاص بك.

مرجع

يدعم وقت تشغيل الحافة واجهات برمجة التطبيقات التالية:

واجهات برمجة تطبيقات الشبكة

APIالوصف
Blobيمثل كائن blob
fetchيجلب موردًا
FetchEventيمثل حدث جلب
Fileيمثل ملفًا
FormDataيمثل بيانات النموذج
Headersيمثل رؤوس HTTP
Requestيمثل طلب HTTP
Responseيمثل استجابة HTTP
URLSearchParamsيمثل معلمات بحث URL
WebSocketيمثل اتصال websocket

واجهات برمجة تطبيقات التشفير

APIالوصف
atobيفك تشفير سلسلة مشفرة بـ base-64
btoaيشفر سلسلة بـ base-64
TextDecoderيفك تشفير Uint8Array إلى سلسلة
TextDecoderStreamمفكك تشفير متسلسل للبث
TextEncoderيشفر سلسلة إلى Uint8Array
TextEncoderStreamمشفر متسلسل للبث

واجهات برمجة تطبيقات البث

APIالوصف
ReadableStreamيمثل بثًا قابلًا للقراءة
ReadableStreamBYOBReaderيمثل قارئًا لـ ReadableStream
ReadableStreamDefaultReaderيمثل قارئًا افتراضيًا لـ ReadableStream
TransformStreamيمثل بث تحويل
WritableStreamيمثل بثًا قابلًا للكتابة
WritableStreamDefaultWriterيمثل كاتبًا افتراضيًا لـ WritableStream

واجهات برمجة تطبيقات التشفير

APIالوصف
cryptoيوفر الوصول إلى الوظائف التشفيرية للنظام
CryptoKeyيمثل مفتاحًا تشفيريًا
SubtleCryptoيوفر الوصول إلى البدائيات التشفيرية الشائعة، مثل التجزئة، التوقيع، التشفير أو فك التشفير

واجهات برمجة التطبيقات القياسية للويب (Web Standard APIs)

الواجهة البرمجيةالوصف
AbortControllerتتيح لك إلغاء واحد أو أكثر من طلبات DOM متى ما رغبت
Arrayتمثل مصفوفة من القيم
ArrayBufferتمثل مخزنًا ثابت الطول للبيانات الثنائية الخام
Atomicsتوفر عمليات ذرية كطرق ثابتة
BigIntتمثل عددًا صحيحًا بدقة غير محدودة
BigInt64Arrayتمثل مصفوفة منظمة من أعداد صحيحة موقعة 64-بت
BigUint64Arrayتمثل مصفوفة منظمة من أعداد صحيحة غير موقعة 64-بت
Booleanتمثل كيانًا منطقيًا ويمكن أن يكون لها قيمتان: true و false
clearIntervalتلغي إجراءً متكررًا مؤقتًا تم إنشاؤه مسبقًا عن طريق استدعاء setInterval()
clearTimeoutتلغي إجراءً متكررًا مؤقتًا تم إنشاؤه مسبقًا عن طريق استدعاء setTimeout()
consoleتوفر وصولاً إلى وحدة تحكم تصحيح الأخطاء في المتصفح
DataViewتمثل عرضًا عامًا لـ ArrayBuffer
Dateتمثل لحظة واحدة في الوقت بتنسيق مستقل عن المنصة
decodeURIتفك تشفير معرف الموارد الموحد (URI) الذي تم إنشاؤه مسبقًا بواسطة encodeURI أو بواسطة روتين مشابه
decodeURIComponentتفك تشفير مكون معرف الموارد الموحد (URI) الذي تم إنشاؤه مسبقًا بواسطة encodeURIComponent أو بواسطة روتين مشابه
DOMExceptionتمثل خطأً يحدث في DOM
encodeURIتشفر معرف الموارد الموحد (URI) عن طريق استبدال كل مثيل لبعض الأحرف بتسلسلات هروب تمثل ترميز UTF-8 للحرف
encodeURIComponentتشفر مكون معرف الموارد الموحد (URI) عن طريق استبدال كل مثيل لبعض الأحرف بتسلسلات هروب تمثل ترميز UTF-8 للحرف
Errorتمثل خطأً عند محاولة تنفيذ عبارة أو الوصول إلى خاصية
EvalErrorتمثل خطأً يحدث فيما يتعلق بالدالة العامة eval()
Float32Arrayتمثل مصفوفة منظمة من أعداد الفاصلة العائمة 32-بت
Float64Arrayتمثل مصفوفة منظمة من أعداد الفاصلة العائمة 64-بت
Functionتمثل دالة
Infinityتمثل قيمة اللانهاية الرياضية
Int8Arrayتمثل مصفوفة منظمة من أعداد صحيحة موقعة 8-بت
Int16Arrayتمثل مصفوفة منظمة من أعداد صحيحة موقعة 16-بت
Int32Arrayتمثل مصفوفة منظمة من أعداد صحيحة موقعة 32-بت
Intlتوفر وصولاً إلى وظائف التدويل (Internationalization) والتوطين (Localization)
isFiniteتحدد ما إذا كانت القيمة عددًا محدودًا
isNaNتحدد ما إذا كانت القيمة NaN أم لا
JSONتوفر وظائف لتحويل قيم JavaScript من وإلى تنسيق JSON
Mapتمثل مجموعة من القيم، حيث يمكن أن يظهر كل قيمة مرة واحدة فقط
Mathتوفر وصولاً إلى الدوال والثوابت الرياضية
Numberتمثل قيمة رقمية
Objectتمثل الكائن الذي هو أساس جميع كائنات JavaScript
parseFloatتحلل وسيط سلسلة نصية وتعيد رقم فاصلة عائمة
parseIntتحلل وسيط سلسلة نصية وتعيد عددًا صحيحًا للأساس المحدد
Promiseتمثل الانتهاء النهائي (أو الفشل) لعملية غير متزامنة، وقيمتها الناتجة
Proxyتمثل كائنًا يستخدم لتعريف سلوك مخصص للعمليات الأساسية (مثل البحث عن الخاصية، التعيين، التعداد، استدعاء الدالة، إلخ)
queueMicrotaskتضيف مهمة صغيرة (microtask) إلى قائمة الانتظار لتنفيذها
RangeErrorتمثل خطأً عندما تكون القيمة ليست في مجموعة أو نطاق القيم المسموح بها
ReferenceErrorتمثل خطأً عند الإشارة إلى متغير غير موجود
Reflectتوفر طرقًا لعمليات JavaScript القابلة للاعتراض
RegExpتمثل تعبيرًا منتظمًا، مما يسمح لك بمطابقة مجموعات من الأحرف
Setتمثل مجموعة من القيم، حيث يمكن أن يظهر كل قيمة مرة واحدة فقط
setIntervalتستدعي دالة بشكل متكرر، مع تأخير زمني ثابت بين كل استدعاء
setTimeoutتستدعي دالة أو تقيم تعبيرًا بعد عدد محدد من المللي ثانية
SharedArrayBufferتمثل مخزنًا ثابت الطول للبيانات الثنائية الخام
Stringتمثل سلسلة من الأحرف
structuredCloneتنشئ نسخة عميقة من قيمة
Symbolتمثل نوع بيانات فريدًا وغير قابل للتغيير يستخدم كمفتاح لخاصية كائن
SyntaxErrorتمثل خطأً عند محاولة تفسير كود غير صحيح من الناحية التركيبية
TypeErrorتمثل خطأً عندما لا تكون القيمة من النوع المتوقع
Uint8Arrayتمثل مصفوفة منظمة من أعداد صحيحة غير موقعة 8-بت
Uint8ClampedArrayتمثل مصفوفة منظمة من أعداد صحيحة غير موقعة 8-بت مقيدة بين 0-255
Uint32Arrayتمثل مصفوفة منظمة من أعداد صحيحة غير موقعة 32-بت
URIErrorتمثل خطأً عند استخدام دالة معالجة URI العالمية بطريقة خاطئة
URLتمثل كائنًا يوفر طرقًا ثابتة تستخدم لإنشاء عناوين URL للكائنات
URLPatternتمثل نمط URL
URLSearchParamsتمثل مجموعة من أزواج المفتاح/القيم
WeakMapتمثل مجموعة من أزواج المفتاح/القيم حيث تكون المفاتيح مرجعًا ضعيفًا
WeakSetتمثل مجموعة من الكائنات حيث يمكن أن يظهر كل كائن مرة واحدة فقط
WebAssemblyتوفر وصولاً إلى WebAssembly

ملحقات (Polyfills) المحددة في Next.js

متغيرات البيئة (Environment Variables)

يمكنك استخدام process.env للوصول إلى متغيرات البيئة سواء في next dev أو next build.

واجهات برمجة التطبيقات غير المدعومة

يحتوي وقت تشغيل الحافة (Edge Runtime) على بعض القيود بما في ذلك:

  • واجهات برمجة تطبيقات Node.js الأصلية غير مدعومة. على سبيل المثال، لا يمكنك القراءة من أو الكتابة إلى نظام الملفات.
  • يمكن استخدام node_modules طالما أنها تطبق وحدات ES ولا تستخدم واجهات برمجة تطبيقات Node.js الأصلية.
  • استدعاء require مباشرة غير مسموح به. استخدم وحدات ES بدلاً من ذلك.

ميزات لغة JavaScript التالية معطلة، ولن تعمل:

واجهة برمجة التطبيقالوصف
evalتقيّم كود JavaScript ممثلًا كسلسلة نصية
new Function(evalString)تنشئ دالة جديدة بالكود المقدم كوسيطة
WebAssembly.compileتُجمّع وحدة WebAssembly من مصدر مخزن مؤقت
WebAssembly.instantiateتُجمّع وتُنشئ وحدة WebAssembly من مصدر مخزن مؤقت

في حالات نادرة، قد يحتوي الكود الخاص بك (أو يستورد) بعض عبارات تقييم الكود الديناميكي التي لا يمكن الوصول إليها أثناء التشغيل ولا يمكن إزالتها عن طريق تقليل الحجم (treeshaking). يمكنك تخفيف الفحص للسماح بملفات محددة من خلال تكوين Middleware الخاص بك:

middleware.ts
export const config = {
  unstable_allowDynamic: [
    // يسمح بملف واحد
    '/lib/utilities.js',
    // استخدم نمطًا عامًا للسماح بأي شيء في وحدة function-bind من طرف ثالث
    '**/node_modules/function-bind/**',
  ],
}

unstable_allowDynamic هو نمط عام (glob)، أو مصفوفة من الأنماط العامة، تتجاهل تقييم الكود الديناميكي لملفات محددة. الأنماط العامة مرتبطة بمجلد جذر التطبيق الخاص بك.

احذر أنه إذا تم تنفيذ هذه العبارات على الحافة، فسوف تسبب خطأ أثناء التشغيل.