إنشاء قائمة تخزين مسبق لعامل الخدمة
الصق مسارات الملفات التي يجب أن يحفظها موقعك للعمل دون اتصال، واحصل على قائمة مرتبة ونظيفة: يصبح /assets/./app.js هو /assets/app.js، ويُحذف ملف الأنماط المكرر، وتصبح المدخلات الخمسة في المثال 4. مجاني في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
يبدأ تثبيت عامل الخدمة الموثوق بقائمة مرتبة من الملفات المطلوب تخزينها مؤقتًا. تستقبل هذه الأداة مسارات الأصول الثابتة، وتحول المدخلات النسبية إلى عناوين تبدأ من جذر الموقع، وتعالج مقاطع النقاط الآمنة، وتحافظ على سلاسل الاستعلام المهمة، ثم تزيل التكرارات من دون تغيير ترتيب الظهور الأول. وتعيد قائمة تخزين مسبق جاهزة لـCache Storage مع أعداد مفيدة لأتمتة فحوص البناء.
حوّل مخرجات البناء إلى قائمة جاهزة للتثبيت
قد تنتج عمليات بناء الويب الحديثة ملفات HTML وأوراق الأنماط وأجزاء JavaScript والخطوط والأيقونات وصفحات بديلة داخل مجلدات متعددة. يستغرق نسخ هذه الأسماء يدويًا إلى عامل الخدمة وقتًا، كما يؤدي إلى اختلافات عند نقل أي ملف. تحتفظ القائمة بترتيب الظهور الأول لتسهيل مراجعة الملفات والمقارنة بين عمليات البناء.
تعرض الاستجابة أيضًا العدد النهائي للأصول وعدد التكرارات المحذوفة. تفيد هذه القيم في CI، إذ يمكن لانخفاض غير متوقع في العدد أن يوقف البناء قبل نشر إصدار ناقص للعمل دون اتصال. لا تنزّل الأداة الأصول ولا تنشئ بصماتها ولا تفحصها، بل تحوّل المسارات الواردة من عملية بناء موثوقة فقط.
توحيد المسارات بقواعد متوقعة
قد تشير صيغ مختلفة لمسار الأصل إلى الملف نفسه. فمثلًا تتحول <code>assets/app.js</code> و<code>/assets/app.js</code> و<code>/assets/./app.js</code> جميعًا إلى <code>/assets/app.js</code>. تدمج الأداة الشرطات المائلة المتكررة، وتعالج مقاطع المجلد الأب الآمنة، وتحذف المسافات الخارجية، ثم تستبعد النتيجة الموحدة إذا تكررت بعد ظهورها الأول.
تبقى سلاسل الاستعلام لأن <code>/app.js? كذلك تُرفض العناوين الكاملة والعناوين النسبية إلى البروتوكول، فهذه القدرة مخصصة لملفات ثابتة في الموقع نفسه لا لموارد جهات خارجية. ويفشل المسار الذي يتجاوز جذر الموقع بدل إعادة كتابته بصمت.
وبذلك تظل النتيجة حتمية دون افتراض مصدر النشر أو محتوى الأصول أو توافرها الخارجي.
استخدم القائمة بأمان داخل عامل الخدمة
ضع المصفوفة الناتجة في إجراء التثبيت الذي يفتح ذاكرة مؤقتة ذات إصدار ويستدعي <code>addAll</code>. أدِر إصدار اسم الذاكرة بصورة منفصلة، لأن الأداة لا تعرف متى يتغير محتوى ملف ويبقى مساره ثابتًا. إذا أضاف المجمّع بصمات إلى أسماء الملفات، فأدخل المسارات الناتجة؛ وإذا استخدم أسماء ثابتة، فغيّر إصدار الذاكرة عند تغير المحتوى.
تزيد القائمة الضخمة زمن التنزيل واحتمال فشل التثبيت على الاتصالات الضعيفة. الحد الوقائي 10,000 مدخل، لكن ينبغي أن تكون قائمة الإنتاج أصغر بكثير. احذف إصدارات الذاكرة القديمة عند التفعيل وفق سياستك.
تنشئ هذه الأداة القائمة فقط؛ فلا تولد الأحداث، ولا تختار استراتيجية تخزين، ولا تصل إلى الشبكة، ولا تعدّل عامل خدمة قائمًا.
حالات الاستخدام
إنشاء قائمة هيكل التطبيق
وحّد مسارات HTML وCSS وJavaScript والخطوط والأيقونات اللازمة لبدء تطبيق ويب تقدمي دون اتصال.
فحص نواتج البناء في CI
حوّل أسماء النواتج المجمعة إلى نتيجة مستقرة وتحقق من الأعداد قبل النشر.
تنظيف قائمة يدوية
عالج المسارات النسبية غير المتسقة واحذف التكرارات العرضية مع الحفاظ على ترتيب التثبيت.
الأسئلة الشائعة
ما التكلفة؟
ويمكن تشغيل أداة الإنشاء الحتمية نفسها داخل متصفحك في هذه الصفحة.
هل تنزّل الأداة الأصول أو تتحقق منها؟
لا. تتحقق من سلاسل المسارات وتوحّدها دون طلبات شبكة أو فحص وجود الملفات.
لماذا يُحتفظ بسلاسل الاستعلام؟
قد يحدد الاستعلام مفتاحًا أو إصدارًا مختلفًا، وقد يؤدي حذفه إلى دمج موارد ينبغي أن تبقى منفصلة.
لماذا تُرفض عناوين URL البعيدة؟
تنشئ القدرة قائمة ثابتة للموقع نفسه. ويتطلب التخزين بين المصادر قرارات صريحة بشأن التوافر وCORS والخصوصية والأعطال.
لماذا يُنصح بترقيم اسم ذاكرة التخزين المؤقت بشكل منفصل؟
لأن القائمة تنظر إلى المسارات فقط، فلا يمكنها أن تعرف متى يتغير محتوى ملف بقي اسمه كما هو. إذا كانت أسماء ملفاتك تحمل بصمة للمحتوى فسمِّ الذاكرة باسم الإصدار، وإلا فغيّر رقمها كلما تغير المحتوى.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/web/service-worker-cache-list-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"paths":["/","/assets/app.css","assets/app.js","/icons/icon-192.png"]}'const res = await fetch("https://api.kit.forhosting.com/web/service-worker-cache-list-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"paths": [
"/",
"/assets/app.css",
"assets/app.js",
"/icons/icon-192.png"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/service-worker-cache-list-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"paths": [
"/",
"/assets/app.css",
"assets/app.js",
"/icons/icon-192.png"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/service-worker-cache-list-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"paths":["/","/assets/app.css","assets/app.js","/icons/icon-192.png"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"paths":["/","/assets/app.css","assets/app.js","/icons/icon-192.png"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/service-worker-cache-list-build", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"paths": [
"/",
"/assets/app.css",
"assets/app.js",
"/icons/icon-192.png"
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.service_worker_cache_list_build",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
timeout_sec | 30 |
max_crawl_pages | 25 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
حوّل مخرجات البناء إلى قائمة جاهزة للتثبيت
أرسل المسارات الثابتة بترتيب الجلب المطلوب، فتعيد الأداة قائمة تخزين مسبق لعامل الخدمة في المفتاح <code>precache_manifest</code>. كل عنصر عنوان محلي يبدأ من جذر الموقع، ولذلك يمكن تمرير المصفوفة مباشرة إلى <code>cache.addAll(precache_manifest)</code> أثناء حدث التثبيت.
توحيد المسارات بقواعد متوقعة
v=41</code> و<code>/app.js? v=42</code> قد يمثلان مفتاحين مختلفين في الذاكرة المؤقتة. تُرفض الأجزاء المرجعية لأنها لا تُرسل في طلبات HTTP وقد توحي بوجود موارد شبكة مختلفة.
استخدم القائمة بأمان داخل عامل الخدمة
تعامل مع المدخلات بوصفها قائمة سماح مقصودة: أدرج هيكل التطبيق والأصول اللازمة للعمل دون اتصال، وتجنب الصفحات الخاصة بالمستخدم وردود API الموثقة وعناوين وقت التشغيل غير المحدودة.
أسئلة تقنية
هل يمكن تمرير النتيجة مباشرة إلى cache.addAll؟
نعم. قيمة precache_manifest مصفوفة من عناوين URL المحلية المناسبة للدالة addAll في Cache Storage.
ماذا يحدث عندما تكون قائمة المسارات فارغة؟
يفشل الطلب بخطأ invalid_input لأن قائمة التخزين المسبق الفارغة لا تحقق غرض هذه القدرة.