כל מפתח שמריץ אפליקציית 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) של הפרויקט כדי שהשינויים ייכנסו לתוקף. בינתיים, אם האפליקציה שלכם רק קוראת עוגיות ומעבירה קבצים הלאה, אין סיבה להמשיך לשלם כפול.
מקורות
- Skip sending request bodies to Routing Middlewarehttps://vercel.com/changelog/skip-sending-request-bodies-to-routing-middleware
- Routing Middlewarehttps://vercel.com/docs/routing-middleware
- CDN pricing and usagehttps://vercel.com/docs/manage-cdn-usage
- Static Configuration with vercel.jsonhttps://vercel.com/docs/project-configuration/vercel-json
- Configuring Projects with vercel.tshttps://vercel.com/docs/project-configuration/vercel-ts
- Fast Origin Transferhttps://vercel.com/docs/manage-cdn-usage#fast-origin-transfer
- skipMiddlewareRequestBody documentationhttps://vercel.com/docs/project-configuration/vercel-json#skipmiddlewarerequestbody
- Vercelhttps://weba.co.il/tools/vercel/
- JSONhttps://weba.co.il/glossary/json/
- TypeScripthttps://weba.co.il/glossary/typescript/
הידיעה נכתבה מהמקורות שלמעלה בתאריך הפרסום, וכל טענה בה נבדקה מולם. מצאתם טעות? כתבו.