Backالعودة إلى المدونة

الإصدار المرشح الثاني لـ Next.js 15

أصبح الإصدار المرشح الثاني (RC) لـ Next.js 15 متاحًا الآن. يتيح لك هذا الإصدار اختبار أحدث الميزات قبل الإصدار المستقر القادم.

بعد الإعلان عن الإصدار المرشح الأول لـ Next.js 15 في مايو الماضي، قمنا بإعداد إصدار مرشح ثانٍ بناءً على ملاحظاتكم. إليكم ما كنا نعمل عليه:

جرب الإصدار المرشح لـ Next.js 15 (RC2) اليوم:

# استخدم أداة سطر الأوامر الجديدة للترقية التلقائية
npx @next/codemod@canary upgrade rc
 
# ...أو قم بالترقية يدويًا
npm install next@rc react@rc react-dom@rc

ملاحظة: يتضمن هذا الإصدار المرشح جميع التغييرات من الإصدار المرشح السابق.

ترقيات سلسة مع أداة سطر الأوامر codemod

نقوم بتضمين codemods (تحويلات كود تلقائية) مع كل إصدار رئيسي من Next.js للمساعدة في أتمتة ترقية التغييرات الجذرية.

لجعل الترقيات أكثر سلاسة، قمنا بإصدار أداة سطر أوامر محسنة لـ codemod:

npx @next/codemod@canary upgrade rc

تساعدك هذه الأداة في ترقية قاعدة الكود الخاصة بك إلى أحدث الإصدارات المستقرة أو ما قبل الإصدار. ستقوم أداة سطر الأوامر بتحديث التبعيات الخاصة بك، وعرض codemods المتاحة، وإرشادك خلال تطبيقها. تحدد علامة التوزيع المحددة في سطر الأوامر (@rc، @canary، إلخ) الإصدار الذي سيتم الترقية إليه.

تعرف على المزيد حول codemods في Next.js.

Turbopack للتطوير

سيصبح Turbopack للتطوير المحلي مستقرًا في الإصدار العام لـ Next.js 15، مع بقائه اختياريًا. يمكنك تجربته اليوم عن طريق تشغيل:

next dev --turbo

بفضل آلاف المطورين الذين شاركوا في الاختبار، والإبلاغ عن المشكلات، والتحقق من الإصلاحات خلال مراحل بيتا ومرشح إصدار Turbopack، قمنا بحل 54 مشكلة على GitHub منذ الإصدار المرشح الأول لـ Next.js 15. إلى جانب هذا الجهد المجتمعي، ساعد اختبارنا الداخلي على vercel.com، v0.dev، و nextjs.org في تحديد العديد من التحسينات الإضافية.

في الأشهر الثلاثة الماضية، ركزنا على تحسين أداء التجميع البارد. مقارنة بالإصدار السابق، لاحظنا:

  • انخفاض بنسبة 25-35% في استخدام الذاكرة.
  • أسرع بنسبة 30-50% في التجميع للصفحات الكبيرة التي تحتوي على آلاف الوحدات.

سنستمر في تحسين هذه المجالات في الإصدارات المستقبلية.

بالنظر إلى المستقبل، يحقق فريق Turbopack تقدمًا كبيرًا في التخزين المؤقت الدائم، وتقليل استخدام الذاكرة، وTurbopack لـ next build — مع نجاح 96% من الاختبارات.

ملاحظة: راجع جميع الميزات المدعومة وغير المدعومة لـ Turbopack.

واجهات برمجة التطبيقات غير المتزامنة للطلبات (تغيير جذري)

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

لذلك، نقوم بتحويل واجهات برمجة التطبيقات التي تعتمد على بيانات محددة للطلب — مثل headers، cookies، params، و searchParams — لتصبح غير متزامنة.

import { cookies } from 'next/headers';
 
export async function AdminPanel() {
  const cookieStore = await cookies();
  const token = cookieStore.get('token');
 
  // ...
}

هذا تغيير جذري ويؤثر على واجهات برمجة التطبيقات التالية:

  • cookies
  • headers
  • draftMode
  • params في layout.js، page.js، route.js، default.js، generateMetadata، و generateViewport
  • searchParams في page.js

لتسهيل الهجرة، يمكن الوصول إلى هذه الواجهات مؤقتًا بشكل متزامن، ولكنها ستظهر تحذيرات في التطوير والإنتاج حتى الإصدار الرئيسي التالي. يتوفر codemod لأتمتة الهجرة:

npx @next/codemod@canary next-async-request-api .

في الحالات التي لا يمكن فيها لـ codemod هجرة الكود الخاص بك بالكامل، يرجى قراءة دليل الترقية. قدمنا أيضًا مثالًا لكيفية هجرة تطبيق Next.js إلى واجهات برمجة التطبيقات الجديدة.

تحسين الأمان لإجراءات الخادم

إجراءات الخادم هي وظائف من جانب الخادم يمكن استدعاؤها من العميل. يتم تعريفها عن طريق إضافة التوجيه 'use server' في أعلى الملف وتصدير دالة غير متزامنة.

حتى إذا لم يتم استيراد إجراء خادم أو وظيفة مساعدة في أي مكان آخر في الكود الخاص بك، فلا يزال نقطة نهاية HTTP متاحة للجمهور. بينما يكون هذا السلوك صحيحًا من الناحية الفنية، إلا أنه يمكن أن يؤدي إلى التعرض غير المقصود لمثل هذه الوظائف.

لتحسين الأمان، قدمنا التحسينات التالية:

  • إزالة الكود الميت: لن يتم الكشف عن معرفات إجراءات الخادم غير المستخدمة في حزمة JavaScript من جانب العميل، مما يقلل حجم الحزمة ويحسن الأداء.
  • معرفات إجراء آمنة: يقوم Next.js الآن بإنشاء معرفات غير قابلة للتخمين وغير حتمية للسماح للعميل بالإشارة إلى إجراء الخادم واستدعائه. يتم إعادة حساب هذه المعرفات بشكل دوري بين عمليات البناء لتعزيز الأمان.
// app/actions.js
'use server';
 
// هذا الإجراء **مستخدم** في تطبيقنا، لذا سيقوم Next.js
// بإنشاء معرف آمن للسماح للعميل بالإشارة
// واستدعاء إجراء الخادم.
export async function updateUserAction(formData) {}
 
// هذا الإجراء **غير مستخدم** في تطبيقنا، لذا سيقوم Next.js
// تلقائيًا بإزالة هذا الكود أثناء `next build`
// ولن ينشئ نقطة نهاية عامة.
export async function deleteUserAction(formData) {}

يجب أن تعامل إجراءات الخادم دائمًا كنقاط نهاية HTTP عامة. تعرف على المزيد حول تأمين إجراءات الخادم.

مؤشر المسار الثابت

يعرض Next.js الآن مؤشر مسار ثابت أثناء التطوير لمساعدتك في تحديد المسارات الثابتة أو الديناميكية. هذه الإشارة المرئية تجعل من السهل تحسين الأداء من خلال فهم كيفية عرض صفحاتك.

يمكنك أيضًا استخدام ناتج next build لعرض استراتيجية العرض لجميع المسارات.

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

تعرف على المزيد حول مؤشر المسار الثابت، والذي يمكن تعطيله.

مكون <Form>

يمتد مكون <Form> الجديد لعنصر HTML <form> مع الجلب المسبق، التنقل من جانب العميل، والتحسين التدريجي.

هو مفيد للنماذج التي تنتقل إلى صفحة جديدة، مثل نموذج بحث يؤدي إلى صفحة نتائج.

import Form from 'next/form';
 
export default function Page() {
  return (
    <Form action="/search">
      <input name="query" />
      <button type="submit">Submit</button>
    </Form>
  );
}

يأتي مكون <Form> مع:

  • الجلب المسبق: عندما يكون النموذج في العرض، يتم جلب التخطيط وواجهة المستخدم للتحميل مسبقًا، مما يجعل التنقل سريعًا.
  • التنقل من جانب العميل: عند الإرسال، يتم الحفاظ على التخطيطات المشتركة وحالة جانب العميل.
  • التحسين التدريجي: إذا لم يتم تحميل JavaScript بعد، لا يزال النموذج يعمل عبر التنقل لصفحة كاملة.

سابقًا، تحقيق هذه الميزات يتطلب الكثير من الكود النموذجي اليدوي. على سبيل المثال:

مثال

// ملاحظة: هذا مختصر لأغراض التوضيح.
// غير موصى به للاستخدام في كود الإنتاج.
 
'use client'
 
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
 
export default function Form(props) {
  const action = props.action
  const router = useRouter()
 
  useEffect(() => {
    // إذا كان هدف النموذج هو عنوان URL، قم بجلبها مسبقًا
    if (typeof action === 'string') {
      router.prefetch(action)
    }
  }, [action, router])
 
  function onSubmit(event) {
    event.preventDefault()
 
    // احصل على جميع حقول النموذج وقم بتشغيل `router.push` مع ترميز بيانات URL
    const formData = new FormData(event.currentTarget)
    const data = new URLSearchParams()
 
    for (const [name, value] of formData) {
      data.append(name, value as string)
    }
 
    router.push(`${action}?${data.toString()}`)
  }
 
  if (typeof action === 'string') {
    return <form onSubmit={onSubmit} {...props} />
  }
 
  return <form {...props} />
}

تعرف على المزيد حول مكون <Form>.

دعم next.config.ts

يدعم Next.js الآن نوع ملف TypeScript next.config.ts ويوفر نوع NextConfig للإكاء التلقائي وخيارات آمنة للنوع:

import type { NextConfig } from 'next';
 
const nextConfig: NextConfig = {
  /* خيارات التكوين هنا */
};
 
export default nextConfig;

تعرف على المزيد حول دعم TypeScript في Next.js.

instrumentation.js (مستقر)

يسمح ملف instrumentation، مع واجهة برمجة التطبيقات register()، للمستخدمين بالوصول إلى دورة حياة خادم Next.js لمراقبة الأداء، وتتبع مصدر الأخطاء، والتكامل العميق مع مكتبات المراقبة مثل OpenTelemetry.

أصبحت هذه الميزة الآن مستقرة ويمكن إزالة خيار التكوين experimental.instrumentationHook.

بالإضافة إلى ذلك، تعاونا مع Sentry لتصميم خطاف جديد onRequestError يمكن استخدامه ل:

  • التقاط سياق مهم حول جميع الأخطاء التي يتم طرحها على الخادم، بما في ذلك:
    • الموجه: موجه الصفحات أو موجه التطبيق
    • سياق الخادم: مكون الخادم، إجراء الخادم، معالج المسار، أو Middleware
  • الإبلاغ عن الأخطاء إلى مزود المراقبة المفضل لديك.
export async function onRequestError(err, request, context) {
  await fetch('https://...', {
    method: 'POST',
    body: JSON.stringify({ message: err.message, request, context }),
    headers: { 'Content-Type': 'application/json' },
  });
}
 
export async function register() {
  // تهيئة SDK مزود المراقبة المفضل لديك
}

تعرف على المزيد حول دالة onRequestError.

تحسينات التطوير والبناء

HMR لمكونات الخادم

أثناء التطوير، يتم إعادة تنفيذ مكونات الخادم عند الحفظ. هذا يعني، يتم استدعاء أي طلبات fetch إلى نقاط نهاية API الخاصة بك أو خدمات الطرف الثالث.

لتحسين أداء التطوير المحلي وتقليل التكاليف المحتملة لطلبات API المدفوعة، نضمن الآن أن Hot Module Replacement (HMR) يمكنه إعادة استخدام استجابات fetch من العروض السابقة.

تعرف على المزيد حول ذاكرة التخزين المؤقت HMR لمكونات الخادم.

توليد ثابت أسرع لموجه التطبيق

قمنا بتحسين التوليد الثابت لتحسين أوقات البناء، خاصة للصفحات ذات طلبات الشبكة البطيئة.

سابقًا، كانت عملية التحسين الثابت تعرض الصفحات مرتين — مرة لتوليد بيانات للتنقل من جانب العميل ومرة ثانية لعرض HTML لزيارة الصفحة الأولية. الآن، نعيد استخدام العرض الأول، مما يلغي المرور الثاني، ويقلل من عبء العمل وأوقات البناء.

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

التحكم المتقدم في التوليد الثابت (تجريبي)

أضفنا دعمًا تجريبيًا لمزيد من التحكم في عملية التوليد الثابت لحالات الاستخدام المتقدمة التي ستستفيد من تحكم أكبر.

نوصي بالالتزام بالإعدادات الافتراضية الحالية ما لم يكن لديك متطلبات محددة، حيث يمكن أن تؤدي هذه الخيارات إلى زيادة استخدام الموارد وأخطاء محتملة في نفاد الذاكرة بسبب زيادة التزامن.

const nextConfig = {
  experimental: {
	  // عدد المرات التي سيعيد فيها Next.js محاولات توليد الصفحات الفاشلة
	  // قبل فشل عملية البناء
    staticGenerationRetryCount: 1
    // عدد الصفحات التي سيتم معالجتها لكل عامل
    staticGenerationMaxConcurrency: 8
    // الحد الأدنى لعدد الصفحات قبل تشغيل عامل تصدير جديد
    staticGenerationMinPagesPerWorker: 25
  },
}
 
export default nextConfig;

تعرف على المزيد حول خيارات التوليد الثابت.

تحسينات للاستضافة الذاتية

عند استضافة التطبيقات ذاتيًا، قد تحتاج إلى مزيد من التحكم في توجيهات Cache-Control.

إحدى الحالات الشائعة هي التحكم في فترة stale-while-revalidate المرسلة لصفحات ISR. قمنا بتنفيذ تحسينين:

  1. يمكنك الآن تكوين قيمة expireTime في next.config. كان هذا سابقًا خيار experimental.swrDelta.
  2. تم تحديث القيمة الافتراضية إلى سنة واحدة، مما يضمن أن معظم شبكات CDN يمكنها تطبيق دلالات stale-while-revalidate بالكامل كما هو مقصود.

لم نعد أيضًا نستبدل قيم Cache-Control المخصصة بقيمنا الافتراضية، مما يسمح بتحكم كامل ويضمن التوافق مع أي إعداد CDN.

أخيرًا، قمنا بتحسين تحسين الصور عند الاستضافة الذاتية. سابقًا، كنا نوصي بتثبيت sharp لتحسين الصور على خادم Next.js الخاص بك. كان يتم أحيانًا تفويت هذه التوصية. مع Next.js 15، لم تعد بحاجة إلى تثبيت sharp يدويًا - سيستخدم Next.js sharp تلقائيًا عند استخدام next start أو التشغيل مع وضع الإخراج المستقل.

لمعرفة المزيد، شاهد الفيديو التوضيحي والبرنامج التعليمي الجديد حول استضافة Next.js ذاتيًا.

دعم ESLint 9

يقدم Next.js 15 أيضًا دعمًا لـ ESLint 9، بعد انتهاء دعم ESLint 8 في 5 أكتوبر 2024.

لضمان انتقال سلس، يظل Next.js متوافقًا مع الإصدارات السابقة، مما يعني أنه يمكنك الاستمرار في استخدام ESLint 8 أو 9.

إذا قمت بالترقية إلى ESLint 9، ووجدنا أنك لم تعتمد بعد تنسيق التكوين الجديد، فسيقوم Next.js تلقائيًا بتطبيق ESLINT_USE_FLAT_CONFIG=false لتسهيل الترحيل.

بالإضافة إلى ذلك، سيتم إزالة الخيارات القديمة مثل —ext و —ignore-path عند تشغيل next lint. يرجى ملاحظة أن ESLint سيوقف دعم هذه التكوينات القديمة في ESLint 10، لذا نوصي ببدء الترحيل قريبًا.

لمزيد من التفاصيل حول هذه التغييرات، راجع دليل الترحيل.

كجزء من هذا التحديث، قمنا أيضًا بترقية eslint-plugin-react-hooks إلى v5.0.0، والذي يقدم قواعد جديدة لاستخدام React Hooks. يمكنك مراجعة جميع التغييرات في سجل التغييرات لـ [email protected].

تغييرات أخرى

  • جميع التغييرات الموصوفة سابقًا في منشور المدونة RC 1
  • [تغيير جذري] لقد أوقفنا دعم تصدير export const runtime = "experimental-edge" في App Router. يجب على المستخدمين الآن التبديل إلى export const runtime = "edge". أضفنا أداة تحويل أكواد لتنفيذ هذا (PR)
  • [تغيير جذري] استدعاء revalidateTag و revalidatePath أثناء التصيير سيثير الآن خطأ (PR)
  • [تغيير جذري] ملفات instrumentation.js و middleware.js ستستخدم الآن حزم React المضمنة (PR)
  • [تغيير جذري] تم تحديث الحد الأدنى المطلوب لإصدار Node.js إلى 18.18.0 (PR)
  • [تغيير جذري] next/dynamic: تمت إزالة الخاصية suspense القديمة ولن يتم إدراج حدود Suspense فارغة عند استخدام المكون في App Router (PR)
  • [تغيير جذري] عند حل الوحدات النمطية على Edge Runtime، لن يتم تطبيق حالة الوحدة النمطية worker (PR)
  • [تغيير جذري] عدم السماح باستخدام خيار ssr: false مع next/dynamic في مكونات الخادم (PR)
  • [تحسين] تمت ترقية outputFileTracingRoot و outputFileTracingIncludes و outputFileTracingExcludes من التجريبية وأصبحت الآن مستقرة (PR)
  • [تحسين] تجنب دمج ملفات CSS العامة مع ملفات وحدات CSS الأعمق في الشجرة (PR)
  • [تحسين] يمكن تحديد معالج الذاكرة المؤقتة عبر متغير البيئة NEXT_CACHE_HANDLER_PATH (PR)
  • [تحسين] يدعم Pages Router الآن كلًا من React 18 و React 19 (PR)
  • [تحسين] يعرض Error Overlay الآن زرًا لنسخ عنوان URL لمفتش Node.js إذا كان المفتش ممكّنًا (PR)
  • [تحسين] تستخدم الجلب المسبق للعميل على App Router الآن سمة priority (PR)
  • [تحسين] يوفر Next.js الآن دالة unstable_rethrow لإعادة طرح أخطاء Next.js الداخلية في App Router (PR)
  • [تحسين] يمكن الآن استخدام unstable_after في الصفحات الثابتة (PR)
  • [تحسين] إذا تم استخدام مكون next/dynamic أثناء SSR، فسيتم جلب القطعة مسبقًا (PR)
  • [تحسين] خيار esmExternals مدعوم الآن على App Router (PR)
  • [تحسين] يمكن استخدام خيار experimental.allowDevelopmentBuild للسماح بـ NODE_ENV=development مع next build لأغراض التصحيح (PR)
  • [تحسين] تم تعطيل تحويلات Server Action في Pages Router (PR)
  • [تحسين] سيتوقف عمال البناء الآن عن تعليق البناء عند خروجهم (PR)
  • [تحسين] عند إعادة التوجيه من Server Action، سيتم تطبيق عمليات إعادة التحقق الآن بشكل صحيح (PR)
  • [تحسين] يتم الآن التعامل مع المعلمات الديناميكية بشكل صحيح للطرق المتوازية على Edge Runtime (PR)
  • [تحسين] ستحترم الصفحات الثابتة الآن staleTime بعد التحميل الأولي (PR)
  • [تحسين] تم تحديث vercel/og بإصلاح تسرب الذاكرة (PR)
  • [تحسين] تم تحديث أوقات التصحيح للسماح باستخدام حزم مثل msw لمحاكاة واجهات برمجة التطبيقات (PR)

المساهمون

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

شكرًا جزيلاً لـ @huozhi، @shuding، @wyattjoh، @PaulAsjes، @mcnaveen، @timneutkens، @stipsan، @aktoriukas، @sirTangale، @greatvivek11، @sokra، @anatoliik-lyft، @wbinnssmith، @coltonehrman، @hungdoansy، @kxlow، @ztanner، @manovotny، @leerob، @ryota-murakami، @ijjk، @pnutmath، @feugy، @Jeffrey-Zutt، @wiesson، @eps1lon، @devjiwonchoi، @Ethan-Arrowood، @kenji-webdev، @domdomegg، @samcx، @Jaaneek، @evanwinter، @kdy1، @balazsorban44، @feedthejim، @ForsakenHarmony، @kwonoj، @delbaoliveira، @xiaohanyu، @dvoytenko، @bobaaaaa، @bgw، @gaspar09، @souporserious، @unflxw، @kiner-tang، @Ehren12، @EffectDoplera، @IAmKushagraSharma، @Auxdible، @sean-rallycry، @jeanmax1me، @unstubbable، @NilsJacobsen، @adiguno، @ryan-nauman، @zsh77، @KagamiChan، @steveluscher، @MehfoozurRehman، @vkryachko، @chentsulin، @samijaber، @begalinsaf، @FluxCapacitor2، @lukahartwig، @brianshano، @pavelglac، @styfle، @symant233، @HristovCodes، @karlhorky، @jonluca، @jonathan-ingram، @mknichel، @sopranopillow، @Gomah، @imddc، @notrab، @gabrielrolfsen، @remorses، @AbhiShake1، @agadzik، @rishabhpoddar، @rezamauliadi، @IncognitoTGT، @webtinax، @BunsDev، @nisabmohd، @z0n، @bennettdams، @joeshub، @n1ckoates، @srkirkland، @RiskyMH، @coopbri، @okoyecharles، @diogocapela، @dnhn، @typeofweb، @davidsa03، @imranolas، @lubieowoce، @maxhaomh، @mirasayon، @blvdmitry، @hwangstar156، @lforst، @emmerich، @christian-bromann، @Lsnsh، @datner، @hiro0218، @flybayer، @ianmacartney، @ypessoa، @ryohidaka، @icyJoseph، @Arinji2، @lovell، @nsams، @Nayeem-XTREME، @JamBalaya56562، @Arindam200، @gaojude، @qqww08، @todor0v، @tokkiyaa، @arlyon، @lorensr، @Juneezee، @Sayakie، @IGassmann، @bosconian-dynamics، @phryneas، @akazwz، @atik-persei، @shubh73، @alpedia0، @chogyejin، @notomo، @ArnoldVanN، @dhruv-kaushik، @kevva، @Kahitar، @anay-208، @boris-szl، @devnyxie، @LorisSigrist، @M-YasirGhaffar، @Lada496، @kippmr، @torresgol10، @pkiv، @Netail، @jontewks، @ArnaudFavier، @chrisjstott، @mratlamwala، @mayank1513، @karlkeefer، @kshehadeh، @Marukome0743، @a89529294، @anku255، @KeisukeNagakawa، @andrii-bodnar، @aldosch، @versecafe، @steadily-worked، @cfrank، @QiuranHu، @farsabbutt، @joostmeijles، @saltcod، @archanaagivale30، @crutchcorn، @crebelskydico، @Maaz-Ahmed007، @jophy-ye، @remcohaszing، @JoshuaKGoldberg، @creativoma، @GyoHeon، @SukkaW، @MaxLeiter، @neila-a، @stylessh، @Teddir، @ManuLpz4، @Julian-Louis، @syi0808، @mert-duzgun، @amannn، @MonstraG، @hamirmahal، @tariknh، @Kikobeats، @LichuAcu، @Kuboczoch، @himself65، @Sam-Phillemon9493، @Shruthireddy04، @Hemanshu-Upadhyay، @timfuhrmann، @controversial، @pathliving، @mischnic، @mauroaccornero، @NavidNourani، @allanchau، @ekremkenter، @yurivangeffen، @gnoff، @darthmaim، @gdborton، @Willem-Jaap، @KentoMoriwaki، @TrevorSayre، @marlier، @Luluno01، @xixixao، @domin-mnd، @niketchandivade، @N2D4، @kjugi، @luciancah، @mud-ali، @codeSTACKr، @luojiyin1987، @mehmetozguldev، @ronanru، @tknickman، @joelhooks، @khawajaJunaid، @rubyisrust، @abdull-haseeb، @bewinsnw، @housseindjirdeh، @li-jia-nan، @aralroca، @s-ekai، @ah100101، @jantimon، @jordienr، @iscekic، @Strift، @slimbde، @nauvalazhar، @HughHzyb، @guisehn، @wesbos، @OlyaPolya، @paarthmadan، @AhmedBaset، @dineshh-m، @avdeev، @Bhavya031، @MildTomato، @Bjornnyborg، @amikofalvy، @yosefbeder، @kjac، @woutvanderploeg، @Ocheretovich، @ProchaLu، @luismiramirez، @omahs، @theoludwig، @abhi12299، @sommeeeer، @lumirlumir، @royalfig، @iampoul، @molebox، @txxxxc، @zce، @mamuso، @kahlstrm، @vercel-release-bot، @zhawtof، @PapatMayuri، @PlagueFPS، @IDNK2203، @jericopulvera، @liby، @CannonLock، @timfish، @whatisagi، @none23، @haouvw، @Pyr33x، @SouthLink، @frydj، @CrutchTheClutch، @sleevezip، @r34son، @yunsii، @md-rejoyan-islam، @kartheesan05، @nattui، @KonkenBonken، @weicheng95، @brekk، @Francoscopic، @B33fb0n3، @ImDR، @nurullah، @hdodov، @ebCrypto، @soedirgo، @floriangosse، @Tim-Zj، @raeyoung-kim، @erwannbst، @DerTimonius، @hirotomoyamada، @Develliot، @chandanpasunoori، @vicb، @ankur-dwivedi، @kidonng، @baeharam، @AnaTofuZ، @coderfin، @xugetsu، @alessiomaffeis، @kutsan، @jordyfontoura، @sebmarkbage، @tranvanhieu01012002، @jlbovenzo، @Luk-z، @jaredhan418، @bangseongbeom، @penicillin0، @neoFinch، @DeepakBalaraman، @Manoj-M-S، @Unsleeping، @lonr، @Aerilym، @ytori، @acdlite، @actopas، @n-ii-ma، @adcichowski، @mobeigi، @JohnGemstone، و @jjm2317 للمساعدة!