لوکالفرست؛ یه کلمه با سه معنی متفاوت
خلاصهٔ کاملتر
بارت (Bart)، سازندهٔ فریمورک Hologram، تو این مقاله میگه local-first (یعنی اپ اول با یه نسخهٔ محلی از داده کار میکنه و بعد همگامسازی میکنه) برای هر کسی یه معنی داره. تعریف خودش اینه: رابط کاربری هیچوقت منتظر شبکه نمیمونه. خوندن و نوشتن روی نسخهٔ محلی انجام میشه و همگامسازی پشت صحنه هر وقت تونست اتفاق میافته. به نظر نویسنده آفلاین بودن فقط کندترین حالت شبکهست، پس سرعت و آفلاین در اصل یه مسئلهان.
سه معنی اصلی اینها هستن. مالکیت: این اصطلاح از مقالهٔ سال ۲۰۱۹ آزمایشگاه Ink & Switch اومده که مارتین کلپمن و همکارانش نوشتن و هفت تا آرمان داره. حرف اصلیش اینه که نسخهٔ روی دستگاه خودت نسخهٔ واقعیه و سرور فقط یه جای دیگه برای همگامسازیه. آفلاین: بیشتر sync engineها (یعنی ابزارهایی که دادهٔ کلاینت و سرور رو خودکار هماهنگ نگه میدارن) منظورشون اینه که اپ بیاینترنت هم کار کنه. سرعت: کلیک میکنی و کار همون لحظه انجام میشه، چیزی که Linear معروفش کرد.
نویسنده میگه احتمالاً نصفش رو قبلاً خودت ساختی. مثلاً تو TanStack Query برای یه optimistic update (یعنی نشون دادن نتیجه قبل از جواب سرور) باید درخواستهای در جریان رو لغو کنی، یه snapshot نگه داری، آیتم رو تو کش بنویسی، اگه سرور رد کرد برگردونی و آخرش دوباره fetch کنی:
onMutate: async (todo) => {
await queryClient.cancelQueries({ queryKey: ["todos"] })
const previous = queryClient.getQueryData(["todos"])
queryClient.setQueryData(["todos"], (old) => [...old, todo])
return { previous }
},این فقط برای یه mutation هست. تو local-first هر نوشتنی اول میره تو دیتابیس محلی و همگامسازی کار خود دیتابیسه، پس این مشکل یه بار برای کل اپ حل میشه. نکتهٔ جالب اینه که آفلاین و چنددستگاهی هم از همین کار درمیان. حتی اپ تککاربره هم وقتی گوشی و لپتاپ داری، مسئلهٔ همکاری داره. پخش پیام با WebSocket هم جواب نمیده، چون کلاینتی که آفلاین بوده پیام رو از دست میده.
چرا معنیها از هم جدا شدن؟ به خاطر تداخلها. CRDTها (ساختار دادههایی که هر دو نسخه رو به یه نتیجهٔ یکسان میرسونن) فقط قول میدن نسخهها یکی بشن، نه اینکه نتیجه منطقی باشه. مثال مقاله: دو نفر آفلاین صندلی 14C یه پرواز رو رزرو میکنن و بعد از همگامسازی دو مسافر روی یه صندلی میمونن. برای همین بیشتر ابزارها یه سرور رو مسئول قوانین میکنن. Zero با همین طراحی میگه local-first نیست، ولی Jazz چون نوشتن آفلاین داره خودش رو local-first میدونه.
هزینهها هم کم نیستن: هر کلاینت فقط باید یه برش از داده رو بگیره، کلاینتهای قدیمی با schema قدیمی برمیگردن، Safari ممکنه بعد از هفت روز سر نزدن حافظهٔ سایت رو پاک کنه، و کارهایی مثل پرداخت نباید خوشبینانه انجام بشن. Hologram (فریمورکی که کل اپ رو با Elixir مینویسی و بخش مرورگرش به JavaScript کامپایل میشه) همین تعریف اول رو پیاده میکنه: سرور مسئول مجوزها و قوانین میمونه و رمزنگاری سرتاسری برای فیلدهای انتخابی هم تو برنامهست.
نکات کلیدی:
- اصطلاح local-first از مقالهٔ ۲۰۱۹ Ink & Switch اومده که روی مالکیت داده تمرکز داشت
- سه معنی رایج: مالکیت داده، کار بدون اینترنت، و سرعت بدون اسپینر
- CRDTها همگرایی رو تضمین میکنن ولی قوانین اپ مثل یکتایی صندلی یا موجودی انبار رو نمیفهمن
- Zero چون سرور مسئول داره خودش رو local-first نمیدونه، Jazz با طراحی مشابه میدونه
- Safari ممکنه بعد از ۷ روز بیاستفاده بودن، حافظهٔ ذخیرهشدهٔ سایت رو پاک کنه
- Hologram با Elixir نوشته میشه و قراره رمزنگاری سرتاسری انتخابی و CRDT رو هم اضافه کنه




