۱۰۰ روز، ۸۷ ابزار، بدون هیچ سروری
من ۱۰۰ روز را صرف ساخت ToolKnit کردم. این مجموعهای از ۸۷ ابزار مبتنی بر مرورگر است.
بیشتر سایتهای ابزار به این صورت کار میکنند:
- شما یک فایل را آپلود میکنید.
- یک سرور آن را پردازش میکند.
- شما نتیجه را دانلود میکنید.
این یعنی فایلهای PDF و عکسهای حساس شما روی سرور شخص دیگری قرار میگیرند. من روش متفاوتی میخواستم. هر ابزار در ToolKnit کاملاً در مرورگر شما اجرا میشود. هیچ فایلی از دستگاه شما خارج نمیشود.
در ادامه، آنچه در مورد ساختن بدون بکاند (backend) آموختم را میخوانید.
پشته تکنولوژی (The Stack)
- HTML و Tailwind CSS.
- Vanilla JavaScript.
- PHP فقط برای آمارهای ساده.
- بدون هیچ فریمورکی. نه React و نه Vue.
چرا HTML استاتیک؟ ۱. سئو بهتر است. گوگل صفحات استاتیک را فوراً خزش (crawl) میکند. هیچ تأخیری برای hydration وجود ندارد. ۲. سرعت بالاتر است. کاربران بلافاصله به ابزارها دسترسی پیدا میکنند. آنها منتظر بارگذاری باندلهای بزرگ JavaScript نمیمانند. ۳. هزینهها پایین است. من تقریباً از هیچ قدرت پردازشی سروری استفاده نمیکنم.
چالشها ساخت ۸۷ صفحه بدون کامپوننت سخت است. اگر یک لینک در فوتر را تغییر دهم، باید ۸۷ فایل را ویرایش کنم. مجبور شدم برای مدیریت این کار، اسکریپتهای Python بنویسم.
محدودیتهای مرورگر را یاد گرفتم:
- فشردهسازی PDF سخت است. برای جلوگیری از خراب شدن فایل، نیاز به دستکاری پیچیده استریمها (stream manipulation) دارد.
- سنتز صدا عمیق است. ساخت یک صدای پیانوی واقعگرایانه به چندین اسیلاتور (oscillator) و هارمونیکهای سفارشی نیاز دارد.
- ویدیو سنگین است. استفاده از ffmpeg.wasm جواب میدهد، اما دانلود ۳۲ مگابایتی آن برای اتصالات کند، یک بار اضافی است.
بزرگترین درس من ویژگیهایی که تقریباً کار میکنند را حذف کنید.
من ابزاری برای Live Photos آیفون ساختم. این ابزار سه نقص اصلی داشت:
- محاسبات مربوط به گوشههای گرد در Canvas API اشتباه بود.
- ترنسکدینگ (transcoding) ویدیو خیلی طول میکشید.
- اپلیکیشنهایی مثل WeChat دادههای مورد نیاز من را حذف میکردند.
ابزاری که ۹۰٪ کار میکند، اعتماد را از بین میبرد. اگر عالی نیست، آن را منتشر نکنید.
قدم بعدی چیست؟ من اکنون در حال ساخت یک اپلیکیشن دسکتاپ با استفاده از Tauri و Rust هستم. این برنامه هم از همان قانون پیروی خواهد کرد: تمام پردازشها به صورت محلی (local) باقی میماند.
خلاصهای از ساخت ۱۰۰ روزه: • ۸۷ ابزار منتشر شد. • ۳ ابزار حذف شد. • بدون وابستگی به فریمورک. • بیش از ۳,۰۰۰ استفاده در مجموع.
آیا شما هم در حال ساخت ابزارهای سمت کلاینت (client-side) هستید؟ معماری خود را در کامنتها برای من بنویسید.
