Gwtar؛ یه فایل HTML که مثل تاربال تکهتکه لود میشه
خلاصهٔ کاملتر
به گفتهٔ Gwern، آرشیوکردن HTML یه تریلما داره: یه فرمت آرشیو میتونه نهایتاً دوتا از این سه خاصیت رو با هم داشته باشه — «خودبسنده» (همهٔ asset داخلشه و به سایت اصلی وابسته نیست)، «تکفایل» (یه فایل ساده، نه یه پوشه)، و «بهینه» (فقط بخشهای لازم برای نمایش دانلود بشن). ابزارهای فعلی همیشه یکیشون رو قربانی میکنن.
مثلاً SingleFile خروجی خودبسنده و تکفایل میده، ولی بهینه نیست: یه snapshot میتونه صدها مگابایت بشه (یه نمونه روی gwern.net بعد از بهینهسازی ۴۸۵ مگابایت!) و کاربر مجبوره کل فایل رو دانلود کنه. WARC بهینه و خودبسندهست ولی برای نمایش به نرمافزار خاص نیاز داره، پس واقعاً تکفایل نیست.
Gwtar (تلفظ «گیتار») هر سه رو با هم میگیره. ساختارش اینه: یه فایل HTML کاملاً inlineشده، بعد پردازش میشه به یه فایل خوداستخراج: یه هدر HTML + JS، و پشتسرش یه تاربال از HTML اصلی و assetها. هدر یه JSON از فایلها با اندازه، نوع و هش SHA-256 هم نگه میداره.
هستهٔ ترفند، فرمان window.stop()ـه. به گفتهٔ Gwern، Said Achmiz فهمید که میشه از داخل خود صفحه جلوی ادامهٔ دانلود رو گرفت؛ پس مرورگر هدر رو میخونه، window.stop() صدا زده میشه و بقیهٔ فایل (تاربال) دانلود نمیشه. بعد JS هدر با HTTP Range فقط HTML اصلی و بعد assetهای لازم رو از داخل همون فایل میخونه.
درخواست assetها عمداً به آدرسهای خراب (روی 0.0.0.0) اشاره میکنن تا اول 404 بشن؛ JS اون خطا رو میگیره و به یه Range request درست توی تاربال تبدیلش میکنه. assetهای باینری هم بهجای Base64 با blob مستقیم به مرورگر داده میشن تا حافظه و پردازش هدر نره.
مزیت بزرگش اینه که فقط به قابلیتهای استاندارد و قدیمی مرورگر و سرور تکیه داره، پس forwards-compatibleـه و هیچ هاست یا کاربر آیندهای لازم نیست رفتار خاصی باهاش بکنه. اگه JS اجرا نشه، یه پیام noscript و در نهایت دانلود کل فایل بهعنوان فالبک هست. تنها ضعف اصلی، نمایش محلی فایله که بهخاطر محدودیتهای CORS/مبدأ مرورگر میشکنه؛ ولی فایل رو راحت میشه به HTML معمولی برگردوند.
نکات کلیدی:
- آرشیو HTML یه تریلماست: خودبسنده، تکفایل، بهینه — فقط دوتا با هم
- Gwtar هر سه رو با ترکیب window.stop() و HTTP Range میگیره
- ساختار: هدر HTML+JS و پشتسرش یه تاربال از HTML و assetها
- assetها فقط وقتی لازم شن با Range request از داخل فایل خونده میشن
- فقط به قابلیت استاندارد مرورگر/سرور نیاز داره؛ ضعفش نمایش محلیه




