طرح بندی RFC | Next.js

این RFC (درخواست نظر) بزرگترین بهروزرسانی Next.js از زمان معرفی آن در سال 2016 را نشان میدهد:
- چیدمان های تو در تو: برنامه های پیچیده با مسیرهای تودرتو ایجاد کنید.
- طراحی شده برای اجزای سرور: بهینه شده برای ناوبری زیر درخت.
- استخراج داده های بهبود یافته: استخراج طرح ها در حالی که از آبشار جلوگیری می کند.
- استفاده از ویژگی های React 18: جریان، انتقال و ولتاژ.
- مسیریابی مشتری و سرور: مسیریابی سرور محور با آبگرم مانند رفتار
- پذیرش 100% افزایشی: بدون تغییرات مخرب، بنابراین می توانید به تدریج اتخاذ کنید.
- مدل های مسیریابی پیشرفته: مسیرهای موازی، مسیرهای متقاطع و غیره.
روتر Next.js جدید بر روی ویژگیهای اخیرا منتشر شده React 18 ساخته میشود. ما قصد داریم پیشفرضها و قراردادهایی را معرفی کنیم که به شما امکان میدهد به راحتی از این ویژگیهای جدید استفاده کنید و از مزایای بازگشایی آنها بهره ببرید.
کار روی این RFC ادامه دارد و زمانی که ویژگیهای جدید در دسترس باشد، اعلام خواهیم کرد. برای ارائه بازخورد، به گفتگو در Github Discussions بپیوندید.
ما در حال جمعآوری بازخورد انجمن از GitHub، Discord، Reddit و نظرسنجی توسعهدهندگان خود درباره محدودیتهای مسیریابی فعلی در Next.js هستیم. دریافتیم که:
- تجربه توسعهدهنده هنگام ایجاد طرحبندی میتواند بهبود یابد. ایجاد طرحبندیهایی که میتوانند تودرتو باشند، بین مسیرها به اشتراک گذاشته شوند و وضعیت آنها در مسیریابی ذخیره شود، باید آسان باشد.
- بسیاری از برنامه های Next.js داشبورد یا کنسول هایی هستند که از راه حل های مسیریابی پیشرفته تری بهره مند می شوند.
در حالی که سیستم مسیریابی فعلی از ابتدای Next.js به خوبی کار کرده است، ما میخواهیم ساخت برنامههای کاربردی وب با عملکرد و ویژگیهای غنیتر را برای توسعهدهندگان آسانتر کنیم.
بهعنوان فریمورکهای پشتیبانی، ما همچنین میخواهیم یک سیستم مسیریابی بسازیم که با آینده سازگار و همسو با آینده React باشد.
توجه: برخی از قراردادهای مسیریابی از روتر مبتنی بر رله در Meta الهام گرفته شده اند، جایی که برخی از ویژگی های سمت سرور در ابتدا توسعه یافته بودند، و همچنین روترهای سمت کلاینت مانند React Router و Ember.js. را
layout.jsقرارداد فایل از کار انجام شده در SvelteKit الهام گرفته شده است. ما همچنین می خواهیم تشکر کنیم کسیدی برای باز کردن یک RFC قبلی برای طرحبندی.
این RFC قراردادها و دستورات مسیریابی جدیدی را معرفی می کند. اصطلاحات مبتنی بر شرایط React و پلتفرمهای وب استاندارد است. در سراسر RFC، این اصطلاحات را می بینید که به تعاریف آنها در زیر پیوند داده شده اند.
- درخت: قراردادی برای تجسم یک ساختار سلسله مراتبی. به عنوان مثال، یک جزء
درخت با اجزای والد و فرزند، ساختار پوشه و غیره. - آندروود بخشی از درخت که از ریشه شروع می شود (اولی) و به برگ ها (آخرین) ختم می شود.
- مسیر URL: بخشی از URL که بعد از دامنه می آید.
- بخش URL: بخشی از مسیر URL با اسلش محدود شده است.

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

برای اطمینان از اینکه این پیشرفتهای جدید را میتوان به تدریج اتخاذ کرد و برای جلوگیری از شکستن تغییرات، دایرکتوری جدیدی به نام پیشنهاد میکنیم app.

را app دایرکتوری با هم کار خواهد کرد pages اشاره گر می توانید به تدریج بخش هایی از برنامه خود را به برنامه جدید منتقل کنید app دایرکتوری برای استفاده از ویژگی های جدید. برای سازگاری با عقب، رفتار از pages دایرکتوری یکسان باقی می ماند و همچنان پشتیبانی می شود.
می توانید استفاده کنید پوشه سلسله مراتب درون app برای تعیین مسیرها الف مسیر یک مسیر واحد از پوشه های تو در تو است که از سلسله مراتب پیروی می کند پوشه ریشه به فینال پوشه برگه

به عنوان مثال، می توانید یک مورد جدید اضافه کنید /dashboard/settings مسیر را با قرار دادن دو پوشه جدید در app اشاره گر
توجه:
- با این سیستم از پوشه ها برای تعریف مسیرها و فایل ها برای تعریف رابط کاربری (با قراردادهای فایل جدید مانند
layout.js،page.jsو در قسمت دوم RFCloading.js).- این به شما امکان میدهد فایلهای پروژه خود (اجزای رابط کاربری، فایلهای آزمایشی، داستانها و غیره) را درون آن قرار دهید
appاشاره گر در حال حاضر این فقط با پیکربندی pageExtensions امکان پذیر است.
لینک را به عنوان کپی کنیدبخش های مسیر
هر پوشه در زیردرخت نشان دهنده یک است بخش مسیر. هر بخش از مسیر به قسمت مربوطه نگاشت می شود بخش در یک مسیر URL.

به عنوان مثال، در /dashboard/settings مسیر از 3 بخش تشکیل شده است:
- را
/بخش ریشه - را
dashboardبخش - را
settingsبخش
توجه داشته باشید: نام بخش مسیر برای مطابقت با اصطلاحات موجود پیرامون مسیرهای URL انتخاب شد.
کنوانسیون فایل جدید: layout.js
تا کنون، ما از پوشهها برای تعریف مسیرهای برنامه خود استفاده کردهایم. اما پوشه های خالی به تنهایی کاری را انجام نمی دهند. بیایید در مورد چگونگی تعریف رابط کاربری که برای این مسیرها با استفاده از قراردادهای فایل جدید رندر می شود بحث کنیم.
الف طرح بندی یک رابط کاربری است که بین بخش های مسیر در یک زیردرخت به اشتراک گذاشته می شود. طرحبندیها بر مسیرهای URL تأثیر نمیگذارند و هنگامی که کاربر بین بخشهای مرتبط حرکت میکند، دوباره ارائه نمیشوند (وضعیت React حفظ میشود).
یک چیدمان پیشفرض را میتوان با صادر کردن یک جزء React از a تعریف کرد layout.js فایل جزء باید الف را بپذیرد children پایهای که با بخشهایی که طرحبندی میپیچد پر میشود.
2 نوع چیدمان وجود دارد:
- طرح اولیه: معتبر برای همه مسیرها
- چیدمان منظم: برای مسیرهای خاص اعمال می شود
میتوانید دو یا چند طرحبندی را در کنار هم قرار دهید تا به آنها حالت دهید چیدمان های تو در تو.
لینک را به عنوان کپی کنیدچیدمان اولیه
شما می توانید با افزودن a یک طرح بندی اولیه ایجاد کنید که برای همه مسیرهای برنامه شما اعمال شود layout.js فایل داخل app پوشه

توجه:
- طرح اولیه جایگزین نیاز به یک برنامه سفارشی (
_app.js) و سند سفارشی (_document.js، همانطور که برای همه مسیرها اعمال می شود.- شما می توانید از طرح اولیه برای سفارشی کردن پوسته سند اولیه استفاده کنید (مثلاً
andtags).- You’ll be able to fetch data inside the root layout (and other layouts).
Copy link to headingRegular Layouts
You can also create a layout that only applies to a part of your application by adding a layout.js فایل در یک پوشه خاص

به عنوان مثال، شما می توانید یک ایجاد کنید layout.js فایل داخل dashboard پوشه ای که فقط برای بخش های مسیر داخل اعمال می شود dashboard.
لینک را به عنوان کپی کنیدطرح های سرمایه گذاری
چیدمان ها هستند تو در تو به طور پیش فرض

برای مثال، اگر دو طرح بالا را با هم ترکیب کنیم. طرح اولیه (app/layout.js) اعمال خواهد شد dashboard طرحی که همچنین برای تمام بخش های مسیر در داخل اعمال می شود dashboard/*.

کنوانسیون فایل جدید: page.js
صفحه یک رابط کاربری است که برای یک بخش مسیر منحصر به فرد است. شما می توانید یک صفحه با اضافه کردن یک ایجاد کنید page.js فایل در یک پوشه

به عنوان مثال، برای ایجاد صفحات برای /dashboard/* مسیرها، می توانید a اضافه کنید page.js فایل در هر پوشه هنگامی که یک کاربر بازدید می کند /dashboard/settings، Next.js ارائه خواهد شد page.js پرونده برای settings پوشه پیچیده شده در همه طرحبندیهایی که در بالای درخت فرعی وجود دارند.

شما می توانید یک را ایجاد کنید page.js فایل مستقیماً در پوشه داشبورد برای مطابقت با /dashboard مسیر طرح داشبورد در این صفحه نیز اعمال خواهد شد:

این مسیر از 2 بخش تشکیل شده است:
- را
/بخش ریشه - را
dashboardبخش
توجه:
- برای اینکه یک مسیر معتبر باشد، باید یک صفحه در قسمت برگ خود داشته باشد. اگر این کار را نکرد، مسیر با خطا مواجه می شود.
لینک را به عنوان کپی کنیدچیدمان و رفتار صفحه
- پسوند فایل
js|jsx|ts|tsxمی توان برای صفحات و طرح بندی استفاده کرد. - اجزای صفحه، صادرات پیشفرض هستند
page.js. - اجزای Layout صادرات پیش فرض هستند
layout.js. - اجزای چیدمان باید من قبول دارم الف
childrenپشتیبانی کنید
هنگامی که یک جزء طرحبندی ارائه میشود، children prop با طرح فرزند (اگر در زیر درخت وجود داشته باشد) یا یک صفحه پر می شود.
تجسم آن به عنوان یک درخت چیدمان ممکن است آسان تر باشد، جایی که طرح والد نزدیکترین طرح فرزند را انتخاب می کند تا زمانی که به یک صفحه برسد.
مثال:

// Root layout
// - Applies to all routes
export default function RootLayout({ children }) {
return (
html>
body>
Header />
{children}
Footer />
body>
html>
);
}
// Regular layout
// - Applies to route segments in app/dashboard/*
export default function DashboardLayout({ children }) {
return (
DashboardSidebar />
{children}
>
);
}
// Page Component
// - The UI for the `app/dashboard/analytics` segment
// - Matches the `acme.com/dashboard/analytics` URL path
export default function AnalyticsPage() {
return main>...main>;
}
ترکیب بالا از طرحبندیها و صفحات، سلسله مراتب مؤلفه زیر را ارائه میکند:
RootLayout>
Header />
DashboardLayout>
DashboardSidebar />
AnalyticsPage>
main>...main>
AnalyticsPage>
DashboardLayout>
Footer />
RootLayout>
توجه: React انواع جدیدی از کامپوننت ها را معرفی کرد: سرور، مشتری (کامپوننت های سنتی React)، و اشتراک گذاری. برای کسب اطلاعات بیشتر در مورد این انواع جدید، توصیه می کنیم React Server Components RFC را مطالعه کنید.
با این RFC، میتوانید از ویژگیهای React استفاده کنید و به تدریج React Server Components را در برنامه Next.js خود بکار ببرید.
بخشهای داخلی سیستم مسیریابی جدید از ویژگیهای React اخیراً منتشر شده مانند Streaming، Suspense و Transitions نیز استفاده خواهند کرد. اینها بلوک های سازنده React Server Components هستند.
لینک را به عنوان کپی کنیداجزای پیش فرض سرور
یکی از بزرگترین تغییرات بین pages و app دایرکتوری ها این است که به طور پیش فرض، فایل های داخل app بر روی سرور به عنوان React Server Components ارائه خواهد شد.
این به شما این امکان را می دهد که هنگام مهاجرت از React Server Components به طور خودکار استفاده کنید pages به app.
توجه:
اجزای سرور را می توان درappیا پوشه های خود را، اما نمی توان در آن استفاده کردpagesدایرکتوری سازگاری با عقب.
لینک را به عنوان کپی کنیدکنوانسیون برای اجزای مشتری و سرور
را app سرور، مشتری و اجزای مشترک را پشتیبانی می کند و شما قادر خواهید بود این اجزا را در یک درخت بچرخانید.

بحث در مورد اینکه دقیقاً چه قراردادی برای تعریف مؤلفه های مشتری و مؤلفه های سرور وجود دارد، وجود دارد. حل این بحث را پیگیری خواهیم کرد.
- در حال حاضر، اجزای سرور را می توان با افزودن تعریف کرد
.server.jsبه نام فایل به عنوان مثالlayout.server.js - اجزای مشتری را می توان با اضافه کردن تعریف کرد
.client.jsبه نام فایل به عنوان مثالpage.client.js. .jsفایل ها جزء اجزای مشترک در نظر گرفته می شوند. از آنجایی که می توان آنها را بر روی سرور و کلاینت ارائه کرد، آنها باید به محدودیت های هر زمینه احترام بگذارند.
توجه:
- مؤلفه های سرویس گیرنده و سرور دارای محدودیت هایی هستند که باید رعایت شوند. هنگام تصمیم گیری در مورد استفاده از مؤلفه سرویس گیرنده یا سرور، توصیه می کنیم از مؤلفه های سرور (پیش فرض) استفاده کنید تا زمانی که نیاز به استفاده از مؤلفه مشتری نداشته باشید.
لینک را به عنوان کپی کنیدقلاب
ما قلاب هایی را برای مؤلفه های سرویس گیرنده و سرور اضافه خواهیم کرد که به شما امکان می دهد به شی هدر، کوکی ها، نام مسیرها، پارامترهای جستجو و غیره دسترسی داشته باشید. ما در آینده اسنادی با اطلاعات بیشتر خواهیم داشت.
لینک را به عنوان کپی کنیدمحیط های رندرینگ
با استفاده از قرارداد اجزای سمت سرویس گیرنده و سمت سرور، کنترل دقیقی بر روی اجزای موجود در بسته جاوا اسکریپت سمت کلاینت خواهید داشت.
به طور پیش فرض، مسیرها در app هنگامی که یک بخش مسیر از قلاب های سمت سرور استفاده می کند که به زمینه درخواست نیاز دارند، از تولید استاتیک استفاده می کند و به رندر پویا می رود.
لینک را به عنوان کپی کنیددرهم آمیختن اجزای کلاینت و سرور در یک مسیر
در React، محدودیتی برای وارد کردن اجزای سرور در اجزای مشتری وجود دارد، زیرا اجزای سرور ممکن است دارای کد فقط سرور باشند (به عنوان مثال پایگاه داده یا ابزارهای سیستم فایل).
به عنوان مثال، وارد کردن مؤلفه سرور کار نخواهد کرد:
import ServerComponent from './ServerComponent.js';
export default function ClientComponent() {
return (
ServerComponent />
>
);
}
با این حال، یک مؤلفه سرور را می توان به عنوان فرزند یک مؤلفه مشتری منتقل کرد. شما می توانید این کار را از طریق انجام دهید بسته بندی آنها را در یکی دیگر از اجزای سرور. به عنوان مثال:
export default function ClientComponent({ children }) {
return (
h1>Client Componenth1>
{children}
>
);
}
// ServerComponent.js
export default function ServerComponent() {
return (
h1>Server Componenth1>
>
);
}
// page.js
// It's possible to import Client and Server components inside Server Components
// because this component is rendered on the server
import ClientComponent from "./ClientComponent.js";
import ServerComponent from "./ServerComponent.js";
export default function ServerComponentPage() {
return (
ClientComponent>
ServerComponent />
ClientComponent>
>
);
}
با این مدل، React می داند که باید رندر شود ServerComponent بر روی سرور قبل از ارسال نتیجه (که حاوی کد فقط سرور نیست) برای مشتری. از دیدگاه مؤلفه مشتری، مؤلفه فرزند آن اکنون ارائه می شود.
در چیدمان ها، این الگو با اعمال می شود children prop به طوری که شما مجبور به ایجاد یک جزء بسته بندی اضافی نباشید.
به عنوان مثال، در ClientLayout جزء می پذیرد ServerPage جزء به عنوان فرزند خود:
// The Dashboard Layout is a Client Component
export default function ClientLayout({ children }) {
// Can use useState / useEffect here
return (
h1>Layouth1>
{children}
>
);
}
// The Page is a Server Component that will be passed to Dashboard Layout
// app/dashboard/settings/page.js
export default function ServerPage() {
return (
h1>Pageh1>
>
);
}
توجه: این سبک ترکیب الگوی مهمی برای رندر کردن اجزای سرور به اجزای مشتری است. این یک مدل یادگیری را در اولویت قرار می دهد و یکی از دلایلی است که ما تصمیم به استفاده از آن گرفتیم
childrenپشتیبانی کنید
بازیابی داده ها در چندین بخش در یک مسیر امکان پذیر خواهد بود. این با pages دایرکتوری که در آن بازیابی داده ها به سطح صفحه محدود می شود.
لینک را به عنوان کپی کنیداستخراج داده ها در طرح بندی
می توانید داده ها را در a بازیابی کنید layout.js فایل با استفاده از روش های استخراج داده Next.js getStaticProps یا getServerSideProps.
به عنوان مثال، طرح بندی وبلاگ می تواند استفاده شود getStaticProps برای بازیابی دستههایی از CMS که میتوان از آنها برای پر کردن یک جزء نوار کناری استفاده کرد:
export async function getStaticProps() {
const categories = await getCategoriesFromCMS();
return {
props: { categories },
};
}
export default function BlogLayout({ categories, children }) {
return (
BlogSidebar categories={categories} />
{children}
>
);
}
لینک را به عنوان کپی کنیدچندین روش برای استخراج داده ها در یک مسیر
همچنین می توانید داده ها را در بخش های مختلف مسیر بازیابی کنید. به عنوان مثال، الف layout که داده ها را بازیابی می کند می تواند a را نیز بپیچد page که داده های خود را بازیابی می کند.
با استفاده از مثال وبلاگ بالا، یک صفحه پست ممکن است استفاده کند getStaticProps و getStaticPaths برای بازیابی اطلاعات پست از CMS:
export async function getStaticPaths() {
const posts = await getPostSlugsFromCMS();
return {
paths: posts.map((post) => ({
params: { slug: post.slug },
})),
};
}
export async function getStaticProps({ params }) {
const post = await getPostFromCMS(params.slug);
return {
props: { post },
};
}
export default function BlogPostPage({ post }) {
return Post post={post} />;
}
از آنجایی که هر دو app/blog/layout.js و app/blog/[slug]/page.js استفاده کنید getStaticProps، Next.js به صورت ایستا کل را تولید می کند /blog/[slug] مسیر به عنوان اجزای سرور React در زمان ساخت – منجر به جاوا اسکریپت کمتر سمت مشتری و هیدراتاسیون سریعتر می شود.
مسیرهای ایجاد شده به صورت ایستا این را بهبود می بخشد زیرا ناوبری مشتری از حافظه پنهان (داده های اجزای سرور) مجددا استفاده می کند و کار را دوباره محاسبه نمی کند و در نتیجه زمان CPU کمتری دارد زیرا شما در حال ارائه یک عکس فوری از اجزای سرور هستید.
لینک را به عنوان کپی کنیدرفتار و اولویت
روشهای واکشی داده Next.js (getServerSideProps و getStaticProps) فقط می تواند در اجزای سرور در استفاده شود app پوشه روشهای مختلف استخراج دادهها در بخشهای یک مسیر بر یکدیگر تأثیر میگذارند.
استفاده getServerSideProps در یک بخش تحت تاثیر قرار خواهد گرفت getStaticProps در بخش های دیگر از آنجایی که اکنون درخواست باید به سروری برای getServerSideProps بخش، سرور نیز هر یک را ارائه می دهد getStaticProps بخش ها از قطعات بازیابی شده در حین ساخت مجدد استفاده می کند، بنابراین داده ها همچنان ثابت خواهند بود ارائه بر حسب تقاضا در هر درخواست با لوازمی که در آن زمان تولید می شود اتفاق می افتد next build.
استفاده getStaticProps با اعتبار سنجی مجدد (ISR) در یک بخش تحت تاثیر قرار خواهد گرفت getStaticProps با revalidate در بخش های دیگر اگر دو دوره اعتبار مجدد در یک مسیر وجود داشته باشد، اعتبار مجدد کوتاهتر اولویت دارد.
توجه: در آینده می توان این را بهینه کرد تا امکان استخراج داده ها در یک مسیر به صورت دانه بندی کامل فراهم شود.
لینک را به عنوان کپی کنیدبازیابی اطلاعات با React Server Components
ترکیب مسیریابی سمت سرور، اجزای React Server، Suspense و Streaming چندین پیامد برای بازیابی و رندر داده در Next.js دارد:
لینک را به عنوان کپی کنیدبازیابی داده های موازی
Next.js مشتاقانه بازیابی داده های موازی را برای به حداقل رساندن آبشارها آغاز می کند. به عنوان مثال، اگر استخراج داده ها بود سازگار، هر بخش تو در تو در مسیر نمی تواند شروع به بازیابی داده ها کند تا زمانی که بخش قبلی کامل شود. با موازی بازیابی، با این حال، هر بخش می تواند مشتاقانه شروع به بازیابی داده ها در همان زمان کند.

از آنجا که رندر می تواند وابسته به زمینه باشد، رندر برای هر بخش پس از بازیابی داده های آن و پایان رندر والد آن آغاز می شود.
در آینده، با Suspense، رندر نیز می تواند بلافاصله شروع شود – حتی اگر داده ها به طور کامل بارگذاری نشده باشند. اگر داده ها قبل از در دسترس خواندن خوانده شوند، Suspense فعال می شود. React قبل از تکمیل درخواستها شروع به رندر کردن اجزای سرور به صورت خوشبینانه میکند و پس از حل شدن درخواستها، نتیجه را درج میکند.
لینک را به عنوان کپی کنیداستخراج و رندر جزئی
وقتی بین بخشهای مسیر مرتبط حرکت میکنید، Next.js فقط از آن بخش به پایین واکشی و رندر میشود. نیازی به واکشی مجدد یا ارائه مجدد موارد فوق ندارد. این به این معنی است که در صفحهای که یک طرحبندی را به اشتراک میگذارد، وقتی کاربر بین صفحات مرتبط حرکت میکند، طرحبندی حفظ میشود و Next.js فقط از آن بخش به پایین واکشی و رندر میشود.
این به ویژه برای React Server Components مفید است، زیرا در غیر این صورت هر گونه پیمایش باعث می شود که کل صفحه سرور به جای رندر کردن تنها قسمت تغییر یافته از صفحه سرور، دوباره رندر شود. این امر میزان انتقال داده و زمان اجرا را کاهش می دهد و در نتیجه عملکرد بهتری دارد.
به عنوان مثال، اگر کاربر بین مسیر حرکت کند /analytics و در /settings در صفحات، React بخشهای صفحه را دوباره رندر میکند اما طرحبندیها را حفظ میکند:

توجه: امکان واکشی مجدد داده ها در بالای درخت وجود خواهد داشت. ما هنوز در حال بحث در مورد جزئیات این هستیم که این چگونه خواهد بود و RFC را به روز می کند.
سلسله مراتب app پوشه مستقیماً به مسیرهای URL تبدیل می شود. اما می توان با ایجاد گروه مسیر از این الگو خارج شد. از گروه های مسیر می توان برای موارد زیر استفاده کرد:
- مسیرها را بدون تأثیر بر ساختار URL سازماندهی کنید.
- حذف یک بخش مسیر از یک طرح.
- با تقسیم کردن برنامه، چندین طرحبندی اصلی ایجاد کنید.
لینک را به عنوان کپی کنیدکنوانسیون
گروهی از مسیرها را می توان با قرار دادن نام پوشه در پرانتز ایجاد کرد: (folderName)
توجه: نامگذاری گروههای مسیر فقط برای اهداف سازمانی است، زیرا بر مسیر URL تأثیر نمیگذارند.
مثال: انتخاب یک مسیر خارج از یک طرح
برای حذف یک مسیر از یک طرح، یک گروه مسیر جدید ایجاد کنید (مثلا (shop)) و مسیرهایی که چیدمان یکسانی دارند را به گروه منتقل کنید (مثلاً account و cart). مسیرهای خارج از گروه، طرحبندی را به اشتراک نمیگذارند (مثلاً checkout).
قبل از:

بعد از:

مثال: سازماندهی مسیرها بدون تأثیر بر مسیر URL
به طور مشابه، برای سازماندهی مسیرها، یک گروه ایجاد کنید تا مسیرهای مرتبط را با هم نگه دارید. پوشههای داخل پرانتز از URL حذف میشوند (مثلاً (marketing) یا (shop)).

مثال: ایجاد چند طرح اصلی
برای ایجاد چند طرح اصلی، دو یا چند گروه مسیر را در سطح بالایی ایجاد کنید app اشاره گر این برای تقسیم یک برنامه به بخش هایی که دارای رابط کاربری یا تجربه کاملاً متفاوتی هستند مفید است. را , and tags of each root layout can be customized separately.

Currently, Next.js uses client-side routing. After the initial load and on subsequent navigation, a request is made to the server for the resources of the new page. This includes the JavaScript for every component (including components only shown under certain conditions) and their props (JSON data from getServerSideProps یا getStaticProps). پس از بارگیری جاوا اسکریپت و داده ها از سرور، React کامپوننت ها را در سمت کلاینت رندر می کند.
در این مدل جدید، Next.js از مسیریابی سرور محور در حالی که از انتقال سمت کلاینت پشتیبانی می کند، استفاده می کند. این با اجزای سرور در حال ارزیابی روی سرور سازگار است.
در ناوبری، دادهها واکشی میشوند و React مؤلفهها را رندر میکند سمت سرور. خروجی سرور دستورالعملهای ویژهای (نه HTML یا JSON) برای React روی کلاینت برای بهروزرسانی DOM است. این دستورالعمل ها شامل نتیجه از اجزای سرور رندر شده، به این معنی که هیچ جاوا اسکریپتی برای آن مؤلفه لازم نیست در مرورگر بارگذاری شود تا نتیجه ارائه شود.
این برخلاف پیشفرض فعلی مؤلفههای کلاینت است که مؤلفه جاوا اسکریپت برای مرورگر باید در سمت کلاینت ارائه شود.
برخی از مزایای مسیریابی سرور محور با React Server Components عبارتند از:
- مسیریابی از همان درخواستی استفاده میکند که برای اجزای سرور استفاده میشود (هیچ درخواست سرور اضافی انجام نمیشود).
- کار کمتری روی سرور انجام میشود زیرا پیمایش بین مسیرها تنها بخشهایی را که تغییر میکنند بازیابی و رندر میکند.
- هیچ جاوا اسکریپت اضافی در مرورگر در هنگام ناوبری سمت سرویس گیرنده بارگذاری نمی شود، زمانی که هیچ مؤلفه مشتری جدیدی استفاده نمی شود.
- روتر از یک پروتکل جریان جدید استفاده می کند تا رندر قبل از بارگیری تمام داده ها شروع شود.
همانطور که کاربران در اطراف یک برنامه حرکت می کنند، روتر نتیجه را از React Server Component ذخیره می کند محموله در کش سمت کلاینت حافظه پنهان به بخشهای مسیر تقسیم میشود، که امکان عدم اعتبار در هر سطح را فراهم میکند و ثبات را در بین رندرهای همزمان تضمین میکند. این به این معنی است که در موارد خاصی می توان از حافظه پنهان یک بخش که قبلاً واکشی شده است دوباره استفاده کرد.
توجه داشته باشید
- برای بهینه سازی بازیابی داده ها می توان از تولید استاتیک و کش سمت سرور استفاده کرد.
- اطلاعات بالا رفتار پیمایش های زیر را شرح می دهد. بارگذاری اولیه فرآیند متفاوتی است که شامل رندر سمت سرور برای تولید HTML است.
- اگرچه مسیریابی سمت کلاینت برای Next.js به خوبی کار می کند، اما زمانی که تعداد مسیرهای بالقوه زیاد است، مقیاس ضعیفی دارد، زیرا مشتری باید دانلود کند. نقشه مسیر
- به طور کلی، با استفاده از React Server Components، ناوبری سمت کلاینت سریعتر است، زیرا ما مؤلفههای کمتری را در مرورگر بارگذاری و رندر میکنیم.
در مسیریابی سمت سرور، ناوبری انجام می شود بعد از در حال واکشی و رندر کردن دادهها، بنابراین مهم است که هنگام واکشی دادهها، رابط کاربری بارگیری نشان داده شود، در غیر این صورت برنامه پاسخگو نخواهد بود.

روتر جدید از Suspense برای حالتهای راهاندازی فوری و اسکلتهای پیشفرض استفاده میکند. این بدان معناست که رابط کاربری بارگیری میتواند بلافاصله در حین بارگیری محتوای بخش جدید نمایش داده شود. پس از اتمام رندر سرور، محتوای جدید مبادله می شود.
در حالی که رندر در حال انجام است:
- پیمایش به مسیر جدید فوری خواهد بود.
- تا زمانی که بخشهای مسیر جدید بارگیری میشوند، طرحبندیهای مشترک تعاملی باقی میمانند.
- ناوبری قطع خواهد شد – به این معنی که کاربر می تواند بین مسیرها حرکت کند در حالی که محتوای یک مسیر در حال بارگیری است.
لینک را به عنوان کپی کنیداسکلت های بارگیری پیش فرض
محدودیت های ولتاژ به طور خودکار در پشت صحنه با یک قرارداد فایل جدید به نام انجام می شود loading.js.
مثال:
شما می توانید با افزودن a یک اسکلت لودر پیش فرض ایجاد کنید loading.js فایل در یک پوشه

را loading.js باید یک جزء React صادر کند:
export default function Loading() {
return YourSkeleton />
}
// layout.js
export default function Layout({children}) {
return (
Sidebar />
{children}
>
)
}
// Output
Sidebar />
Suspense fallback={Loading />}>{children}Suspense>
>
این باعث می شود که تمام بخش های پوشه در یک مرز کششی پیچیده شوند. اسکلت پیشفرض زمانی که طرحبندی برای اولین بار بارگیری میشود و هنگام پیمایش بین صفحات مرتبط استفاده میشود.
ErrorBounders مؤلفههای React هستند که خطاهای جاوا اسکریپت را در هر نقطه از درخت مؤلفه فرزند خود میگیرند.
لینک را به عنوان کپی کنیدکنوانسیون
شما قادر خواهید بود یک خطای محدود ایجاد کنید که با اضافه کردن، خطاها را در یک زیردرخت تشخیص دهد error.js فایل و به طور پیش فرض صادر کردن یک جزء React است.

اگر خطایی در این درخت فرعی رخ دهد، مؤلفه به صورت بازگشتی نشان داده می شود. این مؤلفه می تواند برای ثبت خطاها، نمایش اطلاعات مفید در مورد خطا، و ارائه عملکردی برای تلاش برای بازیابی از خطا استفاده شود.
به دلیل ماهیت تودرتوی بخشها و طرحبندیها، ایجاد مرزهای خطا به شما امکان میدهد خطاها را در این بخشهای رابط کاربری جدا کنید. در هنگام بروز خطا، طرحبندیهای بالای مرز تعاملی باقی میمانند و حالت آنها حفظ میشود.
export default function Error({ error, reset }) {
return (
An error occurred: {error.message}
button onClick={() => reset()}>Try againbutton>
>
);
}
// layout.js
export default function Layout({children}) {
return (
Sidebar />
{children}
>
)
}
// Output
Sidebar />
ErrorBoundary fallback={Error />}>{children}ErrorBoundary>
>
توجه:
- خطاهای داخل a
layout.jsفایل در همان بخش به عنوانerror.jsگرفتار نخواهد شد زیرا کران خطای خودکار در اطراف فرزندان طرح بندی قرار می گیرد، نه خود طرح.
الگوها شبیه طرحبندیها هستند زیرا هر صفحهآرایی یا صفحهای را میپیچند.
بر خلاف طرحبندیها، که در مسیرها باقی میمانند و حالت را حفظ میکنند، الگوها برای هر یک از فرزندان خود نمونه جدیدی ایجاد میکنند. این بدان معناست که وقتی کاربر بین بخشهای مسیری که یک الگو را به اشتراک میگذارند پیمایش میکند، یک نمونه جدید از مؤلفه نصب میشود.
توجه: توصیه می کنیم از طرح بندی استفاده کنید مگر اینکه دلیل خاصی برای استفاده از یک الگو داشته باشید.
لینک را به عنوان کپی کنیدکنوانسیون
الگو را می توان با صادرات کامپوننت پیش فرض React از a تعریف کرد template.js فایل جزء باید الف را بپذیرد children پایه ای که با بخش های تو در تو پر می شود.
لینک را به عنوان کپی کنیدیک مثال

export default function Template({ children }) {
return Container>{children}Container>;
}
خروجی رندر شده یک بخش مسیر با طرح و قالب به صورت زیر خواهد بود:
Layout>
{/* Note that the template is given a unique key. */}
Template key={routeParam}>{children}Template>
Layout>
لینک را به عنوان کپی کنیدرفتار
ممکن است مواردی وجود داشته باشد که شما نیاز به نصب و جداسازی رابط کاربری مشترک داشته باشید و الگوها گزینه بهتری باشند. به عنوان مثال:
- با استفاده از CSS یا کتابخانه های انیمیشن، انیمیشن ها را وارد/خروج کنید
- کارکردهایی که بر آن تکیه دارند
useEffect(به عنوان مثال ورود به سیستم بازدید از صفحه) وuseState(به عنوان مثال یک فرم بازخورد در یک صفحه) - برای تغییر رفتار قاب پیش فرض. به عنوان مثال مرزهای ولتاژ در طرحبندیها فقط زمانی که طرحبندی برای اولین بار بارگذاری میشود، بازگشت را نشان میدهد، نه هنگام تعویض صفحات. برای الگوها، نسخه بازگشتی در هر پیمایش نمایش داده می شود.
به عنوان مثال، طراحی یک چیدمان تودرتو با یک محفظه محدود که باید در اطراف هر صفحه فرعی قرار گیرد را در نظر بگیرید.
می توانید ظرف را در طرح والد قرار دهید (shop/layout.js):
export default function Layout({ children }) {
return div className="container">{children}div>;
}
// shop/page.js
export default function Page() {
return div>...div>;
}
// shop/categories/layout.js
export default function CategoryLayout({ children }) {
return div>{children}div>;
}
اما همه انیمیشنهای ورود/خروج در سوئیچهای صفحه پخش نمیشوند زیرا طرحبندی والد مشترک دوباره ارائه نمیشود.
میتوانید ظرف را در هر طرح یا صفحهای تودرتو قرار دهید:
export default function Layout({ children }) {
return div>{children}div>;
}
// shop/page.js
export default function Page() {
return div className="container">...div>;
}
// shop/categories/layout.js
export default function CategoryLayout({ children }) {
return div className="container">{children}div>;
}
اما پس از آن باید آن را به صورت دستی در هر طرح یا صفحه تودرتو قرار دهید، که می تواند در برنامه های پیچیده تر خسته کننده و مستعد خطا باشد.
با استفاده از این کنوانسیون، می توانید الگوهایی را بین مسیرها به اشتراک بگذارید که یک نمونه جدید در مسیریابی ایجاد می کند. این بدان معنی است که عناصر DOM دوباره ایجاد می شوند، وضعیت ذخیره نمی شود و افکت ها مجدداً همگام می شوند.
ما قصد داریم تا کنوانسیون هایی را برای پوشش لبه ها معرفی کنیم و به شما امکان می دهیم الگوهای مسیریابی پیچیده تری را پیاده سازی کنید. در زیر چند نمونه وجود دارد که ما فعالانه به آنها فکر می کنیم:
لینک را به عنوان کپی کنیدرهگیری مسیرها
گاهی اوقات رهگیری بخش های مسیر از مسیرهای دیگر می تواند مفید باشد. هنگام پیمایش، URL به طور معمول به روز می شود، اما بخش رهگیری شده در طرح مسیر فعلی نمایش داده می شود.
لینک را به عنوان کپی کنیدیک مثال
قبل از: با کلیک بر روی تصویر به مسیر جدیدی با چیدمان خاص خود می رسید.

بعد از: با برداشتن مسیر، کلیک روی تصویر اکنون بخش را در طرح بندی مسیر فعلی بارگیری می کند. به عنوان مثال به عنوان مدال

برای رهگیری /photo/[id] مسیر از داخل /[username] بخش، یک نسخه تکراری ایجاد کنید /photo/[id] پوشه داخل /[username] پوشه و ارائه آن با (..) کنوانسیون

لینک را به عنوان کپی کنیدکنوانسیون
(..)– با بخش مسیر یک سطح به بالا (برادر دایرکتوری والد) مطابقت خواهد داشت. شبیه به../در مسیرهای نسبی(..)(..)– با بخش مسیر دو سطح بالاتر مطابقت دارد. شبیه به../../در مسیرهای نسبی(...)– با بخش مسیر در فهرست اصلی مطابقت دارد.
توجه: بهروزرسانی یا اشتراکگذاری صفحه، مسیر را با طرحبندی پیشفرض بارگیری میکند.
لینک را به عنوان کپی کنیدمسیرهای موازی پویا
گاهی اوقات نمایش دو یا چند بخش از یک صفحه می تواند مفید باشد (page.js) در همان نمای قابل ناوبری مستقل.
برای مثال، دو یا چند گروه از برگهها را در یک داشبورد در نظر بگیرید. پیمایش یک گروه از برگه ها نباید بر دیگری تأثیر بگذارد. هنگام پیمایش به عقب و جلو، ترکیبات برگه ها نیز باید به درستی بازیابی شوند.

لینک را به عنوان کپی کنیدکنوانسیون
بهطور پیشفرض طرحبندیها یک پایه به نام را میپذیرند children که حاوی یک طرح یا صفحه تو در تو خواهد بود. میتوانید با ایجاد یک نام «slot» (پوشهای که شامل آن میشود، نام آن را تغییر دهید @ پیشوند) و بخش های تو در تو در داخل آن.

پس از این تغییر، طرح یک پایه فراخوانی می شود customProp به جای children.
export default function Layout({ customProp }) {
return {customProp}>;
}
شما می توانید مسیرهای موازی را با اضافه کردن بیش از یک اسلات نامگذاری شده در همان سطح ایجاد کنید. در مثال زیر، هر دو @views و @audience به عنوان پایه به طرح تحلیل منتقل می شوند.

میتوانید از شکافهای نامگذاریشده برای نمایش همزمان بخشهایی از صفحه استفاده کنید.
export default function Layout({ views, audience }) {
return (
div>
ViewsNav />
{views}
div>
div>
AudienceNav />
{audience}
div>
>
);
}
زمانی که کاربر برای اولین بار به /analytics، در page.js بخش در هر پوشه (@views و @audience) نشان داده شده اند.
هنگام پیمایش به /analytics/subscribers، فقط @audience در حال به روز رسانی است. به همین ترتیب، فقط @views هنگام پیمایش به به روز می شوند /analytics/impressions.
پیمایش به عقب و جلو، ترکیب صحیح مسیرهای موازی را بازیابی می کند.
لینک را به عنوان کپی کنیدترکیب مسیرهای متقاطع و موازی
شما می توانید مسیرهای رهگیری و موازی را برای دستیابی به رفتار مسیریابی خاص در برنامه خود ترکیب کنید.
یک مثال
به عنوان مثال، هنگام ایجاد یک مدال، اغلب باید از برخی چالشهای رایج آگاه باشید، مانند:
- مدال ها از طریق URL قابل دسترسی نیستند.
- هنگامی که صفحه به روز می شود، مدال ها بسته می شوند.
- پیمایش به مسیر قبلی، نه مسیر پشت مودال.
- پیمایش به جلو، مودال را دوباره باز نمی کند.
ممکن است بخواهید modal هنگام باز شدن url را به روز کند و ناوبری عقب / جلو برای باز و بسته کردن modal. علاوه بر این، زمانی که URL را به اشتراک می گذارید، ممکن است بخواهید صفحه با مدال باز و زمینه پشت آن بارگیری شود، یا ممکن است بخواهید صفحه محتوا را بدون مدال بارگیری کند.
نمونه بارز این عکس ها در سایت های رسانه های اجتماعی است. به طور معمول، عکسها در یک مدال از فید یا نمایه کاربر در دسترس هستند. اما وقتی عکس را به اشتراک می گذارند، مستقیماً در صفحه خودشان ظاهر می شوند.
با استفاده از قراردادها، میتوانیم نقشه رفتار مودال را به رفتار مسیریابی پیشفرض بسازیم.
این ساختار پوشه را در نظر بگیرید:

با این مدل:
- محتوای
/photo/[id]از طریق URL در زمینه خود قابل دسترسی است. همچنین در یک مودال از داخل در دسترس است/[username]مسیر - پیمایش به جلو و عقب با استفاده از ناوبری سمت سرویس گیرنده باید مودال را بسته و دوباره باز کند.
- تازه کردن صفحه (ناوبری سمت سرور) باید کاربر را به صفحه اصلی برساند
/photo/idمسیر به جای نشان دادن مودال.
ج /@modal/(..)photo/[id]/page.js، می توانید محتوای صفحه را که در یک جزء معین پیچیده شده است برگردانید.
export default function PhotoPage() {
const router = useRouter();
return (
Modal
// the modal should always be shown on page load
isOpen={true}
// closing the modal should take user back to the previous page
onClose={() => router.back()}
>
{/* Page Content */}
Modal>
);
}
توجه: این راه حل تنها راه برای ایجاد یک مدال در Next.js نیست، بلکه قصد دارد نشان دهد که چگونه می توانید قراردادها را برای دستیابی به رفتار مسیریابی پیچیده تر ترکیب کنید.
گاهی اوقات ممکن است برای تعیین مسیر نمایش به اطلاعات پویا مانند داده یا زمینه نیاز داشته باشید. شما می توانید از مسیرهای موازی برای بارگذاری مشروط یک مسیر یا مسیر دیگر استفاده کنید.
یک مثال
export async function getServerSideProps({ params }) {
const { accountType } = await fetchAccount(params.slug);
return { props: { isUser: accountType === 'user' } };
}
export default function UserOrTeamLayout({ isUser, user, team }) {
return {isUser ? user : team}>;
}
در مثال بالا، می توانید یکی از این دو را برگردانید user یا team مسیر بسته به حلزون حرکت می کند. این به شما امکان می دهد تا داده ها را به صورت مشروط بارگذاری کنید و مسیرهای فرعی را روی یک گزینه یا گزینه دیگر نقشه برداری کنید.
ما در مورد آینده طرحبندی، مسیریابی و React 18 در Next.js هیجانزده هستیم. کار پیادهسازی آغاز شده است و به محض در دسترس شدن ویژگیها را اعلام خواهیم کرد.
نظرات خود را بنویسید و به گفتگو در بحث های GitHub بپیوندید.



