انتقل إلى المحتوى الرئيسي

حجم الحزمة و تنسيقات الوحدات

تقوم حزمة SDK بتوفير كل من بناء CommonJS و ESM، وتحافظ على اعتمادياتها الثقيلة - Zod و socket.io-client - خارج رسم الاستيراد حتى يتم استخدامها فعليًا. مشروع يستدعي طريقة واحدة، ويترك التحقق معطلاً ولا يفتح أي مقبس، يحمل 43 كيلوبايت مضغوط (9.7 كيلوبايت gzip)، انخفاضًا من 536 كيلوبايت (110 كيلوبايت gzip).

ما الذي يتم شحنه في الحزمة

الحقلالقيمةالمستخدم من قبل
maindist/index.jsNode وأي مستهلك CommonJS
moduleesm/index.jsأدوات التجميع (webpack، Vite، Rollup، esbuild)
typesdist/index.d.tsTypeScript
sideEffectsfalseأدوات التجميع، لإسقاط الوحدات غير المستخدمة

لا يوجد خريطة "exports"، لذا فإن كل استيراد عميق موجود - oneentry/dist/<module>/<module>Interfaces وما إلى ذلك - يتم حله تمامًا كما كان من قبل. يستمر Node في حل بناء CommonJS من خلال main؛ لا يتعين تغيير أي شيء في إعدادك الحالي.

sideEffects: false تخبر أداة التجميع أن استيراد وحدة من SDK لا يفعل أي شيء بمفرده، وهو ما يجعل عملية تقليم الشجرة ممكنة: الوحدات التي لا تلمسها تُسقط من المخرجات.

Zod يتم تحميله فقط عند تشغيل التحقق

تحقق الاستجابة معطل بشكل افتراضي. كانت مخططات الاستجابة تُستورد بشكل ثابت من قبل كل وحدة، مما كان يجلب Zod إلى كل حزمة حتى عندما لم يتم التحقق من أي شيء. يتم الآن تحميل المخططات ومساعدات التحقق عند الطلب، في المرة الأولى التي يجب فيها التحقق فعليًا من استجابة.

  • مع validation.enabled: false (الإعداد الافتراضي)، ينتهي الأمر بـ Zod والمخططات الخاصة بكل وحدة (341 كيلوبايت) في أجزاء لا يتم طلبها أبدًا.
  • مع validation.enabled: true، يبقى السلوك دون تغيير - يتم ببساطة جلب المخططات في المرة الأولى التي تكون فيها مطلوبة.
  • في Node، لم يعد require('oneentry') يحمل Zod عند بدء التشغيل.

لمشروع يستدعي طريقة واحدة مع التحقق معطلاً، ينخفض الكود الذي يتم تحميله فعليًا من 536 كيلوبايت إلى 83 كيلوبايت مضغوط (110 كيلوبايت → 22 كيلوبايت gzip) - وينخفض إلى 43 كيلوبايت بمجرد ترك socket.io أيضًا (انظر أدناه).

ℹ️ هذا الرقم يفترض وجود أداة تجميع تقوم بـ تقسيم الكود - وهو الإعداد الافتراضي في webpack و Vite و Rollup. لا تزال الحزمة المفروضة في ملف واحد تتقلص، ولكن فقط إلى ~427 كيلوبايت، لأن Zod يتم تضمينه حتى لو لم يتم تشغيله أبدًا.

لم يتغير أي واجهة برمجة تطبيقات عامة. أصبح المساعد الداخلي _validateResponse async، وهو ما يكون ذا صلة فقط إذا قمت بتمديد الفئات الأساسية لـ SDK بنفسك.

socket.io يتم تحميله فقط عند فتح مقبس

WS.connect() يحتفظ بتوقيعه المتزامن ولا يزال يُرجع Socket من socket.io، ولكن socket.io-client (~41 كيلوبايت) يتم استيراده الآن في المرة الأولى التي يتم فيها استدعاء connect().

حتى يتم حل الجزء، يقوم الكائن المُرجع بتجميع أي شيء تفعله به - on، emit، disconnect - ويعيد تشغيله على المقبس الحقيقي في نفس الدورة التي يتم فيها إنشاء المقبس، قبل أن تتمكن الاتصال من تسليم أي شيء، لذا لا يتم فقدان أي حدث:

// Nothing changes in normal use — handlers registered here always fire.
const socket = WS.connect();

socket.on('connect', () => console.log('WebSocket connected'));
socket.on('my_event', (payload) => console.log(payload));

تظل قراءة حالة الاتصال مبكرًا دقيقة، لأن المقبس الذي تم إنشاؤه حديثًا غير متصل أيضًا: id هو undefined و connected هو false في كل من السلوك القديم والجديد.

الفرق الوحيد: لا يمكن لطريقة يجب أن ترجع شيئًا (على سبيل المثال listeners()) أن تجيب قبل وصول الجزء، والأشياء المتداخلة مثل socket.io يمكن الوصول إليها فقط بمجرد تحميلها. تسجيل المعالجات وإصدار الأحداث - الاستخدام العادي - غير متأثر.

حجم الحزمة في لمحة

السيناريومضغوطGzip
قبل (كل مستهلك)536 كيلوبايت110 كيلوبايت
التحقق معطل، لا مقبس43 كيلوبايت9.7 كيلوبايت
التحقق معطل، تم فتح مقبس~83 كيلوبايت~22 كيلوبايت
حزمة ملف واحد، لا تقسيم كود~427 كيلوبايت

الحصول على أصغر بناء

  • اترك التحقق معطلاً في الإنتاج. قم بتمكينه أثناء التطوير لالتقاط عدم تناسق البيانات، ثم قم بإيقافه - تظل المخططات خارج الكود المحمل.
  • دع أداة التجميع الخاصة بك تقسم الكود. تقسيم الكود مفعل بشكل افتراضي في webpack و Vite و Rollup؛ تعطيله يدرج الأجزاء الكسولة ويعيد معظم الفائدة.
  • استورد الأنواع باستخدام import type. يتم محو استيرادات الأنواع في وقت التجميع - انظر استيراد الأنواع.
  • قم بفك تشفير الوحدات التي تستخدمها فقط. مع sideEffects: false وبناء ESM، يتم إسقاط الوحدات غير الملموسة من المخرجات.

🔗 الوثائق ذات الصلة