حول المحتوى:
دليل عملي لبناء Progressive Web App باستخدام Next.js وNext-PWA: الإعداد، تخزين الموارد أوفلاين، استراتيجيات التحديث، وتحسين تجربة المستخدم على الموبايل.
إذا كنت تريد بناء تطبيق ويب يشبه التطبيقات الأصلية (Native) ويعمل حتى بدون اتصال بالإنترنت، فالحل هو Progressive Web App (PWA). ومع إطار مثل Next.js يمكنك دمج الـ PWA بسهولة مع أداء عالٍ وSEO قوي.
في هذا الدليل سنتعلم خطوة بخطوة كيفية بناء PWA Next.js offline باستخدام مكتبة next-pwa وService Workers، مع التركيز على:
إذا لم تكن لديك خلفية سابقة عن PWA مع Next.js يمكنك مراجعة مقالنا السابق بناء PWA مع Next.js وNext-PWA كمقدمة أساسية، ثم العودة لهذا الدليل التطبيقي المتقدم.
Progressive Web App (PWA) هو تطبيق ويب يستخدم تقنيات حديثة مثل Service Workers وWeb App Manifest لتقديم تجربة قريبة من تطبيقات الجوال:
ميزة العمل أوفلاين في PWA Next.js offline تعتمد أساساً على:
Next.js يوفر مجموعة مزايا تجعله مناسباً لبناء PWA احترافية:
_document.js و_app.js لتخصيص الـ Head والستايلات وتضمين manifest.وبدمج Next.js مع Service Worker بشكل صحيح، تحصل على PWA Next.js offline يعمل بسلاسة حتى في انقطاع الإنترنت.
ابدأ بإنشاء مشروع Next.js (أو استخدم مشروعك الحالي):
npx create-next-app pwa-nextjs-offline
cd pwa-nextjs-offline
أو باستخدام TypeScript:
npx create-next-app@latest pwa-nextjs-offline --typescript
cd pwa-nextjs-offline
بدلاً من كتابة Service Worker يدوياً، سنستخدم next-pwa، وهي مكتبة تسهّل تحويل مشروعك إلى PWA مع خيارات للكاش واستراتيجيات التخزين.
npm install next-pwa
# أو
yarn add next-pwa
افتح next.config.js وأضف إعدادات next-pwa. الفكرة أن نُغلّف إعدادات Next.js بمُهيئ withPWA:
const withPWA = require('next-pwa')({
dest: 'public',
register: true,
skipWaiting: true,
// يمكن تفعيل هذا الخيار لاحقاً لتخصيص الاستراتيجيات
// runtimeCaching: [...]
})
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
}
module.exports = withPWA(nextConfig)
public. ملف manifest.json يعرف معلومات التطبيق مثل الاسم والأيقونات والألوان، ويسمح بالتثبيت على شاشة الهاتف.
أنشئ ملفاً باسم manifest.json داخل مجلد public:
{
"name": "PWA Next.js Offline Demo",
"short_name": "PWA Offline",
"description": "تطبيق PWA Next.js offline يعمل بدون اتصال بالإنترنت.",
"start_url": "/",
"display": "standalone",
"orientation": "portrait",
"background_color": "#ffffff",
"theme_color": "#0f172a",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
تأكد من توفير الأيقونات في المسارات المذكورة. يمكنك توليدها من أي لوجو باستخدام أدوات مثل PWABuilder.
_document.js لإخبار المتصفح بوجود manifest، نضيف روابط داخل عنصر Head الخاص بـ Next.js.
أنشئ أو عدّل ملف pages/_document.js كالتالي:
import Document, { Html, Head, Main, NextScript } from 'next/document'
class MyDocument extends Document {
render() {
return (
<Html lang="ar" dir="rtl">
<Head>
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#0f172a" />
<link rel="icon" href="/icons/icon-192x192.png" />
<link rel="apple-touch-icon" href="/icons/icon-192x192.png" />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
عند بناء المشروع في وضع الإنتاج، تقوم next-pwa بتوليد ملف service-worker.js تلقائياً. هذا الملف:
لرؤية Service Worker فعلياً:
npm run build
npm run start
قوة PWA Next.js offline تأتي من استراتيجية التخزين المؤقت للموارد. next-pwa مبنية على workbox وتدعم خيارات متعددة.
لضبط كيفية تعامل Service Worker مع طلبات معينة، نستخدم خيار runtimeCaching في next.config.js.
أضف ملفاً باسم next-pwa.config.js في جذر المشروع (اختياري للتنظيم):
const runtimeCaching = [
{
// كاش للصفحات (HTML) باستخدام Network First
urlPattern: /^https?.*/,
handler: 'NetworkFirst',
options: {
cacheName: 'http-pages-cache',
networkTimeoutSeconds: 10,
expiration: {
maxEntries: 50,
maxAgeSeconds: 24 * 60 * 60, // يوم واحد
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
]
module.exports = runtimeCaching
ثم عدّل next.config.js لاستيراد هذا الإعداد:
const runtimeCaching = require('./next-pwa.config')
const withPWA = require('next-pwa')({
dest: 'public',
register: true,
skipWaiting: true,
runtimeCaching,
})
const nextConfig = {
reactStrictMode: true,
}
module.exports = withPWA(nextConfig)
الآن، عند زيارة الموقع مرة على الأقل، يمكن للمستخدم تصفح الصفحات التي تمت زيارتها من قبل حتى في وضع أوفلاين.
لتحسين تجربة المستخدم، من الأفضل تقديم صفحة أوفلاين خاصة بدلاً من رسالة المتصفح الافتراضية عند انقطاع الإنترنت.
أنشئ صفحة جديدة في pages/_offline.js:
export default function OfflinePage() {
return (
<div style={{
minHeight: '100vh',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'column',
fontFamily: 'system-ui, sans-serif',
padding: '1.5rem',
textAlign: 'center'
}}>
<h1>أنت حالياً بدون اتصال بالإنترنت</h1>
<p>
بعض المزايا غير متاحة الآن، لكن لا يزال بإمكانك تصفح الصفحات التي تم فتحها مسبقاً.
</p>
<p style={{ marginTop: '1rem', fontSize: '0.9rem', color: '#555' }}>
أعد المحاولة عند توفر اتصال بالشبكة.
</p>
</div>
)
}
يمكننا استخدام workbox داخل next-pwa لاستبدال الرد في حالة عدم وجود اتصال. في الإصدارات الحديثة، تحتاج إلى custom worker، لكن لتبسيط الفكرة سنضيف نمطاً في runtimeCaching يعيد صفحة offline عند فشل الطلب.
عدّل next-pwa.config.js لإضافة نمط لصفحة _offline إن لزم، أو اعتمد على آلية NetworkFirst مع fallback من خلال كود مخصص في Service Worker (خارج نطاق هذا الدليل التفصيلي). الفكرة الأساسية:
/_offline. في التطبيقات الإنتاجية الكبيرة يمكن أن تبني Service Worker مخصصاً تستخدم فيه self.addEventListener('fetch', ...) وevent.respondWith للتحكم الكامل في سلوك الأوفلاين.
عند نشر إصدار جديد من تطبيقك، تحتاج لتحديث Service Worker والكاش. في إعدادنا:
أفضل ممارسة هي:
postMessage).لكي يشعر المستخدم أن تطبيقك PWA Next.js offline هو تطبيق جوال حقيقي، انتبه للنقاط التالية:
display: "standalone" في manifest.بعد تنفيذ الخطوات السابقة، قم بالتالي:
npm run build
npm run start
بما أن PWA يعتمد بقوة على التخزين في المتصفح، يجب أن تراعي بعض ممارسات الأمان:
بعد الانتهاء من إعداد PWA Next.js offline، يمكنك توسيع التطبيق بـ:
بناء PWA Next.js offline لا يعني فقط تفعيل مكتبة next-pwa؛ بل يتطلب فهم كيفية عمل Service Workers، واستراتيجيات الكاش، وتجربة المستخدم في وضع الأوفلاين.
باختصار، الخطوات الأساسية هي:
_document.js.next.config.js.باتباع هذا الدليل، يمكنك تحويل أي مشروع Next.js إلى تطبيق PWA كامل يدعم العمل أوفلاين، ويحافظ على أداء عالٍ وتجربة مستخدم مميزة على مختلف الأجهزة.
دليل عملي لبناء Progressive Web App باستخدام Next.js وNext-PWA: الإعداد، تخزين الموارد أوفلاين، استراتيجيات التحديث، وتحسين تجربة المستخدم على الموبايل.
مساحة اعلانية