Zod 4.5 اومد: پارس چند برابر سریعتر
خلاصهٔ کاملتر
Colin McDonnell نسخهٔ Zod 4.5 رو منتشر کرد و به گفتهٔ خودش، فیچر پرچمدار این نسخه z.compile() ـه. با این تابع هر اسکیمای Zod رو از قبل کامپایل میکنی و بعدش دقیقاً مثل یه اسکیمای معمولی ازش استفاده میکنی؛ هیچ قانون خاصی نداره، فقط سریعتره. روی آبجکت و آرایه و یونیون سرعت پارس حدوداً ۳ تا ۹ برابر بالا میره و هرچی اسکیما پیچیدهتر باشه، سود بیشتری میبره.
اگه نمیخوای تکتک اسکیماها رو دستی کامپایل کنی، کافیه یه بار zod/compile رو اول entry point پروژه import کنی؛ اونوقت هر اسکیمایی که بعدش ساخته بشه، اولین باری که باهاش پارس میکنی خودکار کامپایل میشه. همین کارو میشه با یه فلگ CLI روی Node.js انجام داد که تضمین میکنه قبل از تعریف هر اسکیما اجرا شده باشه. تیم Zod میگه کل تستسوییت دو بار اجرا میشه، یه بار عادی و یه بار با کامپایل خودکار، تا رفتار هر دو حالت دقیقاً یکی بمونه.
کنارش z.validate() اضافه شده که فقط میگه ورودی معتبر هست یا نه و اصلاً ZodError نمیسازه. برای همین رد کردن دادهٔ نامعتبر تا ۱۶ برابر سریعتر از .safeParse().success درمیاد و خروجیاش هم type guard روی نوع ورودی اسکیماست. یه بهبود دیگه هم روی مسیر خطاست: .safeParse() دیگه stack trace نمیگیره و همین پارسهای ناموفق رو حدود ۷.۵ برابر سریعتر کرده.
حافظه هم داستان جالبیه. تو Zod 4.4 یه z.string() خالی حدود ۷.۵ کیلوبایت heap اشغال میکرد، تو ۴.۵ فقط ۷۸۴ بایت. علتش این بود که قبلاً همهٔ متدهای اسکیما موقع ساخت به خود نمونه bind میشدن تا مشکل this پیش نیاد، ولی هر متد bind شده جا میگرفت و از prototype به اشتراک گذاشته نمیشد. حالا متدها memoize میشن و تا وقتی واقعاً صداشون نزنی ساخته نمیشن.
از API های جدید هم z.creditCard() (بین ۱۲ تا ۱۹ رقم با چکسام Luhn)، z.properties()، برگشت z.deepPartial() به شکل تابع، و .exactPartial() که کلید غایب رو قبول میکنه ولی undefined صریح رو رد میکنه اضافه شدن. z.toZod() هم کمک میکنه اسکیما دقیقاً با یه تایپ استاتیک بخونه، و اسکیماهای بازگشتی حالا با دادهٔ چرخهدار هم کنار میان.
چند تغییر شکننده هم هست که قبل از آپدیت باید حواست بهشون باشه. z.iso.datetime() طبق RFC 3339 دیگه ثانیه رو الزامی میکنه، طول رشته توی .min() و .max() به جای واحد UTF-16 بر اساس code point شمرده میشه (یعنی پنج تا ایموجی دیگه رد نمیشه)، کلید proto همیشه از خروجی حذف میشه، و فرمتهایی مثل z.ipv6() و z.ulid() و z.httpUrl() سختگیرتر شدن. مجموعاً این نسخه ۱۵۵ کامیت داره و هشت زبان تازه از جمله کردی سورانی به لوکالها اضافه شده.
نکات کلیدی:
- z.compile() اسکیما رو از قبل کامپایل میکنه و پارس آبجکت و آرایه و یونیون رو ۳ تا ۹ برابر سریعتر میکنه
- import کردن zod/compile توی entry point، همهٔ اسکیماهای بعدی رو خودکار کامپایل میکنه
- z.validate() بدون ساختن ZodError جواب بولین میده و روی ورودی نامعتبر تا ۱۶ برابر سریعتره
- حافظهٔ یه z.string() از ۷.۵ کیلوبایت تو نسخهٔ ۴.۴ به ۷۸۴ بایت رسیده
- .safeParse() دیگه stack trace نمیگیره و مسیر خطا حدود ۷.۵ برابر سریعتر شده
- تغییرهای شکننده: الزامی شدن ثانیه در z.iso.datetime()، شمارش طول رشته بر اساس code point و حذف همیشگی کلید proto




