فارسی

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

خروجی‌های استاتیک Next.js: ساخت اپلیکیشن‌های فقط سمت کلاینت

Next.js یک فریم‌ورک قدرتمند ری‌اکت است که به توسعه‌دهندگان امکان می‌دهد اپلیکیشن‌های وب با کارایی بالا، مقیاس‌پذیر و سازگار با SEO بسازند. در حالی که Next.js به خاطر قابلیت‌های رندر سمت سرور (SSR) و تولید سایت استاتیک (SSG) مشهور است، انعطاف‌پذیری لازم برای ایجاد اپلیکیشن‌های کاملاً سمت کلاینت را با استفاده از خروجی‌های استاتیک نیز فراهم می‌کند. این رویکرد به شما اجازه می‌دهد از مزایای ابزارها و ساختار Next.js بهره‌مند شوید و در عین حال یک اپلیکیشن کاملاً سمت کلاینت را مستقر کنید. این پست شما را با تمام آنچه برای ساخت اپلیکیشن‌های فقط سمت کلاینت با خروجی‌های استاتیک Next.js نیاز دارید، از جمله مزایا، محدودیت‌ها، فرآیند راه‌اندازی و تکنیک‌های پیشرفته، آشنا می‌کند.

خروجی‌های استاتیک Next.js چه هستند؟

خروجی‌های استاتیک در Next.js به فرآیند تولید یک نسخه کاملاً استاتیک از اپلیکیشن شما در طول فرآیند بیلد اشاره دارد. این بدان معناست که تمام فایل‌های HTML، CSS و جاوا اسکریپت از قبل رندر شده و آماده ارائه مستقیم از یک سرور فایل استاتیک (مانند Netlify، Vercel، AWS S3 یا یک وب سرور سنتی) هستند. برخلاف اپلیکیشن‌های رندر شده در سرور، برای مدیریت درخواست‌های ورودی نیازی به سرور Node.js نیست. در عوض، کل اپلیکیشن به عنوان مجموعه‌ای از فایل‌های استاتیک تحویل داده می‌شود.

هنگامی که هدف یک اپلیکیشن کاملاً سمت کلاینت است، Next.js این فایل‌های استاتیک را با این فرض تولید می‌کند که تمام رفتارهای پویا توسط جاوا اسکریپت سمت کلاینت مدیریت خواهد شد. این ویژگی به ویژه برای اپلیکیشن‌های تک صفحه‌ای (SPAs) که عمدتاً به مسیریابی سمت کلاینت، فراخوانی API و تعاملات کاربر متکی هستند، مفید است.

چرا خروجی‌های استاتیک را برای اپلیکیشن‌های سمت کلاینت انتخاب کنیم؟

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

محدودیت‌های خروجی‌های استاتیک

در حالی که خروجی‌های استاتیک مزایای زیادی دارند، آگاهی از محدودیت‌های آنها مهم است:

راه‌اندازی Next.js برای خروجی‌های استاتیک

در اینجا یک راهنمای گام به گام در مورد نحوه راه‌اندازی Next.js برای خروجی‌های استاتیک آورده شده است:

۱. ایجاد یک پروژه جدید Next.js

اگر هنوز پروژه Next.js ندارید، با استفاده از دستور زیر یکی ایجاد کنید:

npx create-next-app my-client-app

در طول فرآیند راه‌اندازی، گزینه‌هایی را که به بهترین وجه با نیازهای شما مطابقت دارند انتخاب کنید (مانند TypeScript، ESLint).

۲. پیکربندی `next.config.js`

فایل `next.config.js` را در ریشه پروژه خود باز کرده و پیکربندی زیر را اضافه کنید:

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
  trailingSlash: true,
  // Optional: Change links `/me` -> `/me/` and emit `/me.html` -> `/me/index.html`
  // see https://nextjs.org/docs/app/api-reference/next-config#trailing-slash
  // experimental:
  //  {appDir: false}
}

module.exports = nextConfig

گزینه `output: 'export'` به Next.js می‌گوید که یک خروجی استاتیک از اپلیکیشن شما تولید کند. تنظیم `trailingSlash: true` به طور کلی برای اطمینان از ساختار URL سازگار و جلوگیری از مشکلات احتمالی سئو توصیه می‌شود.

۳. به‌روزرسانی `package.json`

بخش `scripts` فایل `package.json` خود را برای اضافه کردن یک اسکریپت بیلد برای خروجی‌های استاتیک تغییر دهید:

{
  "scripts": {
    "dev": "next dev",
    "build": "next build && next export",
    "start": "next start",
    "lint": "next lint"
  }
}

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

۴. پیاده‌سازی مسیریابی سمت کلاینت

از آنجایی که شما در حال ساخت یک اپلیکیشن سمت کلاینت هستید، باید مسیریابی سمت کلاینت را با استفاده از ماژول `next/router` یا یک کتابخانه شخص ثالث مانند `react-router-dom` پیاده‌سازی کنید. در اینجا یک مثال با استفاده از `next/router` آورده شده است:

import { useRouter } from 'next/router';
import Link from 'next/link';

function HomePage() {
  const router = useRouter();

  const handleClick = () => {
    router.push('/about');
  };

  return (
    <div>
      <h1>Home Page</h1>
      <p>Welcome to the home page!</p>
      <button onClick={handleClick}>Go to About Page</button>

      <Link href="/about">
         <a>Go to About Page (using Link)</a>
      </Link>
    </div>
  );
}

export default HomePage;

به یاد داشته باشید که برای ناوبری داخلی از کامپوننت `Link` از `next/link` استفاده کنید تا از انتقال‌های روان در سمت کلاینت اطمینان حاصل کنید.

۵. مدیریت واکشی داده در سمت کلاینت

در یک اپلیکیشن سمت کلاینت، تمام واکشی داده‌ها باید در سمت کلاینت با استفاده از تکنیک‌هایی مانند هوک‌های `useEffect` یا `useState` انجام شود. برای مثال:

import { useState, useEffect } from 'react';

function DataPage() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        const jsonData = await response.json();
        setData(jsonData);
      } catch (e) {
        setError(e);
      } finally {
        setLoading(false);
      }
    }

    fetchData();
  }, []);

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;
  if (!data) return <p>No data to display</p>;

  return (
    <div>
      <h1>Data Page</h1>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
}

export default DataPage;

۶. بیلد و خروجی گرفتن از اپلیکیشن

اسکریپت بیلد را برای تولید خروجی استاتیک اجرا کنید:

npm run build

این دستور یک دایرکتوری `out` (یا `public` بسته به نسخه Next.js) ایجاد می‌کند که حاوی فایل‌های استاتیک HTML، CSS و جاوا اسکریپت برای اپلیکیشن شما است.

۷. استقرار سایت استاتیک

اکنون می‌توانید محتویات دایرکتوری `out` را در یک ارائه‌دهنده هاستینگ استاتیک مانند Netlify، Vercel، AWS S3 یا GitHub Pages مستقر کنید. اکثر ارائه‌دهندگان، استقرار با کشیدن و رها کردن (drag-and-drop) یا ابزارهای خط فرمان برای خودکارسازی این فرآیند را ارائه می‌دهند.

تکنیک‌های پیشرفته برای اپلیکیشن‌های سمت کلاینت Next.js

در اینجا چند تکنیک پیشرفته برای بهینه‌سازی اپلیکیشن‌های سمت کلاینت Next.js شما آورده شده است:

۱. تقسیم کد (Code Splitting) و بارگذاری تنبل (Lazy Loading)

از importهای پویا (`import()`) برای تقسیم کد خود به قطعات کوچکتر که بر اساس تقاضا بارگذاری می‌شوند، استفاده کنید. این کار می‌تواند زمان بارگذاری اولیه را به خصوص برای اپلیکیشن‌های بزرگ به طور قابل توجهی بهبود بخشد.

import React, { Suspense } from 'react';

const MyComponent = React.lazy(() => import('./MyComponent'));

function MyPage() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
}

۲. بهینه‌سازی تصاویر

از کامپوننت `next/image` برای بهینه‌سازی تصاویر استفاده کنید. این کامپوننت به طور خودکار تصاویر را برای دستگاه‌ها و اندازه‌های مختلف صفحه بهینه می‌کند و عملکرد و تجربه کاربری را بهبود می‌بخشد. این کامپوننت از بارگذاری تنبل، تصاویر واکنش‌گرا و فرمت‌های مختلف تصویر پشتیبانی می‌کند.

import Image from 'next/image';

function MyComponent() {
  return (
    <Image
      src="/images/my-image.jpg"
      alt="My Image"
      width={500}
      height={300}
    />
  );
}

۳. سرویس ورکرها (Service Workers)

یک سرویس ورکر را برای فعال کردن قابلیت آفلاین و بهبود عملکرد پیاده‌سازی کنید. سرویس ورکر یک اسکریپت است که در پس‌زمینه اجرا می‌شود و می‌تواند درخواست‌های شبکه را رهگیری کند، فایل‌ها را کش کند و اعلان‌ها را ارسال کند. کتابخانه‌هایی مانند `next-pwa` می‌توانند فرآیند افزودن یک سرویس ورکر به اپلیکیشن Next.js شما را ساده کنند.

۴. متغیرهای محیطی (Environment Variables)

از متغیرهای محیطی برای پیکربندی اپلیکیشن خود برای محیط‌های مختلف (مانند توسعه، تست، تولید) استفاده کنید. Next.js از طریق فایل `.env` و شیء `process.env` پشتیبانی داخلی از متغیرهای محیطی را فراهم می‌کند. مراقب باشید اطلاعات حساس را در کد سمت کلاینت افشا نکنید. از متغیرهای محیطی عمدتاً برای تنظیمات پیکربندی که افشای آنها امن است، استفاده کنید.

۵. نظارت و تحلیل (Monitoring and Analytics)

یک سرویس نظارت و تحلیل (مانند Google Analytics، Sentry یا New Relic) را برای ردیابی معیارهای عملکرد، شناسایی خطاها و به دست آوردن بینش در مورد رفتار کاربر ادغام کنید. این کار به شما کمک می‌کند تا اپلیکیشن خود را بهینه کرده و تجربه کاربری را در طول زمان بهبود بخشید.

۶. بهینه‌سازی برای سئو در اپلیکیشن‌های سمت کلاینت

در حالی که خروجی‌های استاتیک یک ساختار اولیه HTML را فراهم می‌کنند، این استراتژی‌ها را برای سئو بهتر در اپلیکیشن‌های سنگین سمت کلاینت در نظر بگیرید:

ملاحظات بین‌المللی‌سازی (i18n)

هنگام ساخت یک اپلیکیشن سمت کلاینت برای مخاطبان جهانی، بین‌المللی‌سازی (i18n) بسیار مهم است. در اینجا چند روش برتر آورده شده است:

انتخاب رویکرد مناسب: خروجی استاتیک در مقابل رندر سمت سرور

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

مثال‌های واقعی

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

مثال: وب‌سایت شرکت بین‌المللی

شرکتی را تصور کنید که در نیویورک، لندن و توکیو دفتر دارد. آنها وب‌سایتی می‌خواهند که به زبان‌های انگلیسی، فرانسوی و ژاپنی در دسترس باشد. یک خروجی استاتیک Next.js، همراه با یک CMS بدون سر و کتابخانه‌های i18n، می‌تواند ایده‌آل باشد. CMS محتوای ترجمه شده را ذخیره می‌کند، Next.js آن را در سمت کلاینت واکشی و رندر می‌کند و سایت استاتیک می‌تواند برای دسترسی سریع در سطح جهانی روی یک CDN مستقر شود.

نتیجه‌گیری

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