مقالات

Next.js 15 RC 2 | Next.js


پس از اعلام اولین کاندید انتشار Next.js 15 در ماه می، بر اساس بازخورد شما در حال آماده سازی دومین کاندیدای انتشار هستیم. در اینجا چیزی است که ما روی آن کار می کنیم:

Next.js 15 Release Candidate (RC2) را امروز امتحان کنید:

# Use the new automated upgrade CLI
npx @next/codemod@canary upgrade rc
 
# ...or upgrade manually
npm install next@rc react@rc react-dom@rc

توجه: این نامزد انتشار شامل تمام تغییرات از RC قبلی است.

ما کد مدها (تبدیل کد خودکار) را با هر نسخه اصلی Next.js برای کمک به ارتقاء خودکار تغییرات شکسته گنجانده ایم.

برای اینکه به‌روزرسانی‌ها حتی روان‌تر شوند، یک کد مود بهبود یافته CLI منتشر کرده‌ایم:

npx @next/codemod@canary upgrade rc

این ابزار به شما کمک می کند تا پایگاه کد خود را به آخرین نسخه های پایدار یا پیش نمایش ارتقا دهید. CLI وابستگی‌های شما را به‌روزرسانی می‌کند، مدهای کد موجود را نشان می‌دهد و شما را در استفاده از آنها راهنمایی می‌کند. تگ dist مشخص شده در خط فرمان (@rc، @canaryو غیره) نسخه ای را که باید به آن ارتقا دهید را مشخص می کند.

درباره مدهای کد Next.js بیشتر بدانید.

Turbopack برای توسعه محلی در نسخه کلی Next.js 15 پایدار خواهد شد، در حالی که در آن گنجانده شده است. امروز می توانید با دویدن امتحان کنید:

با تشکر از هزاران توسعه‌دهنده‌ای که در آزمایش‌ها، گزارش‌دهی مشکلات و تأیید اصلاحات از طریق مراحل بتا و نسخه کاندید Turbopack شرکت کردند، ما 54 مشکل GitHub را از اولین نامزد انتشار Next.js 15 حل کرده‌ایم. همراه با این تلاش‌های جامعه، آزمایش‌های داخلی vercel.com، v0.app و nextjs.org به شناسایی پیشرفت‌های بیشتر کمک کرد.

در طول سه ماه گذشته، ما بر بهینه سازی عملکرد ساخت سرد تمرکز کرده ایم. در مقایسه با نسخه قبلی، دیدیم:

  • 25 تا 35 درصد تخفیف در استفاده از حافظه
  • 30 تا 50 درصد سریعتر ساختی برای صفحات بزرگ با هزاران ماژول.

ما به بهینه سازی این مناطق در نسخه های بعدی ادامه خواهیم داد.

با نگاهی به آینده، تیم Turbopack در حال پیشرفت قابل توجهی در حافظه پنهان مداوم، کاهش استفاده از حافظه و Turbopack برای next build– با گذراندن 96 درصد از تست ها.

توجه: تمام ویژگی های Turbopack پشتیبانی شده و پشتیبانی نشده را مشاهده کنید.

در رندر سنتی سمت سرور، سرور قبل از ارائه هر محتوایی منتظر یک درخواست می ماند. با این حال، همه مؤلفه‌ها به داده‌های کوئری خاص وابسته نیستند، بنابراین لازم نیست منتظر بمانید تا کوئری آنها را ارائه کند. در حالت ایده آل، سرور تا حد امکان قبل از رسیدن درخواست آماده می شود. برای فعال کردن این مورد و آماده سازی زمینه برای بهینه سازی های آینده، باید بدانیم چه زمانی منتظر درخواست باشیم.

بنابراین، ما API هایی را که به داده های درخواستی خاص متکی هستند – مانند headers، cookies، params، و searchParams– بودن ناهمزمان.

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

این یک است تغییر شکستگی و API های زیر را تحت تاثیر قرار می دهد:

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

برای انتقال آسان تر، این API ها ممکن است به طور موقت به صورت همزمان در دسترس باشند، اما هشدارهایی را در توسعه و تولید تا نسخه اصلی بعدی نشان می دهند. یک کد مد برای خودکار کردن مهاجرت در دسترس است:

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

برای مواردی که کد مد نمی تواند به طور کامل کد شما را انتقال دهد، لطفا راهنمای ارتقا را بخوانید. ما همچنین نمونه ای از نحوه انتقال یک برنامه Next.js به API های جدید ارائه کرده ایم.

اکشن های سرور، توابع سمت سرور هستند که می توانند توسط مشتری فراخوانی شوند. آنها با اضافه کردن مشخص می شوند 'use server' دستورالعمل در بالای یک فایل و صادرات تابع async.

حتی اگر یک عملکرد سرور یا تابع کمکی در جای دیگری از کد شما وارد نشده باشد، همچنان یک نقطه پایانی HTTP در دسترس عموم است. اگرچه این رفتار از نظر فنی درست است، اما ممکن است منجر به افشای غیرعمدی چنین ویژگی‌هایی شود.

برای بهبود امنیت، پیشرفت‌های زیر را معرفی کرده‌ایم:

  • حذف کد مرده: شناسه‌های عملکرد سرور استفاده نشده آن‌ها در معرض بسته جاوا اسکریپت سمت سرویس گیرنده قرار نمی‌گیرند، که باعث کاهش اندازه بسته و بهبود عملکرد می‌شود.
  • شناسه های اقدام محافظت شده: Next.js اکنون شناسه‌های نامفهوم و غیر قطعی ایجاد می‌کند تا به مشتری امکان ارجاع و فراخوانی عملکرد روی سرور را بدهد. این شناسه‌ها به‌طور دوره‌ای بین ساخت‌ها برای بهبود امنیت دوباره محاسبه می‌شوند.

// app/actions.js
'use server';
 
// This action **is** used in our application, so Next.js
// will create a secure ID to allow the client to reference
// and call the Server Action.
export async function updateUserAction(formData) {}
 
// This action **is not** used in our application, so Next.js
// will automatically remove this code during `next build`
// and will not create a public endpoint.
export async function deleteUserAction(formData) {}

شما همچنان باید اقدامات سرور را به عنوان نقاط پایانی HTTP عمومی در نظر بگیرید. درباره محافظت از اقدامات سرور بیشتر بیاموزید.

Next.js اکنون یک نشانگر مسیر ثابت را در طول توسعه نمایش می دهد تا به شما کمک کند تعیین کنید کدام مسیرها ثابت یا پویا هستند. این نشانه بصری بهینه سازی عملکرد را با درک نحوه رندر شدن صفحات شما آسان می کند.

همچنین می توانید از خروجی ساخت زیر برای مشاهده استراتژی رندر برای همه مسیرها استفاده کنید.

این به‌روزرسانی بخشی از تلاش‌های مداوم ما برای بهبود قابلیت مشاهده در Next.js است که نظارت، اشکال‌زدایی و بهینه‌سازی برنامه‌های خود را برای توسعه‌دهندگان آسان‌تر می‌کند. ما همچنین در حال کار بر روی ابزارهای توسعه‌دهنده اختصاصی هستیم و جزئیات بیشتر به زودی ارائه می‌شود.

درباره نشانگر مسیر ثابتی که می تواند غیرفعال شود بیشتر بیاموزید.

جدید  component extends the HTML  element with prefetching, client-side navigation, and progressive enhancement.

It is useful for forms that navigate to a new page, such as a search form that leads to a results page.

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

را component comes with:

  • Prefetching: When the form is in view, the layout and loading UI are prefetched, making navigation fast.
  • Client-side Navigation: On submission, shared layouts and client-side state are preserved.
  • Progressive Enhancement: If JavaScript hasn’t loaded yet, the form still works via full-page navigation.

Previously, achieving these features required a lot of manual boilerplate. For example:

Example

// Note: This is abbreviated for demonstration purposes.
// Not recommended for use in production code.
 
'use client'
 
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
 
export default function Form(props) {
  const action = props.action
  const router = useRouter()
 
  useEffect(() => {
    // if form target is a URL, prefetch it
    if (typeof action === 'string') {
      router.prefetch(action)
    }
  }, [action, router])
 
  function onSubmit(event) {
    event.preventDefault()
 
    // grab all of the form fields and trigger a `router.push` with the data URL encoded
    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} />
}

بیشتر بدانید Component.

Next.js now supports the TypeScript next.config.ts نوع فایل و ارائه می کند NextConfig گزینه های ایمنی نوع و نوع تکمیل خودکار:

import type { NextConfig } from 'next';
 
const nextConfig: NextConfig = {
  /* config options here */
};
 
export default nextConfig;

در مورد پشتیبانی TypeScript در Next.js بیشتر بیاموزید.

را instrumentation فایل، ص register() API به کاربران اجازه می دهد تا از چرخه عمر سرور Next.js برای نظارت بر عملکرد، ردیابی منبع خطاها و ادغام عمیق با کتابخانه های نظارتی مانند OpenTelemetry استفاده کنند.

این ویژگی اکنون است پایدار و در experimental.instrumentationHook گزینه config را می توان حذف کرد.

علاوه بر این، ما با Sentry برای طراحی جدید همکاری کردیم onRequestError قلاب قابل استفاده برای:

  • زمینه مهم را برای تمام خطاهای پرتاب شده روی سرور، از جمله:
    • روتر: مسیریاب صفحات یا روتر برنامه
    • زمینه سرور: یک جزء سرور، عملکرد سرور، کنترل کننده مسیر یا میان افزار
  • اشکالات را به ارائه دهنده قابلیت مشاهده مورد علاقه خود گزارش دهید.

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() {
  // init your favorite observability provider SDK
}

بیشتر بدانید onRequestError تابع

لینک را به عنوان کپی کنیداجزای سرور HMR

در طول توسعه، اجزای سرور پس از ذخیره دوباره اجرا می شوند. یعنی همه جور fetch درخواست ها نیز به نقاط پایانی API یا خدمات شخص ثالث شما ارسال می شود.

برای بهبود کارایی توسعه بومی و کاهش هزینه‌های بالقوه تماس‌های API قابل پرداخت، اکنون اطمینان حاصل می‌کنیم که Hot Module Replacement (HMR) قابل استفاده مجدد است. fetch پاسخ از رندرهای قبلی

درباره کش HMR در اجزای سرور بیشتر بیاموزید.

لینک را به عنوان کپی کنیدتولید استاتیک سریعتر برای App Router

ما تولید استاتیک را برای بهبود زمان ساخت، به‌ویژه برای صفحاتی با درخواست‌های شبکه کند، بهینه کرده‌ایم.

قبلاً، فرآیند بهینه‌سازی استاتیک ما صفحات را دو بار رندر می‌کرد – یک بار برای تولید داده‌های ناوبری سمت مشتری و بار دوم برای رندر HTML برای بازدید اولیه از صفحه. اکنون از اولین رندر استفاده مجدد می کنیم، پاس دوم را قطع می کنیم، بار و زمان ساخت را کاهش می دهیم.

علاوه بر این، کارگران تولید استاتیک اکنون به اشتراک می گذارند fetch کش بین صفحات اگر الف fetch تماس در حافظه پنهان ذخیره نمی شود، نتایج آن توسط صفحات دیگری که توسط همان کارگر پردازش شده اند، مجددا استفاده می شود. این باعث کاهش تعداد درخواست ها برای داده های مشابه می شود.

لینک را به عنوان کپی کنیدکنترل تولید استاتیک پیشرفته (تجربی)

ما برای موارد استفاده پیشرفته که از کنترل بیشتری بهره مند می شوند، پشتیبانی آزمایشی را برای کنترل بیشتر بر فرآیند تولید استاتیک اضافه کرده ایم.

توصیه می‌کنیم تنظیمات پیش‌فرض فعلی را رعایت کنید، مگر اینکه الزامات خاصی داشته باشید، زیرا این گزینه‌ها ممکن است منجر به افزایش استفاده از منابع و خطاهای احتمالی خارج از حافظه به دلیل افزایش همزمانی شوند.

const nextConfig = {
  experimental: {
	  // how many times Next.js will retry failed page generation attempts
	  // before failing the build
    staticGenerationRetryCount: 1
    // how many pages will be processed per worker
    staticGenerationMaxConcurrency: 8
    // the minimum number of pages before spinning up a new export worker
    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 را بررسی کنید.

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 معرفی می کند. شما می توانید تمام تغییرات در تغییرات را برای eslint-plugin-react-hooks@5.0.0 بررسی کنید.

  • همه تغییراتی که قبلاً در پست وبلاگ RC 1 توضیح داده شد
  • [Breaking] صادرات را لغو کردیم export const runtime = "experimental-edge" در روتر برنامه اکنون کاربران باید به export const runtime = "edge". برای انجام این کار یک کد مد اضافه کردیم (PR)
  • [Breaking] یک تماس revalidateTag و revalidatePath در حین رندر اکنون یک خطا ایجاد می کند (PR)
  • [Breaking] را instrumentation.js و middleware.js فایل ها اکنون از بسته های React ارائه شده (PR) استفاده خواهند کرد.
  • [Breaking] حداقل نسخه مورد نیاز Node.js به 18.18.0 به روز شد (PR)
  • [Breaking] next/dynamic: مردود suspense prop حذف شده است و هنگامی که مؤلفه در App Router استفاده می شود، دیگر یک حاشیه خالی تعلیق (PR) وارد نمی کند.
  • [Breaking] هنگام فعال کردن ماژول ها در Edge Runtime، worker شرط ماژول اعمال نخواهد شد (PR)
  • [Breaking] ممنوعیت استفاده ssr: false گزینه با next/dynamic در اجزای سرور (PR)
  • [Improvement] را outputFileTracingRoot، outputFileTracingIncludes و outputFileTracingExcludes از آزمایشی ارتقا یافته اند و اکنون پایدار هستند (PR)
  • [Improvement] از ادغام فایل‌های CSS سراسری با فایل‌های ماژول CSS عمیق‌تر در درخت خودداری کنید (PR)
  • [Improvement] کنترل کننده کش را می توان از طریق مشخص کرد NEXT_CACHE_HANDLER_PATH متغیر محیطی (PR)
  • [Improvement] روتر صفحات اکنون از React 18 و React 19 (PR) پشتیبانی می کند.
  • [Improvement] هم‌پوشانی خطا اکنون دکمه‌ای را برای کپی کردن URL بازرس Node.js در صورت فعال بودن بازرس نشان می‌دهد (PR)
  • [Improvement] واکشی پیش‌فرض کلاینت روتر برنامه قبلاً استفاده می‌شود priority ویژگی (PR)
  • [Improvement] Next.js در حال حاضر ارائه می دهد unstable_rethrow عملکردی برای حذف مجدد خطاهای داخلی Next.js در App Router (PR)
  • [Improvement] unstable_after اکنون می توان در صفحات استاتیک استفاده کرد (PR)
  • [Improvement] اگر الف next/dynamic جزء در طول SSR استفاده می شود، قطعه از قبل واکشی می شود (PR)
  • [Improvement] را esmExternals گزینه اکنون توسط App Router (PR) پشتیبانی می شود
  • [Improvement] را experimental.allowDevelopmentBuild می توان از گزینه برای حل استفاده کرد NODE_ENV=development با next build برای اهداف اشکال زدایی (PR)
  • [Improvement] تبدیل عملکرد سرور اکنون در مسیریاب صفحات (PR) غیرفعال شده است.
  • [Improvement] کارگران ساختمان اکنون هنگام خروج ساختمان از آویزان شدن آن جلوگیری می کنند (PR)
  • [Improvement] هنگام تغییر مسیر از یک عملکرد سرور، اکنون بررسی مجدد به درستی اعمال می شود (PR)
  • [Improvement] اکنون پارامترهای پویا برای مسیرهای موازی در Edge Runtime (PR) به درستی مدیریت می شوند.
  • [Improvement] صفحات استاتیک اکنون پس از بارگذاری اولیه (PR) به staleTime احترام می گذارند.
  • [Improvement] vercel/og به روز شده با رفع نشت حافظه (PR)
  • [Improvement] زمان های وصله به روز شده اند تا امکان استفاده از بسته هایی مانند msw برای تمسخر API (PR)

Next.js نتیجه کار ترکیبی بیش از 3000 توسعه دهنده فردی و تیم اصلی ما در Vercel است.
این نسخه توسط:

  • را Next.js تیم: اندرو، هندریک، یانکا، جیاچی، جیمی، جیوون، جی جی، جاش، سم، سباستین، سبی، شو، وایات و زک.
  • را پکیج توربو تیم: الکس، بنجامین، دانی، مایا، نیکلاس، تیم، توبیاس و ویل.
  • را Next.js Docs تیم: دلبا، ریچ، اسماعیل و لی.

با تشکر فراوان از @huozhi، @shuding، @wyattjoh، @PaulAsjes، @mcnaveen، @timneutkens، @stipsan، @aktoriukas، @sirTangale، @greatvivek11، @sokra، @anatoliik-lyft، @wbinnssmith، @, @htonnerxsyman @manovotny، @leerob، @ryota-murakami، @ijjk، @pnutmath، @feugy، @Jeffrey-Zutt، @wiesson، @eps1lon، @devjiwonchoi، @Ethan-Arrowood، @kenji-webdev، @domdomegg، @samcx، @edya @balazsorban44، @feedthejim، @ForsakenHarmony، @kwonoj، @delbaoliveira، @xiaohanyu، @dvoytenko، @bobaaaaa، @bgw @gaspar09 @vkryachko، @chentsulin، @samijaber، @begalinsaf، @ciaohan2, @Flux @pavelglac، @styfle، @symant233، @HristovCodes، @karlhorky، @jonluca، @jonathan-ingram، @mknichel، @sopranopillow، @Gomah، @imddc، @notrab، @gabrielrolfsen، @remorses، @AbhiShadzik1، @AbhiShake1 @AbhiShake1 @IncognitoTGT، @webtinax، @BunsDev، @nisabmohd، @z0n، @bennettdams، @joeshub،@n1ckoates، @srkirkland، @RiskyMH، @coopbri، @okoyecharles، @diogocapela، @dnhn، @davideof0s @lubieowoce، @maxhaomh، @mirasayon، @blvdmitry، @hwangstar156، @lforst، @emmerich، @christian-bromann، @Lsnsh، @datner، @hiro0218، @flybayer، @ianmacartney، @ypessoaph، @ypessoa، @ryellose @nsams، @Nayeem-XTREME،، @dhruv-kaushik، @kevva، @Kahitar، @anay-208، @boris-szl، @devnyxie، @LorisSigrist، @M-YasirGhaffar، @Lada496، @kippmr، @torresgolj @torresgolj @ArnaudFavier، @chrisjstott، @mratlamwala، @mayank1513، @karlkeefer، @kshehadeh، @Marukome0743، @a89529294، @anku255، @KeisukeNagakawa، @andrii-bodnar, @cafe-frank, @di, @cafe-frank, @di @QiuranHu، @farsabbutt، @joostmeijles، @saltcod، @archanaagivale30، @crutchcorn، @crebelskydico، @Maaz-Ahmed007، @jophy-ye،، @himself65، @Sam-Phillemon9493، @Shruthireddy04، @Hemanshu-Upadhyay، @timfuhrmann، @controversial، @pathliving، @mischnic، @mauroaccornero، @NavidNourani، @allanchau، @ekremkenter، @thonma @Willem-Jaap، @KentoMoriwaki، @TrevorSayre، @marlier، @Luluno01، @xixixao، @domin-mnd، @niketchandivade، @N2D4، @kjugi، @luciancah، @mud-ali، @codeSTACKr، @luojigulan @ronhme @tknickman، @joelhooks، @khawajaJunaid، @rubyisrust، @abdull-haseeb، @bewinsnw @housseindjirdeh، @li-jia-nan، @aralroca، @s-ekai، @ah100101، @jantimon، @jordienr, @jordienr, @azhna, @c @HughHzyb، @guisehn، @wesbos، @OlyaPolya، @paarthmadan، @AhmedBaset، @dinesh-m، @avdeev، @Bhavya031، @MildTomato، @Bjornnyborg، @amikofalvy، @yosefbeder، @kjac، @Progovic، @wout @luismiramirez، @omahs، @theoludwig، @abhi12299، @sommeeeer، @lumirlumir، @royalfig، @iampoul، @molebox، @txxxxc، @zce، @mamuso، @kahlstrm، @vercel-release-bot، @Pazhawturi @Patlagueyof @IDNK2203، @jericopulvera، @liby، @CannonLock، @timfish،@whatisagi، @none23، @haouvw، @Pyr33x، @SouthLink، @frydj، @CrutchTheClutch، @sleevezip، @r34son، @r34son، @re-5، @yunsi @nattui، @KonkenBonken، @weicheng95، @brekk، @Francoscopic، @B33fb0n3، @ImDR، @nurullah، @hdodov، @ebCrypto، @soedirgo، @floriangosse، @Tim-Zj، @raeyoung-kim، @da,motoim، @erwanTi. @Develliot، @chandanpasunoori، @vicb @ankur-dwivedi، @kidonng، @baeharam، @AnaTofuZ، @coderfin، @xugetsu، @alessiomaffeis، @kutsan، @jordyfontoura، @sebmarkbage، @tranvanhieu01012002، @jatranvanhieu01012002، @jaLu002. @bangseongbeom، @penicillin0، @neoFinch، @DeepakBalaraman، @Manoj-M-S، @Unsleeping، @lonr، @Aerilym، @ytori، @acdlite، @actopas، @n-ii-ma، @adcichowski، @mobeigi2، و @John!


Source link

نوشته های مشابه

دیدگاهتان را بنویسید

دکمه بازگشت به بالا