WEBA

שורת הגדרה אחת ב-Vercel תחסוך לכם כסף על העלאות קבצים

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

545 מילים25 עובדות אומתו

כל מפתח שמריץ אפליקציית Next.js על גבי Vercel מכיר את הרגע שבו חשבון התשתית החודשי מתחיל להתנפח בלי סיבה ברורה לעין. העלאת קבצים כבדים וטפסים מרובי שדות דרך בקשות POST גוררת לעיתים קרובות חיובים מפתיעים בסעיפי רוחב הפס. אתמול, 8 באוקטובר 2026, פרסמה ורסל עדכון שמציע פתרון ממוקד לבעיה הזו בדמות הגדרה חדשה לקובצי הקונפיגורציה. העדכון נועד לעצור העברה מיותרת של נתונים ברשת הפנימית של הפלטפורמה.

לא הייתי ממהר להאשים את התעבורה החיצונית של הגולשים.

חיוב כפול על אותו קובץ

הבעיה נבעה עד כה מהאופן שבו Routing Middleware מעבד בקשות רשת. כברירת מחדל, כאשר נשלחת בקשת POST עם גוף נתונים (body), המידע מועבר במלואו קודם כל לשכבת המידלוור. לאחר מכן, אותה בקשה בדיוק נשלחת שוב אל הפונקציה הראשית שמטפלת בה ביעד הסופי.

לפי דפי התמחור של החברה, תעבורה בין ה-CDN לבין Vercel Functions מוגדרת תחת Fast Origin Transfer. התעבורה הזו נמדדת על בסיס קלט ופלט בכל שימוש ב-compute או ב-Blob. המשמעות בפועל היא חיוב כפול על אותם בייטים בדיוק: פעם אחת בכניסה למידלוור, ופעם שנייה בכניסה לפונקציה ביעד ההמשך.

בעוד בקשת GET רגילה צורכת בדרך כלל פחות מ-1KB של נתונים נכנסים, בקשת POST של קובץ מצרפת את כל משקל הקובץ למניין התעבורה. בחבילות Pro, התמחור מבוסס שימוש לפי תעריף של 0.06 דולר לכל 1GB (בחבילת Hobby כלולים 10GB ראשונים). עבור מוצרים שמרבים לקבל קבצים, ההכפלה הזו הופכת לבזבוז תקציבי ישיר.

מתי להדליק ומתי להתרחק

הפתרון שורסל הציגה ב-הודעת העדכון הוא הדגל `skipMiddlewareRequestBody`. כאשר מגדירים אותו כפעיל, הפלטפורמה מוותרת על שליחת גוף הבקשה לשכבת המידלוור ומעבירה אותו ישירות לפונקציות היעד או לשכתובים (rewrites).

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

הפעילו אפשרות זו רק אם ה-Routing Middleware שלכם אינו קורא את גופי הבקשות. פונקציות Vercel ויעדי שכתוב עדיין מקבלים את הגוף, כך שתוכלו לקרוא ולעבד אותו שם.ורסל בהודעת ה-Changelog

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

הטפיחה העצמית בלי המספרים

לצד החיסכון בתקציב, ורסל מבטיחה שהשינוי יכול לשפר את זמני ה-TTFB (Time to First Byte), במיוחד בבקשות עם מטענים כבדים. לפי ההסבר של החברה, הדבר מפחית את צריכת ה-Fast Origin Transfer הנכנסת בהפעלות מידלוור ומזרז את תחילת המענה. זה נשמע הגיוני בתיאוריה, שכן תעבורת הרשת בתוך התשתית מצטמצמת והמידלוור לא נדרש לחכות לקבלת המידע המלא.

אבל החברה לא סיפקה נתוני בנצ'מרק רשמיים כדי לגבות את הטענה הזו. בדוקומנטציה של Routing Middleware קיימת מגבלה מובנית של עד 4MB על גודל גוף הבקשה, לצד תקרה של 14KB על אורך כתובת ה-URL, מגבלה של 64 כותרות ועד 16KB לאורך הכותרות במצטבר. השיפור במהירות עשוי להיות מורגש רק במטענים שקרובים לאותם 4MB, אך בהיעדר מדידות השוואתיות של החברה מדובר בהצהרה כללית בלבד.

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

ההטמעה בפועל דורשת שורת קוד בודדת. בפרויקטים המשתמשים בקובץ vercel.json, יש להוסיף את המפתח `skipMiddlewareRequestBody` ולהגדיר לו ערך `true`. ברירת המחדל עומדת על `false`, כך שפרויקטים קיימים אינם מושפעים ללא התערבות ידנית.

מי שמנהל הגדרות דרך קובצי TypeScript עם vercel.ts יכול להוסיף את אותו מאפיין לקובץ במקום זאת (דוגמת הקוד של ורסל מניחה שהחבילה `@vercel/config` מותקנת לצורך הגדרת הטיפוס).

זה שינוי קטן עם השפעה רוחבית.

השוואת התנהגות המערכת לפי מצב ההגדרה
פרמטרברירת מחדל (false)עם skipMiddlewareRequestBody (true)
חיוב Fast Origin Transferאפשרי פעמיים (גם למידלוור וגם לפונקציה)בודד (לפונקציית היעד בלבד)
זמינות ה-body ב-Middlewareזמין לקריאהאינו מועבר
זמינות ה-body בפונקציות יעדזמין לקריאהזמין לקריאה
השפעה על TTFBתלויה בהעברת מלוא המטעןפוטנציאל לשיפור (לא פורסמו בנצ'מרקים)

מדובר בהגדרה גלובלית ברמת הפרויקט כולו, ולא ניתן להפעיל אותה עבור נתיב ספציפי בתוך האפליקציה. לאחר עדכון קובץ ה-JSON או ה-TypeScript, נדרשת פריסה מחדש (redeploy) של הפרויקט כדי שהשינויים ייכנסו לתוקף. בינתיים, אם האפליקציה שלכם רק קוראת עוגיות ומעבירה קבצים הלאה, אין סיבה להמשיך לשלם כפול.

מה לעשות עכשיובדקו אם קוד ה-Middleware שלכם נוגע ב-body של בקשות POST, ואם לא, הוסיפו את הדגל skipMiddlewareRequestBody כדי לחתוך עלויות רוחב פס כפולות.

מקורות

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

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

מה קורה לפונקציה הראשית ביעד כשמדליקים את ההגדרה?

פונקציות Vercel ויעדי שכתוב ממשיכים לקבל את גוף הבקשה במלואו כרגיל, כך שעיבוד הנתונים וקריאת המידע יכולים להתבצע שם ללא שינוי.

האם ההגדרה זמינה ברמת נתיב בודד בתוך Next.js?

לא. מדובר בהגדרת קונפיגורציה גלובלית ברמת הפרויקט בקובץ vercel.json או vercel.ts, והיא חלה על כלל הניתובים באפליקציה.

כמה כסף חוסך דילוג על גוף הבקשה ב-Middleware?

ההגדרה מונעת חיוב כפול על Fast Origin Transfer, המתומחר ב-0.06 דולר לכל 1GB מעבר למכסה הכלולה בחשבונות Pro, בייחוד בבקשות POST כבדות.

מה קורה אם ה-Middleware מנסה לקרוא את ה-body כשהדגל דלוק?

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