يتم تشغيل هذا البرنامج المساعد بواسطة Workbox والأشياء الجيدة الأخرى.
شارك مشروع PWA الرائع الخاص بك هنا
سمات
next-i18next
blitz.config.js
).module.js
عندما يكون next.config.js
مضبوطًا على experimental.modern
على true
الملاحظة 1 - يجب أن يعمل إصدار
next-pwa
2.0.0+ فقط معnext.js
9.1+، ويجب أن يتم تقديم الملفات الثابتة فقط من خلال الدليلpublic
. وهذا سيجعل الأمور أسهل.الملاحظة 2 - إذا واجهت خطأ
TypeError: Cannot read property **'javascript' of undefined**
أثناء الإنشاء، فيرجى التفكير في الترقية إلى webpack5 فيnext.config.js
.
إذا كنت جديدًا على
next.js
أوreact.js
على الإطلاق، فقد ترغب في الخروج أولاً للتعرف على مستند next.js أو next.js. ثم ابدأ بمثال بسيط أو مثال لتطبيق ويب تقدمي في مستودع next.js.
yarn add next-pwa
قم بتحديث أو إنشاء next.config.js
باستخدام
const withPWA = require ( 'next-pwa' ) ( {
dest : 'public'
} )
module . exports = withPWA ( {
// next.js config
} )
بعد تشغيل next build
، سيؤدي هذا إلى إنشاء ملفين في ملفك public
: workbox-*.js
و sw.js
، والذي سيتم تقديمه تلقائيًا بشكل ثابت.
إذا كنت تستخدم الإصدار 9 من Next.js أو أحدث، فتخطى الخيارات أدناه وانتقل إلى الخطوة 2.
إذا كنت تستخدم Next.js أقدم من الإصدار 9، فستحتاج إلى تحديد أحد الخيارات أدناه قبل المتابعة إلى الخطوة 2.
انسخ الملفات إلى خادم استضافة الملفات الثابتة الخاص بك، بحيث يمكن الوصول إليها من المسارات التالية: https://yourdomain.com/sw.js
و https://yourdomain.com/workbox-*.js
.
أحد الأمثلة هو استخدام خدمة استضافة Firebase لاستضافة تلك الملفات بشكل ثابت. يمكنك أتمتة خطوة النسخ باستخدام البرامج النصية في سير عمل النشر الخاص بك.
لأسباب أمنية، يجب عليك استضافة هذه الملفات مباشرة من المجال الخاص بك. إذا تم تسليم المحتوى باستخدام إعادة التوجيه، فسيرفض المتصفح تشغيل عامل الخدمة.
عند تلقي طلب HTTP، اختبر ما إذا كانت هذه الملفات مطلوبة، ثم قم بإرجاع تلك الملفات الثابتة.
مثال server.js
const { createServer } = require ( 'http' )
const { join } = require ( 'path' )
const { parse } = require ( 'url' )
const next = require ( 'next' )
const app = next ( { dev : process . env . NODE_ENV !== 'production' } )
const handle = app . getRequestHandler ( )
app . prepare ( ) . then ( ( ) => {
createServer ( ( req , res ) => {
const parsedUrl = parse ( req . url , true )
const { pathname } = parsedUrl
if ( pathname === '/sw.js' || / ^/(workbox|worker|fallback)-w+.js$ / . test ( pathname ) ) {
const filePath = join ( __dirname , '.next' , pathname )
app . serveStatic ( req , res , filePath )
} else {
handle ( req , res , parsedUrl )
}
} ) . listen ( 3000 , ( ) => {
console . log ( `> Ready on http://localhost: ${ 3000 } ` )
} )
} )
الإعداد التالي ليس له علاقة بالمكون الإضافي
next-pwa
، ومن المحتمل أنك قمت بإعداده بالفعل. إذا لم يكن الأمر كذلك، فاستمر في إعدادها.
قم بإنشاء ملف manifest.json
في مجلدك public
:
{
"name" : " PWA App " ,
"short_name" : " App " ,
"icons" : [
{
"src" : " /icons/android-chrome-192x192.png " ,
"sizes" : " 192x192 " ,
"type" : " image/png " ,
"purpose" : " any maskable "
},
{
"src" : " /icons/android-chrome-384x384.png " ,
"sizes" : " 384x384 " ,
"type" : " image/png "
},
{
"src" : " /icons/icon-512x512.png " ,
"sizes" : " 512x512 " ,
"type" : " image/png "
}
],
"theme_color" : " #FFFFFF " ,
"background_color" : " #FFFFFF " ,
"start_url" : " / " ,
"display" : " standalone " ,
"orientation" : " portrait "
}
أضف ما يلي إلى _document.jsx
أو _app.tsx
، في :
< meta name =" application-name " content =" PWA App " />
< meta name =" apple-mobile-web-app-capable " content =" yes " />
< meta name =" apple-mobile-web-app-status-bar-style " content =" default " />
< meta name =" apple-mobile-web-app-title " content =" PWA App " />
< meta name =" description " content =" Best PWA App in the world " />
< meta name =" format-detection " content =" telephone=no " />
< meta name =" mobile-web-app-capable " content =" yes " />
< meta name =" msapplication-config " content =" /icons/browserconfig.xml " />
< meta name =" msapplication-TileColor " content =" #2B5797 " />
< meta name =" msapplication-tap-highlight " content =" no " />
< meta name =" theme-color " content =" #000000 " />
< link rel =" apple-touch-icon " href =" /icons/touch-icon-iphone.png " />
< link rel =" apple-touch-icon " sizes =" 152x152 " href =" /icons/touch-icon-ipad.png " />
< link rel =" apple-touch-icon " sizes =" 180x180 " href =" /icons/touch-icon-iphone-retina.png " />
< link rel =" apple-touch-icon " sizes =" 167x167 " href =" /icons/touch-icon-ipad-retina.png " />
< link rel =" icon " type =" image/png " sizes =" 32x32 " href =" /icons/favicon-32x32.png " />
< link rel =" icon " type =" image/png " sizes =" 16x16 " href =" /icons/favicon-16x16.png " />
< link rel =" manifest " href =" /manifest.json " />
< link rel =" mask-icon " href =" /icons/safari-pinned-tab.svg " color =" #5bbad5 " />
< link rel =" shortcut icon " href =" /favicon.ico " />
< link rel =" stylesheet " href =" https://fonts.googleapis.com/css?family=Roboto:300,400,500 " />
< meta name =" twitter:card " content =" summary " />
< meta name =" twitter:url " content =" https://yourdomain.com " />
< meta name =" twitter:title " content =" PWA App " />
< meta name =" twitter:description " content =" Best PWA App in the world " />
< meta name =" twitter:image " content =" https://yourdomain.com/icons/android-chrome-192x192.png " />
< meta name =" twitter:creator " content =" @DavidWShadow " />
< meta property =" og:type " content =" website " />
< meta property =" og:title " content =" PWA App " />
< meta property =" og:description " content =" Best PWA App in the world " />
< meta property =" og:site_name " content =" PWA App " />
< meta property =" og:url " content =" https://yourdomain.com " />
< meta property =" og:image " content =" https://yourdomain.com/icons/apple-touch-icon.png " />
نصيحة: ضع العلامة الوصفية لرأس
viewport
في_app.js
بدلاً من_document.js
إذا كنت في حاجة إليها.
< meta
name = 'viewport'
content = 'minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no, user-scalable=no, viewport-fit=cover'
/ >
تكون العمليات الاحتياطية دون اتصال مفيدة عندما تفشل عملية الجلب من ذاكرة التخزين المؤقت والشبكة، ويتم تقديم مورد تم تخزينه مؤقتًا مسبقًا بدلاً من تقديم خطأ من المتصفح.
للبدء، ما عليك سوى إضافة صفحة /_offline
مثل pages/_offline.js
أو pages/_offline.jsx
أو pages/_offline.ts
أو pages/_offline.tsx
. إذن أنت جاهز تمامًا! عندما يكون المستخدم غير متصل بالإنترنت، ستعود كافة الصفحات التي لم يتم تخزينها مؤقتًا إلى "/_offline".
استخدم هذا المثال لرؤيته في العمل
يساعدك next-pwa
على تخزين تلك الموارد مؤقتًا عند التحميل الأول، ثم إدخال معالج احتياطي إلى المكون الإضافي handlerDidError
في جميع تكوينات runtimeCaching
، بحيث يتم تقديم الموارد المخزنة مؤقتًا عند فشل الجلب.
يمكنك أيضًا إعداد precacheFallback.fallbackURL
في إدخال تكوين runtimeCaching الخاص بك لتنفيذ وظائف مماثلة. الفرق هو أن الطريقة المذكورة أعلاه تعتمد على نوع المورد، وتعتمد هذه الطريقة على نمط عنوان URL المطابق. إذا تم تعيين هذا التكوين في إدخال تكوين runtimeCaching، فسيتم تعطيل الإجراء الاحتياطي المستند إلى نوع المورد تلقائيًا لنمط عنوان URL هذا لتجنب التعارض.
هناك خيارات يمكنك استخدامها لتخصيص سلوك هذه الإضافة عن طريق إضافة كائن pwa
في التكوين التالي في next.config.js
:
const withPWA = require ( 'next-pwa' ) ( {
dest : 'public'
// disable: process.env.NODE_ENV === 'development',
// register: true,
// scope: '/app',
// sw: 'service-worker.js',
//...
} )
module . exports = withPWA ( {
// next.js config
} )
false
disable: false
، بحيث يتم إنشاء عامل الخدمة في كل من dev
و prod
disable: true
لتعطيل PWA تمامًاdev
، فيمكنك تعيين disable: process.env.NODE_ENV === 'development'
true
false
عندما تريد التعامل مع عامل خدمة التسجيل بنفسك، ويمكن القيام بذلك في componentDidMount
لتطبيقك الجذر. يمكنك اعتبار السجل.js كمثال.basePath
في next.config.js
أو /
/app
بحيث يكون المسار الموجود ضمن /app
هو PWA بينما لا يكون الآخرون كذلك/sw.js
public
من التخزين المؤقت مسبقًا.['!noprecache/**/*']
- هذا يعني أن السلوك الافتراضي سيقوم بتخزين جميع الملفات الموجودة داخل المجلد public
مؤقتًا مسبقًا باستثناء الملفات الموجودة داخل المجلد /public/noprecache
. يمكنك ببساطة وضع الملفات داخل هذا المجلد حتى لا يتم تخزينها مؤقتًا دون تكوين هذا.['!img/super-large-image.jpg', '!fonts/not-used-fonts.otf']
.next/static
(أو الإصدار المخصص الخاص بك)[]
[/chunks/images/.*$/]
- لا تقم بتخزين الملفات مؤقتًا مسبقًا ضمن .next/static/chunks/images
(نوصي بشدة بهذا للعمل مع البرنامج الإضافي next-optimized-images
)true
true
cacheStartUrl
على true
/login
، فمن المستحسن إعداد عنوان URL المعاد توجيهه هذا للحصول على أفضل تجربة للمستخدم.undefined
dynamicStartUrlRedirect
على true
/_offline
مثل pages/_offline.js
وستكون جاهزًا تمامًا، دون الحاجة إلى أي تكوينobject
fallbacks.document
- المسار الاحتياطي للمستند (الصفحة)، الافتراضي هو /_offline
إذا قمت بإنشاء تلك الصفحةfallbacks.image
- المسار الاحتياطي للصورة، الافتراضي هو لا شيءfallbacks.audio
- المسار الاحتياطي للصوت، الافتراضي هو لا شيءfallbacks.video
- المسار الاحتياطي للفيديو، الافتراضي هو لا شيءfallbacks.font
- المسار الاحتياطي للخط، الافتراضي هو لا شيءnext/link
في الواجهة الأمامية. تحقق من هذا المثال للحصول على بعض السياق حول سبب تنفيذ ذلك.false
""
- أي افتراضي بدون بادئة/subdomain
إذا كان التطبيق مستضافًا على example.com/subdomain
location.reload()
لتحديث التطبيق.true
next-pwa
عن تطبيق عامل مخصص لإضافته إلى عامل الخدمة الذي تم إنشاؤه بواسطة Workbox. لمزيد من المعلومات، راجع مثال العامل المخصص.worker
يستخدم next-pwa
workbox-webpack-plugin
، ويمكن العثور على خيارات أخرى يمكن وضعها أيضًا في كائن pwa
في المستندات الخاصة بـ GenerateSW وInjectManifest. إذا قمت بتحديد swSrc
، فسيتم استخدام البرنامج المساعد InjectManifest
، وإلا فسيتم استخدام GenerateSW
لإنشاء عامل الخدمة.
يستخدم next-pwa
ملف ذاكرة التخزين المؤقت الافتراضي لوقت التشغيل.js
هناك احتمال كبير أنك قد ترغب في تخصيص قواعد التخزين المؤقت الخاصة بوقت التشغيل. لا تتردد في نسخ ملف cache.js
الافتراضي وتخصيص القواعد كما تريد. لا تنس إدخال التكوينات في تكوين pwa
الخاص بك في next.config.js
.
فيما يلي المستند الخاص بكيفية كتابة تكوينات التخزين المؤقت لوقت التشغيل، بما في ذلك مزامنة الخلفية وميزات تحديث البث والمزيد!
{command: 'doSomething', message: ''}
كائن عند postMessage
إلى عامل الخدمة. بحيث يمكن للمستمع القيام بمهام مختلفة متعددة باستخدام if...else...
.clean application cache
باستمرار لتقليل بعض الأخطاء غير المستقرة.runtimeCaching
مثل options.cacheableResponse.statuses=[200,302]
.sw.js
الذي تم إنشاؤه لمعرفة ما يحدث بالفعل.next-pwa
على إنشاء بناء إنتاج صندوق العامل عن طريق تحديد mode: 'production'
في قسم pwa
الخاص بك في next.config.js
. على الرغم من أن next-pwa
يقوم تلقائيًا بإنشاء بناء تطوير صندوق العامل أثناء التطوير (عن طريق تشغيل next
) وبناء إنتاج صندوق العامل أثناء الإنتاج (عن طريق تشغيل next build
و next start
). قد لا تزال ترغب في إجباره على إنشاء الإنتاج حتى أثناء تطوير تطبيق الويب الخاص بك للسبب التالي:self.__WB_DISABLE_DEV_LOGS = true
في worker/index.js
الخاص بك (قم بإنشاء واحد إذا لم يكن لديك واحد).userAgent
لتحديد ما إذا كان المستخدمون يستخدمون Safari/iOS/MacOS أو أي نظام أساسي آخر، وتعد مكتبة ua-parser-js صديقًا جيدًا لهذا الغرض. معهد ماساتشوستس للتكنولوجيا