ffetch: یه fetch آماده برای پروداکشن
خلاصهٔ کاملتر
ffetch (پکیج @fetchkit/ffetch) یه wrapper برای fetch هست که به گفتهٔ سازندههاش میخواد «جایگزین بیدردسر» fetch تو پروداکشن باشه. حرف اصلی اینه که fetch خودِ مرورگر پایهٔ خوبیه، ولی تو اپ واقعی تقریباً همیشه timeout و retry لازم میشه و هر بار باید دستی بنویسیشون. ffetch همینها رو اضافه میکنه و حجمش حدود ۳ کیلوبایت minified هست، بدون هیچ وابستگی runtime.
نکتهٔ مهمش اینه که لازم نیست fetch مرورگر رو استفاده کنی. میتونی هر پیادهسازی سازگار با fetch، مثل node-fetch، undici یا fetchی که یه فریمورک SSR بهت میده، با گزینهٔ fetchHandler بهش بدی. همهٔ قابلیتها، یعنی timeout و retry و هوکها، با این fetchهای سفارشی هم همونجوری کار میکنن. روی Node.js، مرورگر، Cloudflare Workers و React Native هم اجرا میشه.
خود هسته اینها رو داره: timeout برای هر درخواست یا کل کلاینت، retry با exponential backoff (یعنی فاصلهٔ بین تلاشها هر بار بیشتر میشه) بهعلاوهٔ jitter، و اینکه اگه وسط صبر کردن برای retry درخواست رو abort کنی، همون لحظه لغو میشه. هوکهایی هم برای لاگ، احراز هویت و متریک هست. یه سری کلاس خطای آماده هم داره مثل TimeoutError، RetryLimitError، CircuitOpenError و HttpError.
const api = createClient({ timeout: 5000, retries: 2 })
const response = await api('https://api.example.com/users')بقیهٔ قابلیتها پلاگینهای جدا و tree-shakeable هستن، یعنی فقط همونی که import کنی تو bundle میاد. مثلاً dedupePlugin درخواستهای یکسانی که همزمان در جریانن رو یکی میکنه، circuitPlugin بعد از چند خطای پشت سر هم دیگه درخواست نمیفرسته (همون الگوی circuit breaker)، bulkheadPlugin تعداد درخواستهای همزمان رو محدود میکنه، و hedgePlugin چند تلاش موازی میفرسته تا اولین جواب برنده بشه و تأخیرهای خیلی بلند کم بشن.
بهطور پیشفرض ffetch مثل fetch معمولی رفتار میکنه و روی خطای HTTP مثل 404 exception نمیده؛ خودت باید response.ok رو چک کنی. اگه بخوای بعد از تموم شدن retryها خطا پرتاب بشه، گزینهٔ throwOnHttpError: true رو روشن میکنی. اگه از نسخهٔ ۴ میای، README میگه اول راهنمای migration رو بخونی.
نکات کلیدی:
- حجم حدود ۳ کیلوبایت minified، بدون وابستگی runtime، خروجی ESM و CJS
- retry با exponential backoff و jitter، و timeout برای هر درخواست یا کل کلاینت
- گزینهٔ fetchHandler برای استفاده از node-fetch، undici یا fetch فریمورک
- پلاگینهای جدا: dedupe، circuit، bulkhead، hedge، contextId و download progress
- خطای HTTP پیشفرض پرتاب نمیشه، مگه با throwOnHttpError: true




