kage؛ آرشیو آفلاینِ سایت بدون هیچ کد و اسکریپتی
خلاصهٔ کاملتر
به گفتهٔ سازنده، kage یه ابزاره که یه سایت رو مثل یه «سایه» فریز میکنه: هر صفحه رو تو کروم headless رندر میکنه، DOM نهایی رو اسنپشات میگیره، همهٔ اسکریپتها و هندلرهای رویداد رو برمیداره و بعد CSS، عکسها و فونتها رو دانلود و بازنویسی میکنه. حاصلش یه فولدر ساده از فایلهای html هست که شکل سایت زنده رو داره ولی هیچ کدی اجرا نمیکنه و میتونی مستقیم از روی دیسک بازش کنی.
مشکلی که این ابزار حل میکنه اینه که «Save As» مرورگر یه کپی بهت میده که هنوز به سرور زنگ میزنه، هنوز آنالیتیکس اجرا میکنه و اغلب خالی رندر میشه، چون مارکآپ در زمان اجرا با جاوااسکریپت ساخته میشه. اسم kage از واژهٔ ژاپنی 影 به معنی «سایه» گرفته شده و رویکرد برعکسی داره: یه مرورگر واقعی رو میرونه، صفحه رو همونجوری که یه آدم میدیده میگیره و بعد بیجانش میکنه.
نویسنده یه مثال میزنه: فرض کن مقالههای Paul Graham رو رو یه لپتاپ بدون وایفای میخوای. یه دستور کل سایت رو آینه (mirror) میکنه و یه دستور دیگه اونو آفلاین سرو میکنه:
kage clone paulgraham.com
kage serve paulgraham.com
نویسنده چند ویژگی اصلی رو برمیشمره. اول اینکه kage «اول رندر میکنه، بعد ذخیره»؛ چون هر صفحه از کروم headless واقعی رد میشه، صفحهای که محتواش با جاوااسکریپت ساخته میشه هم کامل گرفته میشه، نه به شکل یه پوستهٔ خالی. دوم اینکه بعد از گرفتن DOM، همهٔ تگهای اسکریپت، همهٔ هندلرهای on* و هر URL از نوع javascript رو حذف میکنه، پس صفحهٔ ذخیرهشده هیچ زنگی به شبکه نمیزنه.
نکتهٔ بعدی حفظ ظاهره: استایلشیتها، عکسها، فونتها و مدیا دانلود و به مسیرهای محلی نسبی بازنویسی میشن تا کپی آفلاین شکل نسخهٔ اصلی رو داشته باشه. لینکهای داخلِ محدوده هم بازنویسی میشن تا به بقیهٔ صفحات ذخیرهشده اشاره کنن، پس میتونی دقیقاً مثل سایت زنده توش کلیک کنی و بچرخی.
نویسنده اضافه میکنه که یه آینه رو میشه تو یه فایل واحد جمع کرد: یا به شکل آرشیو ZIM (همون فرمت بازی که Kiwix استفاده میکنه) یا یه باینری خودبسنده که وقتی اجراش کنی خودش سایت رو سرو میکنه. اگه kage رو با تگ webview بیلد کنی، اون باینریِ بستهبندیشده تو پنجرهٔ خودش باز میشه بهجای یه تب مرورگر، پس آینهٔ آفلاین بیشتر شبیه یه اپ واقعی حس میشه.
نکات کلیدی:
- kage هر صفحه رو تو کروم headless رندر میکنه و DOM نهایی رو اسنپشات میگیره، پس محتوای ساختهشده با جاوااسکریپت هم کامل گرفته میشه
- همهٔ اسکریپتها، هندلرهای on* و URLهای javascript حذف میشن؛ کپی نهایی هیچ کدی اجرا نمیکنه و به شبکه زنگ نمیزنه
- CSS، عکس، فونت و لینکهای داخلی به مسیرهای محلی بازنویسی میشن تا ظاهر و قابلیت کلیککردن حفظ شه
- کل آینه رو میشه تو یه آرشیو ZIM یا یه باینری خودبسنده جمع کرد
- با تگ بیلد webview، باینری بستهشده تو پنجرهٔ خودش باز میشه و مثل یه اپ آفلاین حس میده




