תחילת העבודה עם Progressive Web Apps

בזמן האחרון התנהלו דיונים רבים בנושא Progressive Web Apps. עדיין מדובר במודל חדש יחסית, אבל העקרונות שלו יכולים לשפר אפליקציות שנוצרו באמצעות Vanilla JS, ‏ React, ‏ Polymer, ‏ Angular או כל מסגרת אחרת. בפוסט הזה אציג סיכום של כמה אפשרויות ואפליקציות למעקב שיעזרו לכם להתחיל ליצור אפליקציית Progressive Web משלכם כבר היום.

מהי אפליקציית Progressive Web App?

חשוב לזכור ש-Progressive Web Apps פועלות בכל מקום, אבל הן עובדות בצורה יעילה יותר בדפדפנים מודרניים. שיפור הדרגתי הוא עמוד השדרה של המודל.

אהרון גוסטפסון (Aaron Gustafson) השווה את שיפור הדרגתי לממתק M&M עם בוטנים. האגוז הוא התוכן, ציפוי השוקולד הוא שכבת התצוגה ו-JavaScript הוא מעטפת הממתק הקשה. הצבע של השכבה הזו עשוי להשתנות, והחוויה עשויה להשתנות בהתאם ליכולות של הדפדפן שבו היא פועלת.

אפשר לחשוב על מעטפת הממתק כמקום שבו יכולות להתגורר תכונות רבות של Progressive Web App. אלה חוויות שמשלבות את הטוב שבאינטרנט ואת הטוב שבאפליקציות. הן מועילות למשתמשים כבר מהביקור הראשון בכרטיסייה בדפדפן, ללא צורך בהתקנה.

ככל שהמשתמש יוצר קשר עם האפליקציות האלה באמצעות שימוש חוזר, הן הופכות את החוויה לעוד יותר טובה – הן נטענות מהר מאוד בחיבורי רשת איטיים (בזכות service worker), שולחות התראות דחיפה רלוונטיות ומוצגות בסמלים ברמה הגבוהה ביותר במסך הבית של המשתמש, כך שניתן לטעון אותן כחוויית שימוש באפליקציה במסך מלא. בנוסף, הם יכולים להשתמש בבאנרים חכמים להתקנת אפליקציות אינטרנט.

מודעות באנר להתקנת אפליקציות אינטרנט לצורך יצירת עניין, הפעלה ממסך הבית של המשתמש, מסך הפתיחה ב-Chrome ל-Android, עבודה אופליין עם service worker

אפליקציות Progressive Web App הן

  • מתקדמות – הן פועלות לכל משתמש, ללא קשר לדפדפן שבחר, כי הן מבוססות על שיפורים מתקדמים (progressive enhancement) כעמודת התווך של דייר.
  • רספונסיבי – מתאים לכל פורמט, למחשב, לנייד, לטאבלט או לכל מכשיר עתידי.
  • ללא תלות בחיבור – שירותים משופרים עם Service Workers, שיכולים לפעול אופליין או ברשתות באיכות נמוכה.
  • כמו אפליקציה – שימוש במודל של פגז האפליקציה כדי לספק ניווטים ואינטראקציות בסגנון אפליקציה.
  • עדכני – תמיד מעודכן בזכות תהליך העדכון של שירות ה-worker.
  • בטוח – מוצג באמצעות TLS כדי למנוע ציטוטים ולוודא שהתוכן לא ניזוק.
  • גלויה לכולם – הן מזוהות כ'אפליקציות' בזכות מניפסט של W3C והיקף הרישום של שירות העבודה (service worker), שמאפשר למנועי חיפוש למצוא אותן.
  • אפשרות לעורר עניין מחדש – קל לעורר עניין מחדש באמצעות תכונות כמו התראות דחיפה.
  • ניתנות להתקנה – מאפשרות למשתמשים 'לשמור' את האפליקציות השימושיות ביותר במסך הבית, בלי הטרחה של חנות אפליקציות.
  • ניתן לקישור – אפשר לשתף בקלות באמצעות כתובת URL, בלי צורך בהתקנה מורכבת.

אפליקציות Progressive Web App הן לא ייחודיות ל-Chrome ל-Android. בהמשך אפשר לראות את אפליקציית Progressive Web App של Pokedex שפועלת ב-Firefox ל-Android (בטא), עם תכונות מוקדמות של הוספה למסך הבית ואחסון ב-cache של שירותי עבודה (service workers) שפועלות בצורה תקינה.

אפליקציות Progressive Web App שפועלות ב-Firefox ל-Android

אחד מהיתרונות של המודל הזה הוא שאפשר לפתוח את התכונות בהדרגה, ככל שמפיצי הדפדפנים מספקים תמיכה טובה יותר בהן. כמובן שאפליקציות Progressive Web App כמו Pokedex פועלות מצוין גם ב-Opera ל-Android, עם כמה הבדלים בולטים בהטמעה:

אפליקציות Progressive Web App שפועלות ב-Opera ל-Android

כדי להבין לעומק את הנושא של אפליקציות Progressive Web, מומלץ לקרוא את פוסט הבלוג המקורי של Alex Russell, שבו הוא מציג אותן. Paul Kinlan הקים גם תג Stack Overflow שימושי מאוד לאפליקציות אינטרנט מתקדמות, ששווה לבדוק.

עקרונות

מניפסט של אפליקציית אינטרנט

המניפסט מאפשר לאפליקציית האינטרנט שלכם להיראות יותר כמו אפליקציה מקורית במסך הבית של המשתמש. הוא מאפשר להפעיל את האפליקציה במצב מסך מלא (בלי סרגל כתובות URL), מספק שליטה בכיוון המסך, ובגרסאות האחרונות של Chrome ל-Android תומך בהגדרת מסך הפתיחה וצבע העיצוב של סרגל הכתובות. הוא משמש גם להגדרת קבוצה של סמלים לפי גודל וצפיפות, שמיועדים לשימוש במסך הפתיחה ובסמל של מסך הבית שצוינו למעלה.

הוספה למסך הבית, הפעלה ממסך הבית וחוויות שימוש כמו באפליקציות במסך מלא.

קובץ מניפסט לדוגמה זמין ב-Web Starter Kit וב-Google Chrome samples. Bruce Lawson כתב כלי ליצירת מניפסט, ו-Mounir Lamouri כתב גם כלי נוח לאימות מניפסט אינטרנט ששווה לבדוק.

בפרויקטים האישיים שלי, אני מסתמך על realfavicongenerator כדי ליצור סמלים בגודל הנכון גם למניפסט של אפליקציית האינטרנט וגם לשימוש ב-iOS, במחשב וכו'. מודול Node‏ favicons יכול גם הוא ליצור פלט דומה כחלק מתהליך ה-build.

דפדפנים מבוססי-Chromium (Chrome,‏ Opera וכו') תומכים כיום ב-manifests של אפליקציות אינטרנט. ב-Firefox מתפתחת תמיכה באופן פעיל, וב-Edge הם מופיעים כבבדיקה. עדיין לא פורסמו אותות ציבוריים בנושא כוונות ההטמעה של התכונה ב-WebKit/Safari.

פרטים נוספים זמינים במאמר אפליקציות אינטרנט להתקנה באמצעות מניפסט של אפליקציית אינטרנט ב-Chrome ל-Android בנושא Web Fundamentals.

באנר 'הוספה למסך הבית'

כבר זמן מה יש ב-Chrome ל-Android תמיכה בהוספת האתר למסך הבית, אבל בגרסאות האחרונות יש גם תמיכה בהצעות יזום להוספת אתרים באמצעות באנרים מקומיים להתקנת אפליקציות אינטרנט.

אפליקציית הדגמה של תזכורות הקול שמוצגת בה בקשה להתקנת אפליקציית אינטרנט ב-Chrome ל-Android

כדי שההנחיות להתקנת האפליקציה יוצגו, האפליקציה שלכם צריכה:

  • יש לכם מניפסט תקין של אפליקציית אינטרנט
  • להציג את הדפים באמצעות HTTPS (לקבלת אישור בחינם, אפשר להיעזר ב-letsencrypt)
  • יש לכם קובץ שירות (service worker) רשום תקין
  • צריך לבקר פעמיים, עם מרווח של 5 דקות לפחות בין הביקורים

יש כמה דוגמאות למודעות באנר לקידום התקנת אפליקציות, החל ממודעות באנר בסיסיות ועד לתרחישי שימוש מורכבים יותר, כמו הצגת אפליקציות קשורות.

קובץ שירות (service worker) לשמירה בקובץ שמור במצב אופליין

קובץ שירות (service worker) הוא סקריפט שפועל ברקע, בנפרד מדף האינטרנט. הוא מגיב לאירועים, כולל בקשות רשת שנשלחות מדפים שהוא מציג. משך החיים של קובץ שירות קצר בכוונה.

הוא מתעורר כשמתקבל אירוע, ופועל רק כל עוד הוא צריך לעבד אותו. באמצעות Service Worker אפשר להשתמש ב-Cache API כדי לשמור משאבים במטמון, ואפשר להשתמש בו כדי לספק למשתמשים חוויית שימוש אופליין.

שירותי עובדים הם כלי יעיל לשמירת נתונים במטמון אופליין, אבל הם גם מציעים שיפור משמעותי בביצועים באמצעות טעינה מיידית של ביקורים חוזרים באתר או באפליקציית האינטרנט. אפשר לשמור במטמון את מעטפת האפליקציה כדי שהיא תפעל אופליין, וליישב את התוכן שלה באמצעות JavaScript.

שמירת מעטפת האפליקציה במטמון של קובץ השירות (service worker), שמאפשרת טעינה שלה ללא חיבור לרשת

קבוצה מקיפה של דוגמאות לשירותי עובדים זמינה ב-Google Chrome Samples. ספר הבישול אופליין של ג'ייק ארקדיל הוא חובה לקריאה, ואם אתם חדשים בנושא שירותי העבודה, מומלץ מאוד לנסות את המדריך של פול קילן לאפליקציית האינטרנט הראשונה שלכם לעבודה אופליין.

הצוות שלנו גם שומר על מספר כלי עזר ו-build של שירותי עובדים, שאנחנו מוצאים שימושיים לצמצום העלויות הנלוות להגדרת שירותי עובדים. הן מפורטות בספריות של קובצי שירות (service worker). שתי האפשרויות העיקריות הן:

  • sw-precache: כלי לזמן ה-build שיוצר סקריפט של service worker ששימושי לאחסון מראש של המעטפת של אפליקציית האינטרנט
  • sw-toolbox: ספרייה שמספקת שמירת מטמון בסביבת זמן ריצה למשאבים שבהם משתמשים לעיתים רחוקות

Jeff Posnick כתב מדריך קצר בנושא sw-precache שנקרא אופליין קודם, מהר, עם המודול sw-precache וגם codelab באותו נושא. כדאי לעיין בהם.

בדפדפנים Chrome,‏ Opera ו-Firefox נוספה תמיכה ב-Service Worker, וב-Edge יש אותות ציבוריים חיוביים לגבי העניין בתכונה. ב-Safari הוזכר בקצרה עניין בנושא הזה דרך תוכנית לחמש שנים שהציע מהנדס אחד.

התראות כדי לעורר עניין מחדש

בעצם, אפשר ליצור אפליקציות אינטרנט שמשתמשים יכולים להשתמש בהן מחוץ לכרטיסייה. הם יכולים לסגור את הדפדפן, ואפילו לא צריכים להשתמש באופן פעיל באפליקציית האינטרנט כדי להיחשף לחוויית השימוש שלכם. כדי להשתמש בתכונה הזו צריך גם קובץ שירות (service worker) וגם מניפסט של אפליקציית אינטרנט, שמבוסס על חלק מהתכונות שצוינו למעלה.

Push API יושם ב-Chrome, נמצא בפיתוח ב-Firefox ובבדיקה ב-Edge. עדיין אין אותות ציבוריים מ-Safari לגבי הכוונה שלהם להטמיע את התכונה הזו.

התראות Push באינטרנט הפתוח הוא מבוא מקיף להגדרת התראות Push, מאת Matt Gaunt. בנוסף, codelab בנושא התראות Push זמין גם ב-Web Fundamentals.

התראות באינטרנט באתר לנייד של Facebook

אם אתם מעדיפים סרטונים, תוכלו לצפות במבוא של 6 דקות של מייקל ואן אווורקרק (Michael van Ouwerkerk) מצוות Chrome לגבי Push.

שילוב של תכונות מתקדמות

חשוב לזכור שחוויית המשתמש יכולה להיות ברמות שונות של מתיקות, בהתאם לדפדפן שבו משתמשים כדי להציג את אפליקציית האינטרנט. אתם שולטים בקליפה של הממתק.

כך אפשר גם להוסיף שכבות ל-Progressive Web App שלכם עם תכונות נוספות שצפויות להופיע בפלטפורמת האינטרנט, כמו סנכרון ברקע (לסנכרון נתונים עם שרת גם כשאפליקציית האינטרנט סגורה) ו-Web Bluetooth (לשיחה עם מכשירי Bluetooth מאפליקציית האינטרנט).

סנכרון הרקע בפעולה אחת הופעל ב-Chrome, ויש סרטון של אפליקציית Wikipedia אופליין ומאמר של Jake Archibald שממחישים את הפעולה שלו. François Beaufort פרסם גם כמה דוגמאות ל-Web Bluetooth, אם אתם רוצים לנסות את ממשק ה-API הזה.

התאמה למסגרות

אין שום דבר שימנע מכם להחיל את העקרונות שלמעלה על אפליקציה או מסגרת קיימת שבהן אתם משתמשים. כמה עקרונות נוספים שכדאי לזכור כשאתם יוצרים אפליקציית Progressive Web הם מודל הביצועים שמתמקד במשתמש RAIL ואנימציות שמבוססות על FLIP.

אני מקווה שבמהלך 2016 נראה יותר ויותר תבניות בסיסיות ופרויקטים ראשוניים שמוטמעת בהם תמיכה ב-Progressive Web Apps כתכונה ליבה. עד אז, מחסום ההוספה של התכונות האלה לאפליקציות שלכם לא גבוה במיוחד, ולדעתי כדאי מאוד להשקיע את המאמץ.

ארכיטקטורה

יש רמות שונות של 'השקעה מלאה' במודל Progressive Web App, אבל גישה נפוצה אחת היא תכנון האפליקציות סביב פגודה של אפליקציה. זו לא דרישת סף, אבל יש לכך כמה יתרונות.

הארכיטקטורה של פגז האפליקציה מעודדת שמירת פגז האפליקציה (ממשק המשתמש) במטמון כדי שהוא יפעל במצב אופליין ויוכל לאכלס את התוכן שלו באמצעות JavaScript. כך, בביקור חוזר, תוכלו להציג במסך פיקסלים משמעותיים במהירות רבה בלי העזרה של הרשת, גם אם התוכן שלכם מגיע ממנה בסופו של דבר. התוצאה היא שיפור משמעותי בביצועים.

פגישה ויזואלית של מעטפת האפליקציה, שמציגה פירוט של ממשק המשתמש של האפליקציה, כמו חלונית ההזזה ואזור התוכן הראשי

Jeremy Keith העיר לאחרונה שבמודל מהסוג הזה, אולי לא צריך להתייחס לעיבוד בצד השרת כאל חלופה, אלא כאל שיפור. זה משוב הוגן.

במודל של פגז האפליקציה, צריך להשתמש ברינדור בצד השרת כמה שיותר, וברינדור הדרגתי בצד הלקוח כתכונה משופרת, באותו אופן שבו אנחנו 'משפרים' את חוויית השימוש כשיש תמיכה ב-Service Worker. יש הרבה דרכים לעשות זאת.

ההמלצה שלי היא לקרוא את המאמר שלנו על הארכיטקטורה ולהעריך איך אפשר ליישם עקרונות דומים באפליקציה ובסטאק שלכם.

תבניות לתחילת העבודה

מעטפת אפליקציה

הצגת הקוד ב-GitHub

המאגר app-shell מכיל הטמעה כמעט מלאה של הארכיטקטורה של Application Shell. יש לו קצה עורפי שנכתב ב-Express.js וקצה חזיתי שנכתב ב-ES2015.

מכיוון שהקוד מכסה גם את החלקים של המודל בצד הלקוח וגם בצד השרת, ויש בו הרבה דברים, ייקח לכם קצת זמן להכיר את קוד המקור. זוהי נקודת ההתחלה המלאה ביותר שלנו כרגע ליצירת אפליקציות Progressive Web App. Docs יהיה המיקוד הבא שלנו בפרויקט הזה.

ערכת התחלה ל-Polymer

הצגת הקוד ב-GitHub

נקודת ההתחלה הרשמית של אפליקציות אינטרנט ב-Polymer תומכת בתכונות הבאות של Progressive Web App:

ערכת התחלה של Polymer שמציגה תכונות מובנות של אפליקציות Progressive Web App

בגרסה הנוכחית של PSK אין תמיכה בחלק מתבניות הביצועים המתקדמות יותר (למשל, מודל פגז האפליקציה, טעינה אסינכרנית) שקיימות בחלק מאפליקציות האינטרנט מסוג Progressive Polymer.

אנחנו שואפים להטמיע את התבניות האלה ב-PSK במהלך 2016, אבל אפשר למצוא ניסויים מוקדמים בנושא באפליקציית Zuperkulblog של Rob Dodson ובשיחה המעולה Polymer Perf Patterns של Eric Bidelman.

ערכת התחלה לאתרים

הצגת הקוד ב-GitHub

נקודת ההתחלה שלנו לפרויקטים חדשים של אפליקציות אינטרנט רגילות כוללת את התכונות הבאות של אפליקציות אינטרנט מתקדמות:

  • מניפסט של אפליקציית אינטרנט
  • מסך הפתיחה של Chrome ל-Android
  • העברה מראש למטמון של קובץ שירות (service worker) באמצעות sw-precache

אם אתם מעדיפים לעבוד עם JS/ES2015 רגילה ואתם לא יכולים להשתמש ב-Polymer, ערכת Web Starter Kit יכולה לשמש כנקודת עזר שתוכלו להשתמש בה שוב או לגנוב ממנה קטעי קוד.

אפליקציות Progressive Web App עם מסגרות ותבניות קיימות וגם בלי

חברי הקהילה כבר יצרו כמה אפליקציות אינטרנט מתקדמות בקוד פתוח, עם וגם בלי ספריות ו-frameworks של JS. אם אתם מחפשים השראה, המאגרים הבאים יכולים לשמש לכם כמקור מידע. בנוסף, הן אפליקציות ממש טובות.

אפליקציות Progressive Web App שמוטמעות באמצעות React, ‏ Polymer, ‏ Virtual DOM ו-AngularJS

JavaScript בסיסי

Polymer

React

  • iFixit מאת Jeff Posnick – נעשה שימוש ב-sw-precache לשמירת גרסת מטמון של מעטפת האפליקציה (תמונות)

Virtual-DOM

  • Pokedex מאת Nolan Lawson – אפליקציית Progressive Web App מצוינת שמשתמשת בגישה של 'כל מה שצריך לעשות ב-web worker' כדי לעזור ברינדור הדרגתי. (סקירה)

Angular.js

  • Timey.in מאת Kenneth Auchenberg – גם כאן נעשה שימוש ב-sw-precache לאחסון מראש של משאבים

הערות סיום

כפי שצוין, אפליקציות Progressive Web עדיין נמצאות בשלב מוקדם, אבל זהו זמן מרגש להתנסות בשיטות שמאחוריהן ולבדוק עד כמה הן מתאימות לאפליקציות האינטרנט שלכם.

Paul Kinlan מתכנן כרגע את ההנחיות של Web Fundamentals בנושא אפליקציות אינטרנט מתקדמות. אם יש לכם משוב לגבי תחומים שתרצו שנתייחס אליהם, אתם מוזמנים להגיב לשרשור הזה.

קריאה נוספת