Zod V4: 17x کندتر؟ (و چرا باید مراقبت کنید)

سلام به همه! 👋
من دیمیتری ، خالق سوری هستم – سریعترین کتابخانه طرحواره در آنجا. اگر طرفدار Zod هستید (و چه کسی نیست؟) ، می خواهید این را بخوانید. امروز ، من می خواهم یافته های غافلگیرانه ای در مورد عملکرد Zod V4 ، معنی آن برای شما و نحوه جلوگیری از مشکلات را به اشتراک بگذارم.
Zod V4: 17x کندتر؟ نه کاملاً ، اما …
بیایید با یک کلیک کوچک شروع کنیم:
Zod V4 17 برابر کندتر شد و هیچ کس متوجه آن نشده است
این 100 ٪ درست است ، اما البته این کل داستان نیست. بیایید حفر کنیم.
به تازگی ، در حالی که برای انتشار Big Sury V10 آماده شدم ، تصمیم گرفتم معیارهای خود را با Zod V4 دوباره انجام دهم. نتایج؟ جذاب
- برای یک طرح غیر واقعی ، Zod V4 اکنون است 8 برابر سریعتر از قبل
- اما هنگامی که شما یک طرح ایجاد می کنید و فقط یک بار از آن استفاده می کنید (یک الگوی مشترک در مؤلفه های React) ، عملکرد به طور قابل توجهی کاهش می یابد 6 ops/msبشر
ممکن است فکر کنید ، “6 ops/ms هنوز سریع است!” اما در برنامه های سنگین UI ، هر میلی ثانیه حساب می شود. اگر از ZOD در مؤلفه های React خود استفاده می کنید ، این می تواند به معنای عملکرد قابل توجه باشد.
طرحواره از معیار
import { z } from "zod"; // 13.5 kB (min + gzip)
const zodSchema = z.object({
number: z.number(),
negNumber: z.number(),
maxNumber: z.number(),
string: z.string(),
longString: z.string(),
boolean: z.boolean(),
deeplyNested: z.object({
foo: z.string(),
num: z.number(),
bool: z.boolean(),
}),
});
چه چیزی در Zod V4 تغییر کرده است؟
شکار من این بود که Zod V4 شروع به استفاده کرد eval
(یا به طور دقیق تر ، جمع آوری JIT از طریق new Function
) برای اعتبار سنجی. این چیز بدی نیست – کتابخانه هایی مانند Typebox ، Arktype و حتی سوری از تکنیک های مشابه برای سرعت استفاده می کنند.
اما یک تجارت وجود دارد:
- ایجاد طرحواره کندتر می شود (به دلیل مرحله تدوین JIT).
اگرچه ، برای اکثر کاربران مشکلی ندارد ، زیرا:
- اعتبار سنجی خیلی سریعتر می شود (پس از ایجاد طرح و استفاده چندین بار).
Zod V3 قبلاً در ایجاد طرحواره کمی آهسته بود ، اما V4 آن را بیشتر می برد. اگر در حال ایجاد طرح هایی در پرواز هستید (دوباره فکر کنید واکنش نشان دهید) ، ممکن است سرعت آن را احساس کنید.
آیا Eval/JIT بد است؟ واقعاً نیست
یک اسطوره مشترک وجود دارد که eval
/new Function
همیشه کند یا ناامن است. در واقعیت ، هنگامی که با دقت استفاده می شود ، می تواند عملکرد باورنکردنی را باز کند. سوری به شدت به تدوین JIT تکیه می کند و هنوز هم تقریباً با Valibot است که برای اولیه سازی سریع طراحی شده است.
در اینجا یک مقایسه سریع (min + gzip) وجود دارد:
کتابخانه | اندازه واردات | تجزیه (همان طرح) | یک بار ایجاد و تجزیه کنید |
---|---|---|---|
سوریه | 4.27 کیلوبایت | 94،828 ops/ms (فقط JIT) | 166 ops/ms |
Zod V3 | 13.5 کیلوبایت | 1،191 ops/ms (بدون JIT) | 93 ops/ms |
Zod V4 | 13.5 کیلوبایت | 8،437 ops/ms | 6 ops/ms |
جوهر | 1.23 کیلوبایت | 1،721 ops/ms (بدون JIT) | 287 ops/ms |
صندوقچه | 22.8 کیلوبایت | 99،640 ops/ms (فقط پشتیبانی را ادعا کنید) | 111 ops/ms |
نوع قشر | 45.8 کیلوبایت | 67،552 ops/ms | 11 ops/ms |
مقایسه کامل در readme سوری
کاربران Zod چه کاری باید انجام دهند؟
اگر از ZOD در یک پس زمینه یا برای طرح های طولانی مدت استفاده می کنید ، سرعت جدید را دوست خواهید داشت. اما اگر شما به صورت پویا طرح ریزی می کنید (مانند اجزای React) ، ممکن است بخواهید برنامه خود را محک بزنید یا گزینه های دیگری را در نظر بگیرید.
Zod V4 تجزیه و تحلیل معمولی و بهینه سازی شده JIT را ارائه می دهد ، بنابراین ممکن است بتوانید استفاده خود را تغییر دهید. اما ارزش آن را دارد که از مبادلات آگاه باشید.
همچنین ، باید راهی برای غیرفعال کردن مجموعه JIT برای کسانی که آن را نمی خواهند وجود داشته باشد. من API دقیق را نمی دانم یا اینکه در معرض آن قرار دارد ، اما من دیده ام که این گزینه در داخلی Zod وجود دارد.
وارد سوری: سریعترین کتابخانه طرحواره
خوب ، زمان پلاگین بی شرمانه! 😅
من سوری را ساختم تا دقیقاً این مشکلات را حل کنم:
- سریع تجزیه و اعتبار سنجی (به لطف JIT)
- اندازه بسته نرم افزاری کوچک و API قابل لرزش درخت
- استنباط بزرگ نوع و تجربه توسعه دهنده
- طرحواره استاندارد وت json schema پشتیبانی از جعبه
- تحولات اعلانی و سریال سازی خودکار
سوری در حال حاضر توسط بسیاری از شرکت ها در تولید استفاده می شود و با ابزارهایی مانند TRPC ، فرم Tanstack ، Hono و موارد دیگر سازگار است.
در اینجا آنچه با استفاده از سوری به نظر می رسد:
import * as S from "sury";
const filmSchema = S.schema({
id: S.bigint,
title: S.string,
tags: S.array(S.string),
rating: S.union(["G", "PG", "PG13", "R"]),
});
// On hover: S.Schema<{ id: bigint; title: string; tags: string[]; rating: "G" | "PG" | "PG13" | "R"; }, Input>
type Film = S.Output<typeof filmSchema>;
// On hover: { id: bigint; title: string; tags: string[]; rating: "G" | "PG" | "PG13" | "R"; }
S.parseOrThrow(
{
id: 1n,
title: "My first film",
tags: ["Loved"],
rating: "S",
},
filmSchema
);
// Throws S.Error with message: Failed at ["rating"]: Expected "G" | "PG" | "PG13" | "R", received "S"
// Or do it safely:
const result = S.safe(() => S.parseOrThrow(data, filmSchema));
if (result.error) {
console.log(result.error.reason);
// Expected "G" | "PG" | "PG13" | "R", received "S"
}
و بله ، سوری همچنین از JIT در زیر کاپوت استفاده می کند ، اما با تمرکز بر سرعت ایجاد و اعتبار سنجی.
افکار نهایی
- Zod V4 یک کتابخانه خارق العاده است ، و کالین (نویسنده) کار شگفت انگیزی را انجام داد که از تجزیه و تحلیل های عادی و بهینه سازی شده JIT پشتیبانی می کند.
- اگر به عملکرد اهمیت می دهید-به ویژه در سناریوهای پویا یا UI سنگین-استفاده خود را معیار کنید.
- اگر می خواهید سریعترین اعتبار سنجی طرحواره ، کوچکترین بسته نرم افزاری و نسل بعدی DX ، سوری را امتحان کنید. (و اگر آن را دوست دارید ، یک ستاره GitHub روز من را می سازد! ⭐)
با تشکر از خواندن! اگر سؤال ، بازخورد دارید یا می خواهید معیارهای بیشتری را ببینید ، در نظرات به من اطلاع دهید یا مرا در X پینگ کنید. به زودی با به روزرسانی های بیشتر شما را می بینم! 🚀