بکاند داخل مرورگر؟ با WASM و OPFS ممکنه!
خلاصهٔ کاملتر
مدل رایج SaaS اینه که مرورگر کاربر فقط یه صفحه رو رندر میکنه و برای هر عملیات، یه درخواست HTTP به سرور میفرسته. سرور داده رو پردازش میکنه، توی دیتابیس خودش ذخیره میکنه، و اشتراک ماهانه هم بابت همین «نگهداری داده» توجیه میشه. این معماری برای ابزارهای مشارکتی یا پردازشهای سنگین منطقیه، ولی برای دادههای شخصی و تککاربره، فقط سربار و تأخیر اضافه میکنه.
راهحل پیشنهادی اینه که بکاند رو مستقیم پیش کاربر بفرستیم. دو تکنولوژی این کار رو ممکن میکنن: WASM (WebAssembly) که بهت اجازه میده هر زبانی رو به یه باینری کامپایل کنی که مرورگر بتونه اجراش کنه، و OPFS (Origin Private File System) که یه API فایلسیستم واقعی با ذخیرهسازی پایدار توی مرورگره. با این دو تا، SQLite میتونه مستقیم روی دیسک کاربر اجرا بشه، بدون هیچ سروری.
از نظر معماری، بکاند داخل یه Web Worker اجرا میشه — یه ترد جداگانه از UI — تا کوئریهای سنگین رابط کاربری رو فریز نکنن. ارتباط بین UI و Worker از طریق postMessage() انجام میشه: فرانتاند یه پیام با نوع و payload میفرسته، Worker اون رو پردازش میکنه و نتیجه رو برمیگردونه.
به عنوان اثبات مفهوم، نویسنده یه Time Tracker ساخته که بکاندش با Go نوشته شده و به WASM کامپایل شده. برای اتصال SQLite به OPFS از ماژول danmestas/go-sqlite3-opfs استفاده شده که یه لایه VFS (Virtual File System) فراهم میکنه تا Go فکر کنه با یه فایل معمولی کار میکنه، ولی در واقع داده روی OPFS ذخیره میشه:
const root = await navigator.storage.getDirectory();
// Getting handles for each SQLite related file
const handles = {};
for (const suffix of ["", "-journal", "-wal"]) {
const name = "track.db" + suffix;
const fh = await root.getFileHandle(name, { create: true });
}نکات کلیدی:
- مدل SaaS برای دادههای شخصی و تککاربره معماری اضافی و پرهزینهای داره
- با WASM میشه بکاند رو به هر زبانی نوشت (Go، C، Rust و ...) و توی مرورگر اجرا کرد
- OPFS یه فایلسیستم واقعی با ذخیرهسازی پایدار توی مرورگر فراهم میکنه
- Web Worker بکاند رو از UI جدا میکنه تا پردازشهای سنگین UI رو مسدود نکنن
- این رویکرد نیاز به احراز هویت و سرور رو برای اپهای شخصی حذف میکنه




