הגדרת תקציבי ביצועים באמצעות Webpack

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

כדי לראות איך זה עובד, הנה אפליקציה שמספרת את הימים שנותרו עד לשנה החדשה. הוא מבוסס על React ו-moment.js. (בדומה לאפליקציות בעולם האמיתי, שמסתמכות יותר ויותר על מסגרות וספריות. 😉)

אפליקציה שמספרת את מספר הימים שנותרו עד לראש השנה האזרחית

מדידה

סדנת הקוד הזו כבר מכילה את האפליקציה עם webpack.

  1. לוחצים על Remix to Edit כדי לאפשר עריכה של הפרויקט.
  2. לוחצים על Terminal (הערה: אם הלחצן Terminal לא מופיע, יכול להיות שתצטרכו להשתמש באפשרות 'מסך מלא').
  3. כדי לקבל רשימה של הנכסים והגדלים שלהם לפי צבעים, מקלידים webpack במסוף.
webpack

החבילה הראשית מודגשת בצהוב כי היא גדולה מ-244KB‏ (250KB).

פלט של Webpack שמוצג בו גודל החבילה של 323KB
Webpack הזהיר על חבילת JS גדולה מדי ⚠️

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

אזהרה מ-Webpack על כך שהנכס חורג ממגבלת הגודל המומלצת
Webpack הזהיר אתכם על חבילת JS גדולה מדי ⚠️

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

המלצה לאופטימיזציית הביצועים של Webpack
המלצה לאופטימיזציה של ביצועי חבילת ה-Webpack 💁

הגדרת תקציב ביצועים בהתאמה אישית

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

בהדגמה הפשוטה הזו, כדאי להיות שמרניים יותר ולהגדיר את התקציב ל-100KB (97.7KiB). ב-webpack.config.js, מוסיפים את הפרטים הבאים:

module.exports = {
  //...
  performance: {
    maxAssetSize: 100000,
    maxEntrypointSize: 100000,
    hints: "warning"
  }
};

תקציב הביצועים החדש מוגדר בבייטים:

  • 100,000 בייטים לנכסים ספציפיים (maxAssetSize)
  • 100,000 בייטים לנקודת הכניסה (maxEntrypointSize)

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

הערכים האפשריים של hints הם:

  1. warning (ברירת המחדל): תוצג הודעת אזהרה צהובה, אבל ה-build יעבור. מומלץ להשתמש באפשרות הזו בסביבות פיתוח.
  2. error: מוצגת הודעת שגיאה בצבע אדום, אבל ה-build עדיין עובר. ההגדרה הזו מומלצת לגרסאות build בסביבת הייצור.
  3. false: לא מוצגות אזהרות או שגיאות.
שגיאת ביצועים ב-Webpack בגופן אדום
טיפ לגבי ביצועי Webpack: 'error' 🚨

אופטימיזציה

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

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

בעולם האמיתי, בדרך כלל קשה להחליף מסגרות גדולות בצד הלקוח, ולכן חשוב להשתמש בהן בחוכמה. אחרי קצת מחקר, בדרך כלל אפשר למצוא חלופות קטנות יותר לספריות פופולריות שמבצעות את המשימה באותה מידה (date-fns היא חלופה טובה ל-moment.js). לפעמים עדיף לא להשתמש בכלל בספרייה או בפלטפורמה אם יש להן השפעה משמעותית על הביצועים.

הסרת קוד שלא בשימוש היא דרך טובה לבצע אופטימיזציה של אפליקציות שכוללות ספריות גדולות של צד שלישי. במדריך להסרת קוד שלא נעשה בו שימוש יש הסבר מפורט על התהליך הזה, ויש דרך מהירה לשכתב את קוד הספירה לאחור בלי להשתמש ב-example.js.

בקובץ app/components/Countdown.jsx מסירים את:

const today = moment();
const yearEnd = moment().endOf('year');
const daysLeft = yearEnd.diff(today, 'days');

ומוחקים את השורה הבאה:

const moment = require('moment');

צריך קצת מתמטיות, אבל אפשר ליצור את אותה ספירה לאחור גם ב-JavaScript וניל:

const today = new Date();
const year = today.getFullYear();
const yearEnd = new Date(year,11,31); //months are zero indexed in JS
const timeDiff = Math.abs(yearEnd.getTime() - today.getTime());
const daysLeft = Math.ceil(timeDiff / (1000 * 3600 * 24));

עכשיו מסירים את moment.js מ-package.json ומריצים שוב את webpack במסוף כדי ליצור את החבילה האופטימיזציה.

הנה! חלוקת נפח של 223KiB (230KB) והאפליקציה עברה את התקציב.🎉

הפלט של גודל החבילה של Webpack אחרי האופטימיזציה הוא 97.7KB

מעקב

כדי להגדיר תקציב ביצועים ב-webpack צריך רק כמה שורות קוד, ובמקרה כזה תוצג אזהרה אם אי פעם תוסיפו תלות גדולה. יש פתגם שאומר "מה שלא רואים לא זוכרים", אבל webpack יכול לוודא שתמיד תדעו מה ההשלכות על הביצועים.