µsignal: کتابخونهٔ signal زیر یه کیلوبایت
خلاصهٔ کاملتر
usignal (یا µsignal) کار WebReflection هست و ترکیبی از @preact/signals-core و API پایهٔ reactivity توی solid-js ـه. signal یعنی یه مقدار که هر جا ازش استفاده شده، با عوض شدنش خودکار بهروز میشه. API و تجربهٔ توسعهش تقریباً همون Preact هست، ولی چند تا قابلیت الهامگرفته از Solid هم داره. حجمش بعد از minify و فشردهسازی brotli فقط ۸۱۶ بایته.
خروجیهای اصلیش signal، computed، effect، batch و Signal هستن. Signal فقط برای چک کردن اینه که یه چیزی signal یا computed هست یا نه، و نمیشه مستقیم بهعنوان constructor ازش استفاده کرد. پکیج dual module ـه، یعنی هم با CommonJS کار میکنه هم با ES module. چند مسیر import هم داره: usignal/sync که effectها رو همیشه همزمان اجرا میکنه، usignal/async که همیشه async اجرا میکنه، و usignal/core که انتخاب رو برای هر effect به خودت میسپره. خود usignal توی مرورگر نسخهٔ async و روی سرور نسخهٔ sync رو میده.
نویسنده چند تا تفاوت عمدی رو توضیح میده. مقایسهٔ برابری بهجای === با Object.is انجام میشه. به گفتهٔ خودش این شاید یه هزینهٔ کوچیک performance داشته باشه، ولی جلوی حلقههای بیپایان ناشی از NaN رو میگیره. computedها lazy هستن، یعنی تا وقتی کسی مقدارشون رو نخواد حساب نمیشن و side effect هم ندارن. computed و signal میتونن یه آرگومان options بگیرن که فعلاً گزینهٔ equals مثل Solid رو پیاده میکنه.
یه قابلیت جالب دیگه اینه که signal و computed متد toJSON و valueOf دارن، پس میشه مستقیم توی محاسبهها ازشون استفاده کرد:
const one = signal(1);
const two = signal(2);
const three = computed(() => one + two);
three.value; // 3 indeed!برای کسایی که سبک دیگهای دوست دارن، دو تا نسخهٔ جانبی هم هست. usignal/fn signalها رو تابع میکنه، یعنی signal() مقدار رو برمیگردونه و signal(value) آپدیتش میکنه، با الهام از کتابخونهٔ S. usignal/solid هم createSignal و createMemo و createEffect رو دقیقاً با رفتار Solid صادر میکنه تا بشه توی کد Solid جایگزینش کرد یا مقایسهش کرد.
کد کتابخونه ۱۰۰ درصد coverage داره و یه تست نشت حافظه (test/leak.js) هم جزو build هست. نویسنده میگه این تست برای مقایسه با بقیه نیست و فقط برای پیدا کردن regression توی آپدیتهای بعدیه. یه بنچمارک هم usignal رو با S و Solid و Preact Signals و cellx مقایسه میکنه، با این نکته که Preact effectهای تودرتو رو حل نمیکنه و منطقش سادهتره. توی README یه mixin هم برای استفاده از usignal توی Lit اومده.
نکات کلیدی:
- حجم کل کتابخونه حدود ۸۱۶ بایت با brotli ـه.
- API تقریباً عین @preact/signals-core هست، با قابلیتهایی از solid-js مثل گزینهٔ equals.
- برابری با Object.is چک میشه تا مشکل NaN پیش نیاد.
- computedها lazy هستن و از v0.5.0 دیگه از WeakRef استفاده نمیکنه.
- نسخههای usignal/fn و usignal/solid سبکهای API متفاوت رو پوشش میدن.
- کد ۱۰۰ درصد تست شده و تست نشت حافظه بخشی از build ـه.




