זמן בנייה ארוך בשרת ה-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 פשוט תסרב לפעול.
| יכולת | מנגנון פעולה | השפעה על ה-CI | תנאי מקדים או סיכון |
|---|---|---|---|
| דגל timings | איסוף נתוני משך ריצה של שלבי בנייה, פלאגינים ועמודים | זיהוי מדויק של צווארי בקבוק ללא צורך בניחושים | אין, כלי דיאגנוסטיקה בלבד |
| הפרדת שירותי תמונות | פיצול בין Sharp בבנייה לבין CDN בריצה | חוסך קריאות רשת מיותרות בזמן עיבוד נכסים מקומי | הגדרה נפרדת בקובץ התצורה |
| דגל parallelPrerender | פיצול משימות רינדור על פני worker threads בריבוי ליבות | קיצור משמעותי של שלב יצירת הדפים הסטטיים | סכנת קריסת זיכרון OOM, לא נתמך במתאם Cloudflare |
לפני שאתם מוסיפים עוד מעבדים לשרת הבנייה, תתחילו בהרצת פקודת מדידה אחת כדי לראות מה באמת מעכב אתכם. תמיד עדיף לפתור בעיית קוד בחינם מאשר לשלם לספק הענן על עוד זיכרון.
מקורות
- Astro 7.4https://astro.build/blog/astro-740/
- CLI Commands | Docshttps://docs.astro.build/en/reference/cli-reference
- Fetch routing API reference | Docshttps://docs.astro.build/en/reference/modules/astro-fetch
- Astro Font Provider API | Docshttps://docs.astro.build/en/reference/font-provider-reference
- Upgrade Astro | Docshttps://docs.astro.build/en/upgrade-astro
- Separate build and runtime image serviceshttps://astro.build/blog/astro-740/#separate-build-and-runtime-image-services
- Node.jshttps://weba.co.il/tools/node-js/
- Vitehttps://weba.co.il/tools/vite/
הידיעה נכתבה מהמקורות שלמעלה בתאריך הפרסום, וכל טענה בה נבדקה מולם. מצאתם טעות? כתבו.