לאפשר ל-Service Workers לציין לדפדפנים אילו דפים עובדים במצב אופליין
מהו ה-API להוספת תוכן לאינדקס?
שימוש באפליקציית אינטרנט מתקדמת פירושו קבלת גישה למידע שמעניין אנשים – תמונות, סרטונים, מאמרים ועוד – בלי קשר במצב הנוכחי של החיבור לרשת. טכנולוגיות כמו service worker את Cache Storage API, ו-IndexedDB לספק לכם את אבני הבניין לאחסון ולמילוי של נתונים כשאנשים לקיים אינטראקציה ישירה עם PWA. אבל פיתוח של PWA באיכות גבוהה שמתמקדת באופליין רק חלק מהסיפור. אם אנשים לא מבינים שהתוכן של אפליקציית אינטרנט בזמן שהם לא מחוברים לאינטרנט, הם לא יפיקו את המרב מהעבודה שלך ליישום הפונקציונליות הזו.
זוהי בעיית גילוי; איך ה-PWA יכולה לעורר מודעות למשתמשים תוכן שזמין לצפייה אופליין, כדי שהם יוכלו לגלות ולראות מה זמין? ממשק API להוספת תוכן לאינדקס הוא פתרון לבעיה הזו. החלק שפונה למפתחים בפתרון הזה הוא הרחבה לעובדי שירות, שמאפשר למפתחים להוסיף כתובות URL ומטא-נתונים של דפים שתומכים במצב אופליין לאינדקס מקומי שמתוחזק על ידי בדפדפן. השיפור הזה זמין ב-Chrome בגרסה 84 ואילך.
אחרי שהאינדקס מאוכלס בתוכן מה-PWA, וגם מכל סוג אחר של תוכן אפליקציות PWA מותקנות, הדפדפן יציג אותן, כמו שמוצג בהמשך.
בנוסף, Chrome יכול להמליץ באופן יזום על תוכן כשהוא מזהה המשתמש לא מחובר לאינטרנט.
ה-Content Indexing API לא מהווה דרך חלופית לשמירת תוכן במטמון. זו דרך לספק מטא-נתונים על דפים שכבר נשמרו במטמון על ידי השירות עובד, כדי שהדפדפן יוכל להציג את הדפים האלה כאשר אנשים צפויים שרוצים לצפות בהן. Content Indexing API עוזר לגלות של דפים שנשמרו במטמון.
ראו הדגמה
הדרך הטובה ביותר להתנסות ב-Content Indexing API היא לנסות דוגמה תרגום מכונה.
- חשוב לוודא שאתם משתמשים בדפדפן ובפלטפורמה נתמכים. נכון לעכשיו,
שמוגבל ל-Chrome 84 ואילך ב-Android. כדי לראות, צריך לעבור אל
about://version
גרסת Chrome שמותקנת אצלך. - נכנסים אל https://contentindex.dev
- לוחצים על הלחצן
+
לצד פריט אחד או יותר ברשימה. - (אופציונלי) משביתים את חיבור ה-Wi-Fi והנתונים הסלולריים במכשיר, או מפעילים מצב טיסה שמדמה את העברת הדפדפן למצב אופליין.
- בוחרים באפשרות הורדות מתפריט Chrome ועוברים לכרטיסייה מאמרים שעשויים לעניין אותך.
- מעיינים בתוכן ששמרתם.
אפשר לראות את המקור של האפליקציה לדוגמה ב-GitHub.
אפליקציה אחרת לדוגמה, Scrapbook PWA, המחשה של השימוש ב-Content Indexing API באמצעות Web Share Target API. הקוד מדגים שיטה לשמירה על סנכרון בין Content Indexing API לבין פריטים שאוחסנו על ידי אפליקציית אינטרנט באמצעות Cache Storage API.
שימוש ב-API
כדי להשתמש ב-API, האפליקציה צריכה להכיל קובץ שירות (service worker) וכתובות URL שניתן לנווט אליהן במצב אופליין. אם אין כרגע קובץ שירות (service worker) באפליקציית האינטרנט, אפשר להשתמש בספריות של תיבת העבודה כדי לפשט את ה אנחנו יוצרים תיעוד.
איזה סוג של כתובות URL ניתן להוסיף לאינדקס ככתובות עם יכולת אופליין?
ה-API תומך בכתובות URL להוספה לאינדקס התואמות למסמכי HTML. כתובת URL של קובץ שמור למשל, לא ניתן להוסיף לאינדקס קובץ מדיה באופן ישיר. במקום זאת, עליכם לספק כתובת URL של דף שמציג מדיה ופועל במצב אופליין.
מומלץ ליצור 'צפייה' דף HTML שיכול לקבל את שבבסיס כתובת האתר של המדיה כפרמטר של שאילתה, ולאחר מכן להציג את התוכן קובץ מסוים, אולי באמצעות פקדים נוספים או תוכן נוסף בדף.
אפליקציות אינטרנט יכולות להוסיף רק כתובות URL לאינדקס התוכן ש היקף של קובץ השירות הנוכחי. במילים אחרות, אפליקציית אינטרנט לא הצליחה להוסיף כתובת URL השייכים לדומיין אחר לחלוטין באינדקס התוכן.
סקירה כללית
ה-Content Indexing API תומך בשלוש פעולות: הוספה, רישום
הסרת מטא-נתונים. השיטות האלה נחשפות מנכס חדש, index
,
נוסף אל
ServiceWorkerRegistration
גרפי.
השלב הראשון בהוספת תוכן לאינדקס הוא קבלת הפניה
ServiceWorkerRegistration
הדרך הישירה ביותר להשתמש בnavigator.serviceWorker.ready
היא:
const registration = await navigator.serviceWorker.ready;
// Remember to feature-detect before using the API:
if ('index' in registration) {
// Your Content Indexing API code goes here!
}
אם מבצעים קריאות ל-Content Indexing API מתוך Service Worker,
במקום בתוך דף אינטרנט, ניתן לעיין בServiceWorkerRegistration
ישירות דרך registration
. הוא כבר מוגדר
כחלק מServiceWorkerGlobalScope.
הוספה לאינדקס
משתמשים בשיטה add()
כדי להוסיף לאינדקס כתובות URL ואת המטא-נתונים המשויכים אליהן. תלוי
שאפשר לבחור כשפריטים מתווספים לאינדקס. כדאי להוסיף
להוסיף לאינדקס בתגובה לקלט, כמו לחיצה על "שמירה במצב אופליין" לחצן. או לך
עשוי להוסיף פריטים באופן אוטומטי בכל פעם שהנתונים ששמורים במטמון מתעדכנים באמצעות מנגנון
כמו סנכרון תקופתי ברקע.
await registration.index.add({
// Required; set to something unique within your web app.
id: 'article-123',
// Required; url needs to be an offline-capable HTML page.
url: '/articles/123',
// Required; used in user-visible lists of content.
title: 'Article title',
// Required; used in user-visible lists of content.
description: 'Amazing article about things!',
// Required; used in user-visible lists of content.
icons: [{
src: '/img/article-123.png',
sizes: '64x64',
type: 'image/png',
}],
// Optional; valid categories are currently:
// 'homepage', 'article', 'video', 'audio', or '' (default).
category: 'article',
});
הוספת רשומה משפיעה רק על אינדקס התוכן. הוא לא מוסיף שום דבר מטמון.
אותיות רישיות: add()
מההקשר של window
אם הסמלים מסתמכים על handler של fetch
כשתתקשר אל add()
, תישלח בקשה מ-Chrome ל-
לכתובת URL של כל סמל כדי לוודא שיש בו עותק של הסמל שאפשר להשתמש בו
שמציגה רשימה של תוכן שנוסף לאינדקס.
אם קוראים ל-
add()
מההקשר שלwindow
(במילים אחרות, מהאינטרנט ), הבקשה הזו תפעיל אירועfetch
ב-Service Worker שלכם.אם מתקשרים אל
add()
מתוך Service Worker (אולי בתוך אירוע אחר) handler), הבקשה לא תפעיל את ה-handler שלfetch
של קובץ השירות. הסמלים יאוחזרו ישירות, ללא מעורבות של קובץ שירות (service worker). שמירה כדאי לזכור את זה אם הסמלים מסתמכים על ה-handler שלfetch
, אולי כי הם קיימים רק במטמון המקומי ולא ברשת. אם כן, ודאו קוראים לפונקציהadd()
רק מההקשרwindow
.
פירוט תוכן האינדקס
השיטה getAll()
מחזירה הבטחה לרשימה קבועה של רשומות שנוספו לאינדקס
והמטא-נתונים שלהם. הרשומות המוחזרות יכילו את כל הנתונים שנשמרו באמצעות
add()
const entries = await registration.index.getAll();
for (const entry of entries) {
// entry.id, entry.launchUrl, etc. are all exposed.
}
הסרת פריטים מהאינדקס
כדי להסיר פריט מהאינדקס, צריך להפעיל את delete()
עם id
של הפריט כדי
remove:
await registration.index.delete('article-123');
קריאה אל delete()
משפיעה רק על האינדקס. היא לא מוחקת דבר
מטמון.
טיפול באירוע מחיקת משתמש
כשהדפדפן מציג את התוכן שנוסף לאינדקס, הוא עשוי לכלול משתמש משלו עם האפשרות Delete בתפריט, כך שאנשים יוכלו לציין הם סיים לצפות בתוכן שנוסף בעבר לאינדקס. כך מוחקים נראה ב-Chrome 80:
כשמישהו בוחר באפשרות הזו בתפריט, קובץ השירות (service worker) של אפליקציית האינטרנט יקבל
אירוע contentdelete
. הטיפול באירוע הזה הוא אופציונלי, אבל הוא מספק
הזדמנות ל-Service Worker "לפנות" תוכן, כמו מדיה שנשמרה במטמון באופן מקומי
הקבצים האלה, שמישהו ציין שהם מסיימים.
אתה לא צריך להתקשר אל registration.index.delete()
בתוך
handler של contentdelete
; אם האירוע הופעל, האינדקס הרלוונטי
כבר בוצעה מחיקה על ידי הדפדפן.
self.addEventListener('contentdelete', (event) => {
// event.id will correspond to the id value used
// when the indexed content was added.
// Use that value to determine what content, if any,
// to delete from wherever your app stores it—usually
// the Cache Storage API or perhaps IndexedDB.
});
משוב על עיצוב ה-API
האם יש משהו ב-API שגוי או לא פועל כצפוי? או האם יש חלקים חסרים שצריך ליישם כדי ליישם את הרעיון?
מפרסמים מידע על בעיה במאגר GitHub של הסבר על Content Indexing API או כותבים משוב לבעיה קיימת.
נתקלתם בבעיה בהטמעה?
מצאת באג בהטמעה של Chrome?
דווחו על באג בכתובת https://new.crbug.com. כלול כמה שיותר
פרטו כמה שאפשר, הוראות פשוטות לשחזור והגדרת רכיבים
אל Blink>ContentIndexing
.
אתם מתכננים להשתמש ב-API?
רוצים להשתמש ב-Content Indexing API באפליקציית האינטרנט שלכם? התמיכה הציבורית שלך עוזר ל-Chrome לתעדף תכונות, ומראה לספקי דפדפנים אחרים עד כמה זה קריטי כדי לתמוך בהם.
- שליחת ציוץ אל @ChromiumDev בעזרת hashtag
#ContentIndexingAPI
ופרטים על המיקום ועל אופן השימוש שלך בו.
מהן ההשלכות על אבטחה ופרטיות כתוצאה מהוספת תוכן לאינדקס?
כאן תמצאו תשובות סופקו בתגובה לשאלון בנושא אבטחה ופרטיות של W3C. אם אם יש לכם שאלות נוספות, תוכלו להתחיל דיון דרך מאגר GitHub של הפרויקט.
תמונה ראשית (Hero) של מקסימים קחרליצקי בסרטון Unbounce.