חילוץ והטבעה של CSS קריטי באמצעות קריטי

מיליקה מיהאג'ליג'ה
מיליקה מיהאג'ליג'ה

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

גלריית הגלידה הרספונסיבית הזו בנויה על Bootstrap. ספריות ממשק משתמש כמו Bootstrap מזרזות את הפיתוח, אבל במקרים רבים הדבר בא על חשבון CSS נפוח ומיותר שעלול להאט את זמני הטעינה. גרסת Bootstrap 4 בנפח 187KB, וממשק המשתמש הסמנטי, ספרייה נוספת של ממשק המשתמש, הוא בנפח עצום של 730KB לא דחוס. גם לאחר הקטנה ועיבוד של gzip, Botstrap עדיין משקל של כ-20KB, הרבה יותר מהסף של 14KB לטיסה הלוך ושוב הראשונה.

קריטי הוא כלי שמחלץ, מקטין וממקם CSS בחלק העליון והקבוע. כך ניתן לעבד תוכן בחלק העליון והקבוע בהקדם האפשרי, גם אם שירות ה-CSS של חלקים אחרים בדף עדיין לא נטען. ב-Codelab זה תלמד כיצד להשתמש במודול npm של Critical.

מדידה

  • כדי לראות תצוגה מקדימה של האתר, מקישים על View App ואז על Fullscreen מסך מלא.

כדי להריץ ביקורת של Lighthouse באתר הזה:

  1. לוחצים על 'Control+Shift+J' (או 'Command+Option+J' ב-Mac) כדי לפתוח את כלי הפיתוח.
  2. לוחצים על הכרטיסייה Lighthouse.
  3. לוחצים על נייד.
  4. מסמנים את התיבה ביצועים.
  5. מוחקים את שאר תיבות הסימון בקטע Audits (ביקורות).
  6. לוחצים על Simulated Fast 3G, 4x CPU Slowdown.
  7. מסמנים את התיבה פינוי נפח אחסון. אם בוחרים באפשרות הזו, מערכת Lighthouse לא תטען משאבים מהמטמון, במטרה לדמות את חוויית המשתמש בדף בפעם הראשונה.
  8. לוחצים על Run Audits.

חלונית הביקורת של Chrome DevTools, מופעלת על ידי Lighthouse

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

ביקורת Lighthouse שמציגה ציון ביצועים של 84 ו-3 שניות של FCP, וצפייה ברצועת תמונות של טעינת האפליקציה

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

בקטע 'הזדמנויות' שב-Lighthouse צריך למצוא פירוט של 'הסרת משאבים שחוסמים עיבוד'

אופטימיזציה

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

כדי לזרז את העניינים, Critical כבר מותקן וקובץ תצורה ריק כלול ב-Codelab.

בקובץ התצורה critical.js, מוסיפים הפניה ל-Critical ואז מפעילים את הפונקציה critical.generate(). הפונקציה הזו מקבלת אובייקט שמכיל את התצורה.

const critical = require('critical');

critical.generate({
    // configuration
},(err, output) => {
  if (err) {
    console.error(err);
  } else if (output) {
    console.log('Generated critical CSS');
  }
});

לא חובה לטפל בשגיאות, אבל זו דרך קלה למדוד את הצלחת הפעולה במסוף.

הגדרה של קריטי

הטבלה הבאה מכילה כמה אפשרויות קריטיות ושימושיות. אתם יכולים לראות את כל האפשרויות הזמינות ב-GitHub.

אפשרות סוג הסבר
base מחרוזת הספרייה הבסיסית של הקבצים שלכם.
src מחרוזת קובץ מקור HTML.
dest מחרוזת היעד של קובץ הפלט. אם הקידוד הוא של CSS, קובץ הפלט הוא HTML. אם לא, הפלט הוא קובץ CSS.
width, height מספרים הרוחב והגובה של אזור התצוגה בפיקסלים.
dimensions מערך מכילה אובייקטים עם מאפיינים של רוחב וגובה. האובייקטים האלה מייצגים את אזורי התצוגה שאליהם רוצים לטרגט באמצעות CSS בחלק העליון והקבוע. אם יש לכם שאילתות מדיה ב-CSS, הן מאפשרות לכם ליצור CSS חיוני שמכסה כמה גדלים של אזורי תצוגה.
inline boolean אם המדיניות מוגדרת כ-True, ה-CSS הקריטי שנוצר ימוקם בתוך קובץ מקור ה-HTML.
minify boolean אם המדיניות מוגדרת כ-True, המערכת מצמצמת את ה-CSS הקריטי שנוצר. ניתן להשמיט אותו כשמחלצים תוכן CSS קריטי לרזולוציות מרובות מאחר ש-Critical מקטין אותו באופן אוטומטי כדי למנוע הכללה של כלל כפול.

בהמשך מוצגת דוגמה להגדרה לחילוץ CSS קריטי עבור מספר רזולוציות. אפשר להוסיף אותו ל-critical.js או לשחק קצת ולשנות את האפשרויות.

critical.generate({
  base: 'public/',
  src: './index.html',
  dest: './index.html',
  inline: true,
  dimensions: [
    {
      height: 500,
      width: 300,
    },
    {
      height: 720,
      width: 1280,
    },
  ]
}, (err, output) => {
  if (err) {
    console.error(err);
  } else if (output) {
    console.log('Generated critical CSS');
  }
});

בדוגמה הזו, index.html הוא גם קובץ המקור וגם קובץ היעד כי האפשרות inline מוגדרת כ-True. קריטי קורא תחילה את קובץ המקור של ה-HTML, מחלץ CSS קריטי ולאחר מכן מחליף את index.html ב-CSS קריטי המופיע בתוך <head>.

למערך dimensions צוינו שני גדלים של אזורי תצוגה: 300 x 500 למסכים קטנים נוספים ו- 1280 x 720 למסכים רגילים של מחשבים ניידים.

האפשרות minify לא מופיעה מפני ששדה 'קריטי' מקטין באופן אוטומטי את ה-CSS שחולץ כאשר צוינו גדלים מרובים של אזורי תצוגה.

הפעלה קריטית

הוסף 'קריטי' לסקריפטים ב-package.json:

scripts: {
  "start": "node server.js",
  "critical": "node critical.js"
}
  1. לוחצים על טרמינל (הערה: אם הלחצן 'מסוף' לא מוצג, ייתכן שתצטרכו להשתמש באפשרות 'מסך מלא').

כדי ליצור CSS קריטי, מריצים במסוף:

npm run critical
refresh
הודעת ההצלחה שמוצגת במסוף היא &#39;נוצר CSS חיוני&#39;
הודעת ההצלחה במסוף

עכשיו בתג <head> של index.html, שירות ה-CSS הקריטי שנוצר מוצמד בין תגי <style>, ואחריו מופיע סקריפט שטוען את שאר ה-CSS באופן אסינכרוני.

index.html עם CSS קריטי טמון
רכיבי CSS קריטיים מסודרים

מדידה חוזרת

כדי להריץ שוב ביקורת ביצועים של Lighthouse, צריך לבצע את השלבים מתחילת ה-Codelab. התוצאות שיתקבלו ייראו כך:

ביקורת של Lighthouse שמציגה ציון ביצועים של 100, FCP 0.9 שניות ותצוגה משופרת של רצועת תמונות של טעינת האפליקציה