אופטימיזציית באנדל: webpack-bundle-analyzer ו-source-map-explorer

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

פיתוח ותחזוקה של כל סוגי האתרים:

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

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
אופטימיזציית באנדל: webpack-bundle-analyzer ו-source-map-explorer
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

Bundle analyzer: נמצא את הסיבה לנפיחות ה-bundle

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

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

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

webpack-bundle-analyzer ו-source-map-explorer מסתכלים על המשימה משני צדדים: הראשון מציג את מבנה ה-chunks הבנויים ואת הקשרים ביניהם, השני פורש קובץ מוכן בחזרה למודולי המקור לפי מפות קוד. יחד הם מפרידים תלות שהתנפחה מהלוגיקה שלכם עצמכם, ובדרך גם מאתרים כפילות.

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

מה נותנת אופטימיזציית bundle: מהירות, המרה, תמיכה

אופטימיזציית bundle מתחילה בתשובה לשאלה מה בדיוק יוצא לדפדפן. כלים כמו bundle analyzer מציגים עץ מודולים ואת המשקל של כל ענף, ולכן ההחלטות מתקבלות לפי מספרים: היכן יש כפילות תלויות, היכן מחוברת ספרייה שלמה בשביל פונקציה אחת, ומה אינו בשימוש בגרסת הפרודקשן.

מה רואה הלקוח: מהירות, Core Web Vitals, המרה

מסירים כפילויות תלויות, מפצלים קוד לפי נתיבים, את מה שנדרש לעיתים רחוקות מוציאים לחתיכות נפרדות וטוענים לפי דרישה. נפח הקבצים המועברים יורד פי 1.5–3, הרינדור הראשון במובייל מתקצר ב-30–60%, ו-Core Web Vitals עוברים לאזור הירוק במקום להתאזן על הגבול.

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

מה רואה הצוות: שרת ותמיכה

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

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

שיטות לניתוח ואופטימיזציה של bundle: השוואה

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

ניתוח חזותי של הבנייה

webpack-bundle-analyzer קורא סטטיסטיקות בנייה ומצייר היררכיה chunk → module → dependency: זו דרך מהירה להבין למה ה-bundle גדל לאחר שינוי מסוים. המגבלה — המפה משקפת את המצב לפני האופטימיזציה הסופית, וקוד שנחתך ב-tree shaking עדיין נראה בה כמיותר.

אפשרות מתי מתאימה מגבלות
מפה חזותית של הבנייה בדיקה שגרתית לאחר שחרורים, איתור תלויות גדולות המצב לפני האופטימיזציה הסופית: קוד שנחתך נראה כמיותר
ניתוח מפת המקור פירוק בניית הפרודקשן: מה הועבר למשתמש נדרשות source maps תקינות, מבנה ה-chunks לא נראה
ביקורת תלויות ידנית חשד לכפילויות גרסאות וחבילות טרנזיטיביות כבדות איטי, בלי אוטומציה בבנייה לא מתרחב

מפת המקור וביקורת תלויות

source-map-explorer מחשב את התרומה של כל מודול מקור לארטיפקט המוכן — רק כך רואים שהסרת קוד שאינו בשימוש באמת עבדה. ביקורת תלויות ידנית מכסה את השאר: מעבר על עץ החבילות חושף כמה גרסאות של אותה ספרייה ומודולים טרנזיטיביים שמושכים אחריהם את כל החבילה.

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

איך אנחנו מבצעים אופטימיזציה של bundle: שלבי העבודה

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

ביקורת ותוכנית אופטימיזציה

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

לאחר מכן בונים מפת תלויות דרך bundle analyzer ומצליבים אותה עם source-map-explorer — השני מציג מודולי מקור, ולא רק חבילות, ודווקא על הפער הזה צפות כפילויות של גרסאות של אותה ספרייה. תוכנית האופטימיזציה היא רשימת תיקונים, ממוינת לפי כמה כל אחד מסיר מהמסלול הקריטי של הטעינה.

  1. ביקורת bundle: מחפשים כפילויות, קוד מת וספריות שמחוברות בשלמותן בשביל פונקציה אחת.
  2. תיעדוף: ממיינים את הממצאים לפי אפקט ועלות התיקון — לתוכנית נכנס מה שנותן תוצאה מדידה.
  3. יישום: מחלקים את הבנייה לפרגמנטים, מעבירים מודולים כבדים לטעינה נדחית, מחליפים תלויות גדולות ללא הצדקה.
  4. בקרה צעד-אחר-צעד: לאחר כל תיקון מצליבים מדדים עם נקודת ההתחלה ומחזירים אחורה מה שלא הסיר את הרגרסיה.
  5. אימות התוצאה: הרצה בסביבת בדיקות והשוואת לפני/אחרי לפי גודל הפרגמנטים והזמן עד לרינדור הראשון.
  6. מסירה: כללים בקונפיגורציה וספים בבדיקות הבנייה, כדי שהגודל לא יתפח בחזרה.

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

מה מקבלים לידיים לאחר האופטימיזציה

לאחר האופטימיזציה נשאר לצוות לא "נהיה מהיר יותר", אלא סט ארטיפקטים שלפיהם אפשר לבדוק ולשחזר את מצב הבנייה. דוח ה-bundle ומפת התלויות נמצאים לצד הקוד, הקונפיגורציה מתוארת במילים, וכללי התחזוקה מעוגנים בנוהל — התוצאה חיה יותר משחרור אחד ולא מתפרקת בתיקונים הבאים.

מה נשאר בפרויקט

  • דוח bundle — צילומי bundle analyzer לפני ואחרי התיקונים: נפח המודולים, הרכב הטעינה ההתחלתית, החתיכות שהוצאו.
  • מפת תלויות — גרף קשרים עם סימון כפילויות וספריות שנמשכות בשתי גרסאות בבת אחת.
  • קונפיגורציית בנייה מעודכנת — כללי פיצול לחתיכות, דחיסה, הסרת קוד שאינו בשימוש, נקודות טעינה דינמית.
  • הערות לפרמטרים — מה נותן כל מצב ומה יישבר אם מסירים אותו.

מה מעגנים בנוהל

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

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

מקרה בוחן: צמצום bundle והאצת הטעינה

הפרויקט — חנות מקוונת עם קטלוג של כמה אלפי פריטים. ה-bundle גדל משחרור לשחרור: למסך הראשון יצאו כ-2.9 MB של קוד דחוס, הזמן עד לאינטראקטיביות במכשיר מובייל ממוצע החזיק סביב 6 שניות, וחלק מהמבקרים עזבו בלי להמתין לרינדור הקטלוג.

מה הראה הפירוק

בנינו מפת bundle דרך webpack-bundle-analyzer והצלבנו אותה עם מפות המקור דרך source-map-explorer. התמונה התגלתה כטיפוסית: שתי עותקים של ספריית הניתוב, חבילת תאריכים שלמה בשביל שתי פונקציות עיצוב, וכל הקטלוג עם הפילטרים ב-chunk אחד יחד עם קוד העמוד הראשי. לפי קוד המקור נראה שקוד בלתי נגיש תופס כשליש מהנפח הכולל.

מה שינו

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

כתוצאה מכך ה-bundle צומצם מ-2.9 MB ל-980 KB, המסלול הקריטי של המסך הראשון — ל-480 KB, הזמן עד לאינטראקטיביות במובייל ירד מ-6 ל-2 שניות, ושיעור הנטישות בשלב הטעינה הצטמצם פי שלושה. "ההמרה עלתה כמעט מיד, והצוות הפסיק לחשוש להוסיף בלוקים חדשים", מציין המנהל הטכני של הלקוח.

Bundle analyzer: במה הוא שונה משיטות ניתוח אחרות?

Bundle analyzer עובד לא עם קוד המקור, אלא עם הארטיפקט הבנוי: הוא מפרק את מפת המודולים בתוך ה-chunks ומראה מה בדיוק מכביד על הבנייה. רואים אילו ספריות נכנסו לכמה chunks בבת אחת, היכן מודול אחד משוכפל תחת נתיבים שונים וכמה שוקל כל חלק לפני ואחרי דחיסה. זו תשובה לשאלה "ממה מורכב מה שהדפדפן מוריד".

ניתוח סטטי מסתכל לכיוון אחר — על קוד המקור ועל גרף הייבואים לפני הבנייה. הוא מאתר תלויות שמחוברות בשביל פונקציה אחת, ייצואים שאף אחד לא קורא להם, ושרשראות שמושכות אחריהן חצי מעץ המודולים. בארטיפקט קוד כזה כבר ממוזג עם העובד, ולכן bundle analyzer יציג את העקבות, אבל לא את הסיבה.

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

השוואת השיטות מסתכמת בשאלות שונות: ניתוח bundle — "מה מונח ב-chunk", סטטיקה — "למה זה הגיע לשם", פרופיילינג — "מה מזה באמת כואב". מתחילים בפרופיילינג בעקבות תלונה על טעינה איטית, bundle analyzer מאשר את ההרכב והנפח, ניתוח סטטי מביא לתיקון בקוד המקור. אף שלב לא מחליף את האחרים — הפירוק הולך כשרשרת, ולא בכלי אחד.

שאלות טכניות נפוצות על אופטימיזציית bundle

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

האם תיקוני הבנייה לא ישברו את השחרור הנוכחי?

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

מתי ייראה האפקט?

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

מה לעשות עם מודולים דינמיים?

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

האם צריך לפרסם מפות קוד בפרודקשן?

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

נדון באופטימיזציה של ה-bundle שלכם

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

בשיחה אנחנו:

  • ניקח מדדי בנייה נוכחיים: משקל הקובץ ההתחלתי, הזמן עד למסך הראשון, מספר החלקים הנפרדים;
  • נריץ bundle analyzer ו-source-map-explorer על הענף העדכני ונפרק את מפת התלויות — היכן כפילויות, היכן ספריות כבדות שמחוברות בשביל פונקציה אחת;
  • נסתכל על נתיבים ונקודות כניסה: מה נטען מיד, ומה סביר לדחות עד לפעולה הראשונה של המשתמש;
  • נבדוק את הקונפיגורציה: פיצול לחלקים, שימוש חוזר במודולים משותפים, מטמון בצד הלקוח;
  • נבהיר אילוצים: תמיכה בדפדפנים ישנים, דרישות לחזרה לאחור, בדיקות חובה לפני העלאה;
  • נתאם עדיפויות ונעגן תוכנית עבודה עם אפקט צפוי בגדלים מדידים.

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