WEBA

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

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

601 מילים22 עובדות אומתו

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

זה עובד.

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

מפת זמנים במקום ניחושים

עד היום, כשתהליך הבנייה ב-Astro הפך אטי, קשה היה לדעת מי האשם האמיתי: האם זה תוסף Vite כבד, עיבוד תחבירי של Markdown, אופטימיזציית תמונות מקומית או עמוד ספציפי שמתחבא בעומק האתר. בגרסה 7.4, פקודת astro build מקבלת את הדגל timings. כשהבנייה מסתיימת, הפלט בטרמינל מציג פירוט מדויק של שלבי הבנייה, תוספי Vite, זמני הדפים האיטיים ביותר לפי חציון ומאיון 95, ועיבוד נכסים דיגיטליים.

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

בדוגמה שמציג הצוות, קריאות רשת טוריות בתוך רכיב תגובות גרמו לעמודים להמתין פעמיים ברציפות לקריאות API חיצוניות. הפירוט של timings חשף מיד שהעמודים שמשתמשים בתבנית הזו נמשכים בין 296 ל-307 מילישניות לעומת 6 מילישניות בלבד לעמוד הבלוג הראשי. לפי ההכרזה הרשמית, הרצת הדגל מבודדת האם מקור ההאטה הוא ברינדור, בבאנדל או בעיבוד תמונות. ברגע שמזהים את הבעיה, מעבר לשליפה מקבילית ברמת הרכיב עשוי לחתוך את משך הרינדור בחצי בלי לגעת בשאר האתר.

התמונות עוברות מסלול נפרד

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

Astro 7.4 מפצלת את ההגדרה image.service לשני נתיבים נפרדים: build ו-runtime. שירות הבנייה מטפל בתמונות שמוטמעות בעמודים סטטיים, מעבד אותן מראש ומשמש גם בעת פיתוח מקומי. שירות הריצה מטפל בדפים שנוצרים לפי דרישה ובנקודת הקצה לתמונות בפרודקשן. הארכיטקטורה החדשה מאפשרת גם למתאם הרשמי של Cloudflare לעבד תמונות בעמודים סטטיים דרך אותו צינור עבודה רגיל של הפלטפורמה.

רינדור מקבילי עם תג מחיר

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

לא הייתי ממהר להפעיל את זה בשרת חלש.

כאן חייבים להזהיר: כל תהליכון עבודה נוסף מגדיל באופן ישיר את צריכת הזיכרון. אם שרתי ה-CI שלכם מוגבלים לחומרה בסיסית, רינדור מקבילי תוקפני יוביל במהירות לקריסות עקב מחסור בזיכרון (OOM). במקרים כאלה יש להגדיר ידנית את מספר העובדים בפרמטר workers. בנוסף, מי שמשתמש במתאם של Cloudflare כלל לא ייהנה מהיכולת הזו כרגע, מאחר שהוא מחזיק מנגנון רינדור מקדים משלו והמערכת פשוט תתעלם מהדגל ותרשום אזהרה בלוג.

הפניות מותאמות ורף גרסה חדש

באתרים סטטיים לחלוטין אין שרת שמחזיר כותרות הפניה מסוג HTTP Location, ולכן המערכת מייצרת עמודי HTML קטנים עם תגית מטא מתאימה. הדגל הניסיוני redirectPage מאפשר כעת ליצור קובץ ייעודי בנתיב src/pages/3xx.astro כדי לשלוט במבנה העמוד, בעיצוב ובהשהיה. עבור מפתחים בישראל שמנהלים אתרי שיווק ותיעוד רב-לשוניים, זו דרך מצוינת לייצר עמודי מעבר ממותגים עם תמיכה מלאה בכיווניות מימין לשמאל.

בנוסף, מפתחים שמגדירים שרתים עצמאיים באמצעות ספריות הפצה מקבלים את פונקציית notFound בתוך חבילת fetch, שמאפשרת להחזיר עמוד 404 מותאם במקום תשובה ריקה. ספקי פונטים מקבלים מנגנון אזהרה חדש על משקלים לא קיימים. כדי ליהנות מכל זה תצטרכו לשדרג קודם את תשתית השרת: רף המינימום עבור סביבת הריצה עלה לגרסת Node.js 22.22.0. אם השרת שלכם עדיין תקוע על גרסה ישנה יותר, Astro פשוט תסרב לפעול.

השוואת הכלים לקיצור זמני בילד ב-Astro 7.4
יכולתמנגנון פעולההשפעה על ה-CIתנאי מקדים או סיכון
דגל timingsאיסוף נתוני משך ריצה של שלבי בנייה, פלאגינים ועמודיםזיהוי מדויק של צווארי בקבוק ללא צורך בניחושיםאין, כלי דיאגנוסטיקה בלבד
הפרדת שירותי תמונותפיצול בין Sharp בבנייה לבין CDN בריצהחוסך קריאות רשת מיותרות בזמן עיבוד נכסים מקומיהגדרה נפרדת בקובץ התצורה
דגל parallelPrerenderפיצול משימות רינדור על פני worker threads בריבוי ליבותקיצור משמעותי של שלב יצירת הדפים הסטטייםסכנת קריסת זיכרון OOM, לא נתמך במתאם Cloudflare

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

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

מקורות

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

מה שואלים על זה

איך מריצים את מדידת הזמנים בפרויקט קיים ללא שינויי קוד?

מוסיפים את הדגל --timings לפקודת הבנייה בטרמינל, למשל astro build --timings, ומקבלים פלט מפורט של שלבי העבודה והעמודים האטיים.

מדוע parallelPrerender אינו מופעל כברירת מחדל בכל אתר סטטי?

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

האם השימוש ב-3xx.astro משפיע על ניתובים שנוצרים בזמן ריצה בשרת?

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

מה קורה אם מנסים להפעיל רינדור מקבילי תחת המתאם של Cloudflare?

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