ساختار پوشه‌ها در پروژه‌های Next.js؛ هر فایل چه کاربردی دارد؟

توسعه‌دهنده فرانت‌اند

ساختار پوشه‌ها در پروژه‌های Next.js؛ هر فایل چه کاربردی دارد؟

این مقاله با ساختار پوشه‌ها و فایل‌های مهم در پروژه‌های Next.js آشنا می‌کند. از app و page.tsx گرفته تا layout.tsx، مسیرهای داینامیک، public، components و فایل‌های تنظیماتی مانند package.json و next.config.ts را بررسی می‌کنیم تا درک بهتری از سازمان‌دهی پروژه‌های Next.js داشته باشیم.

ساختار پوشه‌ها در پروژه‌های Next.js؛ هر فایل چه کاربردی دارد؟

مهدیس پژوهان

توسعه‌دهنده فرانت‌اند

۱۴۰۵/۷/۸
۰ نفر
۶ دقیقه مطالعه

ساختار پوشه‌ها در پروژه‌های Next.js؛ هر فایل چه کاربردی دارد؟

وقتی برای اولین بار وارد یک پروژه Next.js می‌شویم، ممکن است تعداد زیادی پوشه و فایل مختلف ببینیم و ندانیم هرکدام چه کاربردی دارند.

درک ساختار پروژه یکی از اولین چیزهایی است که به ما کمک می‌کند راحت‌تر در یک پروژه Next.js کار کنیم و بدانیم هر فایل را باید کجا قرار دهیم.

در این مقاله با ساختار معمول یک پروژه Next.js آشنا می‌شویم و کاربرد مهم‌ترین پوشه‌ها و فایل‌ها را بررسی می‌کنیم.

ساختار کلی یک پروژه Next.js

یک پروژه معمولی Next.js می‌تواند چیزی شبیه ساختار زیر داشته باشد:

my-next-app/

├── app/

├── public/

├── src/

├── node_modules/

├── .env

├── .gitignore

├── next.config.ts

├── package.json

└── tsconfig.json

البته همه پروژه‌ها دقیقاً چنین ساختاری ندارند و ممکن است بر اساس نیاز پروژه، پوشه‌های دیگری هم به آن اضافه شوند.

پوشه app

یکی از مهم‌ترین پوشه‌ها در پروژه‌های جدید Next.js، پوشه app است.

این پوشه محل قرارگیری صفحات، Layoutها، Loadingها، صفحات خطا و بسیاری از بخش‌های مربوط به Routing پروژه است.

برای مثال:

app/

├── page.tsx

├── about/

│   └── page.tsx

└── products/

    └── page.tsx

در این ساختار:

  • app/page.tsx → صفحه اصلی سایت

  • app/about/page.tsx → صفحه About

  • app/products/page.tsx → صفحه Products

ساختار پوشه‌ها در اینجا مستقیماً با مسیرهای سایت ارتباط دارد.

فایل page.tsx

فایل page.tsx برای تعریف یک صفحه استفاده می‌شود.

مثلاً اگر داشته باشیم:

app/

└── about/

    └── page.tsx

این فایل صفحه مربوط به مسیر /about را ایجاد می‌کند.

یک نمونه ساده:

export default function AboutPage() {

  return (

    <main>

      <h1>درباره ما</h1>

      <p>به وب‌سایت ما خوش آمدید.</p>

    </main>

  );

}

فایل layout.tsx

layout.tsx برای بخش‌هایی استفاده می‌شود که قرار است بین چند صفحه مشترک باشند.

برای مثال Header و Footer معمولاً می‌توانند در یک Layout قرار بگیرند.

app/

├── layout.tsx

├── page.tsx

└── about/

    └── page.tsx

Layout اصلی می‌تواند ساختاری شبیه این داشته باشد:

export default function RootLayout({

  children,

}: {

  children: React.ReactNode;

}) {

  return (

    <html lang="fa" dir="rtl">

      <body>

        <header>Header</header>

 

        {children}

 

        <footer>Footer</footer>

      </body>

    </html>

  );

}

مزیت این کار این است که لازم نیست Header و Footer را در تک‌تک صفحات دوباره بنویسیم.

فایل loading.tsx

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

در این شرایط می‌توانیم از loading.tsx استفاده کنیم.

مثلاً:

app/

└── products/

    ├── page.tsx

    └── loading.tsx

فایل loading.tsx می‌تواند یک Loading UI یا Skeleton نمایش دهد تا محتوای اصلی آماده شود.

فایل error.tsx

در هر پروژه‌ای ممکن است خطا اتفاق بیفتد.

Next.js امکان ایجاد یک رابط کاربری مخصوص برای نمایش خطا را با error.tsx فراهم می‌کند.

مثلاً:

app/

└── products/

    ├── page.tsx

    └── error.tsx

در این فایل می‌توانیم پیام مناسبی به کاربر نمایش دهیم و حتی گزینه‌ای برای تلاش مجدد در اختیار او قرار دهیم.

فایل not-found.tsx

اگر کاربر وارد صفحه‌ای شود که وجود ندارد، می‌توانیم با استفاده از not-found.tsx یک صفحه 404 اختصاصی ایجاد کنیم.

مثلاً:

app/

├── page.tsx

└── not-found.tsx

این فایل می‌تواند صفحه‌ای مانند «صفحه موردنظر پیدا نشد» را نمایش دهد.

Dynamic Routes

یکی از قابلیت‌های کاربردی Next.js، ساخت صفحات داینامیک است.

فرض کنید یک فروشگاه داریم و می‌خواهیم برای هر محصول یک صفحه جدا داشته باشیم.

می‌توانیم ساختاری مثل این داشته باشیم:

app/

└── products/

    └── [id]/

        └── page.tsx

در این حالت [id] یک مقدار داینامیک است.

برای مثال:

/products/1

/products/2

/products/25

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

پوشه public

پوشه public معمولاً برای فایل‌های استاتیک پروژه استفاده می‌شود.

برای مثال:

public/

├── logo.png

├── images/

│   └── product.jpg

└── favicon.ico

فایل‌هایی که در public قرار می‌گیرند می‌توانند مستقیماً از مسیر سایت مورد استفاده قرار بگیرند.

مثلاً:

<img src="/logo.png" alt="Logo" />

پوشه src

استفاده از src در پروژه‌های Next.js اختیاری است، اما بسیاری از پروژه‌ها برای مرتب‌تر شدن ساختار از آن استفاده می‌کنند.

برای مثال:

src/

├── app/

├── components/

├── lib/

└── types/

در این حالت کد اصلی پروژه داخل src قرار می‌گیرد.

پوشه components

این پوشه معمولاً برای کامپوننت‌های قابل استفاده مجدد استفاده می‌شود.

برای مثال:

components/

├── Button.tsx

├── Navbar.tsx

├── Footer.tsx

└── ProductCard.tsx

اگر یک ProductCard در چند صفحه استفاده شود، می‌توانیم آن را یک بار ایجاد کنیم و در قسمت‌های مختلف پروژه استفاده کنیم.

پوشه lib

پوشه lib معمولاً برای کدهای کمکی و منطق‌هایی استفاده می‌شود که مستقیماً مربوط به UI نیستند.

برای مثال:

lib/

├── api.ts

├── utils.ts

└── db.ts

البته ساختار دقیق این پوشه به معماری و نیازهای پروژه بستگی دارد.

فایل package.json

این فایل یکی از فایل‌های اصلی هر پروژه JavaScript یا Next.js است.

در package.json اطلاعاتی مانند:

  • نام پروژه

  • اسکریپت‌های پروژه

  • وابستگی‌ها

  • نسخه پکیج‌ها

قرار می‌گیرد.

برای مثال ممکن است در آن چیزی شبیه این ببینیم:

{

  "scripts": {

    "dev": "next dev",

    "build": "next build",

    "start": "next start"

  }

}

به همین دلیل وقتی دستور زیر را اجرا می‌کنیم:

npm run dev

در واقع یکی از Scriptهای تعریف‌شده در package.json اجرا می‌شود.

فایل next.config.ts

این فایل برای تنظیمات مربوط به Next.js استفاده می‌شود.

برای مثال ممکن است تنظیمات مربوط به تصاویر، Redirectها یا قابلیت‌های مختلف Next.js در این فایل قرار بگیرند.

لازم نیست در همه پروژه‌ها تنظیمات زیادی در این فایل وجود داشته باشد.

فایل .env

اطلاعاتی که نباید مستقیماً داخل کد قرار بگیرند، معمولاً در فایل‌های Environment Variable نگهداری می‌شوند.

برای مثال:

DATABASE_URL=...

API_KEY=...

این فایل معمولاً نباید در Git عمومی قرار بگیرد؛ به همین دلیل اغلب در .gitignore قرار داده می‌شود.

فایل tsconfig.json

اگر پروژه با TypeScript ساخته شده باشد، tsconfig.json تنظیمات TypeScript پروژه را مشخص می‌کند.

برای مثال می‌تواند مشخص کند:

  • کد TypeScript چگونه بررسی شود

  • مسیرهای Import چگونه مدیریت شوند

  • چه تنظیماتی برای Compiler استفاده شود

فایل .gitignore

این فایل مشخص می‌کند چه فایل‌ها و پوشه‌هایی نباید توسط Git دنبال شوند.

برای مثال معمولاً مواردی مانند:

node_modules/

.next/

.env

در این فایل قرار می‌گیرند.

یک ساختار پیشنهادی برای پروژه

با کنار هم قرار دادن مواردی که بررسی کردیم، می‌توانیم یک پروژه را به شکل زیر سازمان‌دهی کنیم:

my-next-app/

├── src/

│   ├── app/

│   │   ├── layout.tsx

│   │   ├── page.tsx

│   │   ├── about/

│   │   │   └── page.tsx

│   │   └── products/

│   │       ├── page.tsx

│   │       └── [id]/

│   │           └── page.tsx

│   │

│   ├── components/

│   │   ├── Navbar.tsx

│   │   ├── Footer.tsx

│   │   └── ProductCard.tsx

│   │

│   ├── lib/

│   │   └── api.ts

│   │

│   └── types/

│       └── product.ts

│

├── public/

│   └── images/

│

├── .env

├── .gitignore

├── next.config.ts

├── package.json

└── tsconfig.json

این فقط یک نمونه است و قرار نیست تمام پروژه‌های Next.js دقیقاً همین ساختار را داشته باشند.

جمع‌بندی

شناخت ساختار پروژه یکی از اولین قدم‌ها برای کار راحت‌تر با Next.js است.

مهم‌ترین مواردی که باید به خاطر داشته باشیم عبارت‌اند از:

  • app → صفحات و ساختار اصلی Routing

  • page.tsx → تعریف یک صفحه

  • layout.tsx → بخش‌های مشترک صفحات

  • loading.tsx → رابط کاربری زمان Loading

  • error.tsx → مدیریت رابط کاربری خطا

  • not-found.tsx → صفحه 404

  • [id] → مسیر داینامیک

  • public → فایل‌های استاتیک

  • components → کامپوننت‌های قابل استفاده مجدد

  • lib → توابع و منطق‌های کمکی

  • package.json → وابستگی‌ها و Scriptهای پروژه

  • next.config.ts → تنظیمات Next.js

  • .env → متغیرهای محیطی

  • tsconfig.json → تنظیمات TypeScript

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

 

این مطلب برای شما مفید بود؟با لایک کردن، به ما انرژی بدهید
۰ نفر این مطلب را پسندیده‌اند