kage: سایت رو آفلاین میکنه و جاوااسکریپتش رو میکنه بیرون
خلاصهٔ کاملتر
مشکلی که kage حلش میکنه آشناست: روی یه صفحه «Save As» میزنی و شش ماه بعد که بازش میکنی یا صفحهٔ سفید میبینی، یا یه اسپینر که هیچوقت تموم نمیشه، یا یه نسخه که هنوز داره به یه سرور آنالیتیکس که دیگه وجود نداره زنگ میزنه. به گفتهٔ سازنده اون صفحه هیچوقت واقعاً مال تو نبوده؛ فقط یه پوستهٔ نازک بوده برای جاوااسکریپت یه نفر دیگه.
kage (به ژاپنی یعنی «سایه») راه دیگهای میره: یه مرورگر واقعی رو هدایت میکنه، میذاره صفحه هر کاری میخواد بکنه تموم بشه، نتیجهٔ نهایی رو میگیره و بعد هر اسکریپتی رو ازش میکنه بیرون. نه ترکینگی میمونه، نه درخواست شبکهای؛ فقط فایلهای .html که مستقیم از روی دیسک باز میشن. خروجی شبیه سایت زندهست ولی هیچ کدی اجرا نمیکنه.
حلقهٔ اصلی کار سادهست: با kage clone سایت رو میگیری و با kage serve آفلاین توی مرورگر میخونیش. مثلاً برای آرشیو کردن مقالههای Paul Graham:
kage clone paulgraham.com
kage serve $HOME/data/kage/paulgraham.comنویسنده میگه clone یه خزش مؤدبانه و breadth-first هست: فایل robots.txt رو میخونه، خودش رو از sitemap.xml seed میکنه و تا وقتی نگی، روی همون هاست اصلی میمونه. این فرایند idempotent هم هست؛ هر صفحه با فایلی که مینویسه کلید میخوره، پس همون مقاله چه با http چه https و چه با اسلش آخر و چه بدونش، دقیقاً یه بار گرفته میشه. Ctrl-C بزنی جای خودش رو ذخیره میکنه و دفعهٔ بعد از همونجا ادامه میده.
بعد از clone میتونی کل میرور رو با kage pack توی یه فایل جمع کنی. یه گزینه فرمت ZIM هست؛ همون فرمت باز و استانداردی که پشت پروژهٔ Kiwix قرار داره و مردم باهاش ویکیپدیا و Stack Overflow و Project Gutenberg رو آفلاین میبرن. چون ZIM یه استاندارد مستنده و اختراع خود kage نیست، فایلی که امروز میسازی سالها بعد هم توی هر ریدر ZIM باز میشه و قفل یه ابزار خاص نمیشی.
گزینهٔ دیگه --format binary هست که آرشیو رو میچسبونه به یه کپی از خود kage و یه فایل اجرایی مستقل بهت میده که وقتی اجراش کنی سایت رو آفلاین سرو میکنه؛ کسی که میفرستی براش به هیچی نیاز نداره، نه kage نه ریدر ZIM. هزینهش حجمه: این باینری چون کل kage رو با خودش حمل میکنه حدود ۱۳ مگابایت بهعلاوهٔ خود سایت وزن داره، پس وقتی فقط محتوا رو میخوای، ZIM خیلی سبکتره.
از نظر معماری، یه استخر از تبهای کروم صفحهها رو رندر میکنه و یه استخر جدا assetها رو روی HTTP ساده میگیره. هر URL بهصورت قطعی به یه مسیر محلی نگاشت میشه، برای همین لینکها قبل از اینکه asset مقصد حتی دانلودش تموم بشه بازنویسی میشن. خود ریپو هم بهتفکیک مسئولیت تقسیم شده (پوشههای clone، browser، sanitize، asset، zim، pack و غیره) و پروژه با لایسنس MIT منتشر شده.
نکات کلیدی:
- kage سایت رو با کروم headless واقعی رندر میکنه و از DOM نهایی اسنپشات میگیره
- همهٔ جاوااسکریپت حذف میشه؛ خروجی فایل HTML تمیزه بدون ترکینگ و درخواست شبکه
- حلقهٔ اصلی: kage clone بعد kage serve برای خوندن آفلاین
- خزش breadth-first، احترام به robots.txt، seed از sitemap، idempotent و قابلازسرگیری
- میشه میرور رو توی فایل ZIM استاندارد (سازگار با Kiwix) یا یه باینری مستقل بستهبندی کرد
- نوشتهشده با Go، لایسنس MIT




