Сайт із собою:
HTML без інтернету
Пакуємо Котку, шрифти й блокнот. Сервер залишаємо вдома — і чесно пояснюємо, що офлайн-копія вміє, а чого ні.
Одразу до кодуЩо саме означає «без інтернету»
Kotka.dev починався зі звичайних HTML, CSS і JavaScript. Нам потрібна копія, яку можна розпакувати й показати без запущеного сервера: з тими самими шрифтами, котячими фото, нотатками й перемикачем мови. Зберегти лише HTML замало: під’єднані картинки та скрипти залишилися б окремо.
Наше рішення — копія для передачі, а не новий формат вихідного коду. Кожна сторінка містить власні ресурси, а ZIP збирає сторінки разом. Файли для редагування залишаються окремими. Це підходить невеликому статичному сайту, але не перетворює серверний застосунок на офлайн-застосунок.
Запакуй залежності, а не лише сторінку
- Вбудуй стилі й скрипти
Збирач вставляє наш CSS в елементstyle, а кожен звичайний скрипт — уscript. Порядок не змінюється: дані нотаток, інтерфейс, блокнот. - Вбудуй локальні зображення та шрифти
Байти картинок стають data URL. Те саме відбувається з адресами шрифтів і фактур у CSS. Перевір також favicon і картинки в data-атрибутах, не лише великий hero. - Заміни внутрішні адреси
Посилання наnotes.htmlмає вести доkotka-notes-standalone.html. Шляхи статей усередині JavaScript потребують такого самого перетворення. Параметр мови та якір секції треба зберегти.
Data URL містить тип медіа та закодований вміст: наприклад, data:image/webp;base64,…. Це не запит до віддаленої картинки. Тип має відповідати справжньому файлу, а не оманливій назві в адресі завантаження. MDN: data URL
Маленька функція, яка виявилася важливою
Коли перевіряли обкладинку PPC4 у зібраному HTML, виявили, що її WebP-дані позначені як application/octet-stream. Той браузер усе одно показував зображення, але покладатися на таке розпізнавання було зайвим. Тепер збирач задає типи сучасних зображень явно.
Це справжня функція з tools/build-standalone.py з імпортами, потрібними для окремого запуску. Виклич data_uri(pathlib.Path("assets/img/project-ppc4-hero.webp")), щоб отримати рядок для адреси зображення. Функція вбудовує один файл, а не переписує весь сайт самотужки.
Python 3 · data_uri()
import base64, mimetypes, pathlib
def data_uri(path: pathlib.Path) -> str:
# Windows MIME registry entries may omit modern image types.
known_types = {".woff2": "font/woff2", ".webp": "image/webp", ".avif": "image/avif"}
mime = known_types.get(path.suffix.lower()) or mimetypes.guess_type(path.name)[0] or "application/octet-stream"
return f"data:{mime};base64,{base64.b64encode(path.read_bytes()).decode()}"
База mimetypes у Python може залежати від операційної системи, зокрема реєстру Windows. Явна таблиця робить ці три типи ресурсів передбачуваними в нашому пакеті. При цьому ми все ще очікуємо, що розширення файлів правильні. Python: mimetypes
У теці проєкту Kotka.dev запусти дві команди нижче. Для збирання потрібен Python 3, для автоматичних перевірок — Node.js. Жодна команда не встановлює сторонніх пакетів. Збирач перезаписує згенеровані HTML та ZIP у dist, тому редагуй вихідні сторінки, а не ці файли.
Terminal · Kotka.dev
python tools/build-standalone.py
node tools/check-notebook.cjsРозпакуй dist/kotka-dev-offline.zip, залиш HTML-файли в одній теці й відкрий kotka-dev-standalone.html. Кожна сторінка містить свої ресурси, але сторінки, на які вона посилається, — окремі файли. Якщо надіслати лише головну, цих переходів не буде.
Перевір саме ту копію, яку передаєш
- Перевір зібраний HTML на залишки локальних шляхів до ресурсів і назв вихідних сторінок. Наші тести також порівнюють вбудовані байти проєктних зображень з оригіналами.
- Відкрий розпаковану головну в потрібному браузері без мережі. Пройди до архіву, статті й назад; перевір, чи не зникли шрифти або картинки.
- Перемкни UA / EN / PL і перейди за посиланням. Офлайн наші посилання містять
?lang=(на сайті мова — частина адреси, як-от/pl/); необов’язковий local storage не має бути єдиним способом зберегти мову. - Не обіцяй зайвого: англійський текст статей — статичний HTML, а переклад, пошук і перемикання блокнота потребують JavaScript.
Автоматичні перевірки контролюють згенеровані шляхи, вбудовані ресурси та синтаксис скриптів. Перегляд через localhost перевіряє вигляд і взаємодії. Це корисно, але не тотожно відкриттю файла з диска: перевірка файлового режиму в браузері одержувача лишається окремим фінальним кроком.
Корисна копія, не універсальний пакувальник
Наш збирач знає конкретну розмітку й шляхи Kotka.dev. Його точкові заміни не охоплюють довільні сайти, модульні імпорти, всі варіанти CSS-адрес чи серверні маршрути. До того ж вбудовані ресурси повторюються між сторінками. Для більшого сайту доречнішою може бути тека зі спільними ресурсами або повноцінна система збирання.
Для цього невеликого портфоліо компроміс свідомий: зрозумілий пакет, який можна перевірити й передати. Котка подорожує всередині. Її зовнішні посилання інтернет із собою не пакують.