ไลบรารี TypeScript ตัวใหม่ decode-kit ท้าชิง Zod ด้วยแนวทาง In-Place Type Assertion

ทีมชุมชน BigGo
ไลบรารี TypeScript ตัวใหม่ decode-kit ท้าชิง Zod ด้วยแนวทาง In-Place Type Assertion

ไลบรารี TypeScript สำหรับการตรวจสอบข้อมูลตัวใหม่ชื่อ decode-kit ได้เกิดขึ้นมา โดยสัญญาว่าจะแก้ไขปัญหาด้านประสิทธิภาพที่เกิดขึ้นกับเครื่องมือตรวจสอบข้อมูลยอดนิยมอย่าง Zod , Valibot และ Decoders ไลบรารีนี้ใช้แนวทางที่แตกต่างจากเดิมโดยการตรวจสอบข้อมูลในตำแหน่งเดิมแทนที่จะสร้างสำเนา ซึ่งอาจให้ประโยชน์อย่างมากสำหรับแอปพลิเคชันที่มีข้อจำกัดด้านหน่วยความจำและต้องการประมวลผลข้อมูลจำนวนมาก

ความแตกต่างหลักจากไลบรารีการตรวจสอบความถูกต้องแบบดั้งเดิม

คุณสมบัติ decode-kit Zod/Valibot/Decoders
การจัดการข้อมูล การยืนยันประเภทข้อมูลในตำแหน่งเดิม สร้างค่าใหม่/แปลงค่า
การใช้หน่วยความจำ ไม่มีการคัดลอกข้อมูล ทำการ Deep clone ระหว่างการตรวจสอบ
กลยุทธ์การจัดการข้อผิดพลาด หยุดทันทีเมื่อพบข้อผิดพลาด (fail-fast) อาจดำเนินการตรวจสอบต่อไป
จุดเน้นด้านประสิทธิภาพ ให้ความสำคัญกับประสิทธิภาพหน่วยความจำ ให้ความสำคัญกับความสมบูรณ์ของคุณสมบัติ
การจำกัดประเภทข้อมูล ยืนยันประเภทของตัวแปรเดิม ส่งคืนค่าที่มีประเภทใหม่

ปรัชญาการออกแบบที่เน้นประสิทธิภาพเป็นหลัก

แตกต่างจากไลบรารีตรวจสอบข้อมูลแบบดั้งเดิมที่สร้างสำเนาลึกของข้อมูลระหว่างการตรวจสอบ decode-kit ใช้การตรวจสอบแบบ assertion-based ที่จำกัดประเภทของ TypeScript โดยไม่ต้องคัดลอกหรือแปลงค่าต้นฉบับ แนวทางนี้มีเป้าหมายเพื่อขจัดภาระด้านหน่วยความจำและเวลาประมวลผลที่เกี่ยวข้องกับการทำซ้ำของอาร์เรย์ สตริง และออบเจ็กต์ที่ซ้อนกัน ผู้สร้างไลบรารีได้ออกแบบมันมาโดยเฉพาะสำหรับแอปพลิเคชันที่ต้องการประสิทธิภาพสูงซึ่งความมีประสิทธิภาพด้านหน่วยความจำและความเร็วเป็นสิ่งสำคัญที่สุด

กระบวนการตรวจสอบทำงานโดยการรันการตรวจสอบ runtime และ assert ประเภทของตัวแปรต้นฉบับเมื่อสำเร็จ ในขณะที่โยน DecoderError เมื่อล้มเหลว แนวทาง fail-fast นี้หยุดการตรวจสอบทันทีเมื่อพบปัญหาแรก ซึ่งอาจให้ข้อความแสดงข้อผิดพลาดที่ชัดเจนกว่าและประสิทธิภาพที่ดีกว่าเมื่อเปรียบเทียบกับไลบรารีที่ยังคงตรวจสอบต่อไปหลังจากพบปัญหา

ความสงสัยจากชุมชนเกี่ยวกับการอ้างสิทธิ์ด้านประสิทธิภาพ

แม้จะมีคำสัญญาด้านประสิทธิภาพ แต่ชุมชนนักพัฒนาได้ตั้งคำถามสำคัญเกี่ยวกับข้อได้เปรียบด้านความเร็วที่แท้จริงของ decode-kit นักพัฒนาบางคนได้ชี้ให้เห็นปัญหาที่อาจเกิดขึ้นกับการใช้งานของไลบรารี โดยเฉพาะการใช้บล็อก try/catch ทั่วทั้งซอร์สโค้ด โครงสร้างเหล่านี้อาจทำให้เกิด deoptimizations ของ JavaScript engine ซึ่งอาจทำลายประโยชน์ด้านประสิทธิภาพที่ระบุไว้ใน hot code paths

ฉันแปลกใจที่ซอร์สมี try/catch เยอะ ซึ่งส่งผลให้เกิด deopts สำหรับ code path นั้นตามที่ฉันเข้าใจ เนื่องจากประโยชน์ที่ระบุไว้เหนือ Zod และ validators อื่นๆ คือสิ่งนี้ควรจะถูกรันใน performance critical code

ชุมชนกำลังเรียกร้องให้มีการเปรียบเทียบประสิทธิภาพอย่างครอบคลุมระหว่าง decode-kit กับไลบรารีที่มีชื่อเสียงอย่าง Zod , Valibot และ zod4 mini ที่ใหม่กว่า แม้ว่าผู้สร้างจะอ้างว่าได้ทำการเปรียบเทียบประสิทธิภาพที่แสดงการปรับปรุงอย่างมีนัยสำคัญเมื่อตรวจสอบออบเจ็กต์หลายพันรายการต่อวินาที แต่ผลลัพธ์เหล่านี้ยังไม่ได้ถูกเผยแพร่ต่อสาธารณะ

ทางเลือกที่มีอยู่และตำแหน่งในตลาด

การอภิปรายยังได้เน้นให้เห็นว่า decode-kit ไม่ใช่ไลบรารีเดียวที่สำรวจแนวทางนี้ ArkType ซึ่งเป็นไลบรารี TypeScript validation อีกตัวหนึ่ง ได้ใช้เทคนิค in-place validation ที่คล้ายกันแล้วและได้รับการตอบรับเชิงบวกจากนักพัฒนา สิ่งนี้ทำให้เกิดคำถามเกี่ยวกับข้อเสนอคุณค่าที่เป็นเอกลักษณ์ของ decode-kit ในภูมิทัศน์ไลบรารี validation ที่แออัดมากขึ้น

ไลบรารีนี้มี API ที่ครอบคลุมรวมถึง validators สำหรับ strings, numbers, booleans, arrays, objects และประเภทเฉพาะเจาะจงอย่าง ISO 8601 datetime strings นอกจากนี้ยังมี union types ผ่านฟังก์ชัน or() และรวมถึง utility types อย่าง InferOutputOf<D> สำหรับการดึงประเภท output จาก decoders

ภาพรวม API ของ decode-kit

Basic Validators:

  • string() - ตรวจสอบความถูกต้องของสตริงพร้อมกฎ minLength/maxLength แบบเสริม
  • number() - ตรวจสอบความถูกต้องของตัวเลขจำกัดพร้อมขอบเขต min/max แบบเสริม
  • boolean() - ตรวจสอบความถูกต้องของค่าบูลีน
  • constant() - ตรวจสอบความถูกต้องของค่าตัวอักษรที่แน่นอน
  • null() - ตรวจสอบความถูกต้องของค่า null
  • undefined() - ตรวจสอบความถูกต้องของค่า undefined

Complex Validators:

  • array() - ตรวจสอบความถูกต้องของอาร์เรย์พร้อมการตรวจสอบรายการและกฎ minLength แบบเสริม
  • object() - ตรวจสอบความถูกต้องของออบเจ็กต์พร้อมการตรวจสอบคุณสมบัติแบบเสริม
  • or() - สร้าง union type decoders
  • iso8601() - ตรวจสอบความถูกต้องของสตริงวันที่และเวลา ISO 8601

Utility Types:

  • InferOutputOf&lt;D&gt; - ดึงประเภท output จาก decoder
  • Iso8601 - ประเภทสตริงที่มีตราสำหรับวันที่ ISO ที่ผ่านการตรวจสอบแล้ว

สรุป

แม้ว่า decode-kit จะนำเสนอแนวทางที่น่าสนใจต่อการตรวจสอบข้อมูล TypeScript ด้วยการเน้นที่ความมีประสิทธิภาพด้านหน่วยความจำและ in-place type assertion แต่ชุมชนยังคงระมัดระวังเกี่ยวกับการอ้างสิทธิ์ด้านประสิทธิภาพ ความสำเร็จของไลบรารีนี้น่าจะขึ้นอยู่กับการให้การเปรียบเทียบประสิทธิภาพที่เป็นรูปธรรมซึ่งแสดงให้เห็นการปรับปรุงประสิทธิภาพในโลกแห่งความเป็นจริงเหนือทางเลือกที่มีชื่อเสียง สำหรับนักพัฒนาที่ทำงานกับแอปพลิเคชันที่ต้องการประมวลผลข้อมูลจำนวนมากหรือมีข้อจำกัดด้านหน่วยความจำ decode-kit อาจคุ้มค่าที่จะประเมินเมื่อมีข้อมูลประสิทธิภาพที่ครอบคลุมมากขึ้น

อ้างอิง: decode-kit