Мой сайт sccl.cc изначально был на Astro.
Astro - штука прикольная.
Для быстрого клепания чего-нить красивого неплох, но со временем он меня начал бесить:
Тяжёлый рантайм. Чтобы собрать сайт, надо тянуть Node.js, npm, node_modules на сотню мегабайт. Для одной статики.
Сложность. Astro умеет всё: острова, ssr, эндпоинты, middleware. А у меня сайтец на три страницы: контакты, проекты, периферия, многого ненадо.
Альтернативы?
Мне попался Zine.
Zine - это SSG на Zig. Один бинарник, без зависимостей.
Шаблоны на SuperHTML - это валидный html, в который добавили темплейтинг. Никаких {{ }}, никаких Pug/Jade. Просто html с атрибутами типа :text, :if, :loop.
Контент на SuperMD - расширенный .md без необходимости лезть в html.
Процесс переезда
В целом переехать достачно просто - над переписать лэйауты с Astro на SuperHTML, перекинуть уже имеющеся скрипты. Самое муторное эт, что astro юзает свои блядские .astro файлы со своей странной смесью js и html, а SuperHTML это просто html с плюхами.
Деплой
Zine скомпилен в standalone-бинарник со статической линковкой. Никаких зависимостей и рантаймов - скачал, запустил. В npm его нет, из пакетных менеджеров не установишь. Значит над как-то доставлять его на раннер.
Мысли:
- качать curl-ом при каждом билде
- закоммитить в репозиторий
Первый вариант - костыль. Второй звучит надёжнее…
Пихаем в репу
Первая мысль была - закоммитить zine в репозиторий, чтоб билдилось из коробки:
cp /tmp/zine bin/zine
git add bin/zine && git commit
git push
> remote: error: File bin/zine is 152.19 MB; this exceeds GitHub's file size limitИ тут вспоминается, что GitHub не пускает больше 100 МБ.
пора хостить свой git
может быть… потом…
Ок, откатываем, делаем вид, что ничего не было. Лезем в доку Zine - там рекомендуют kristoff-it/setup-zine@v1 в GitHub Actions.
GitHub Actions
Пихаем kristoff-it/setup-zine@v1 в gh actions:
- uses: kristoff-it/setup-zine@v1
with:
version: v0.11.3
- run: zine release
- uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy public/ --project-name sccl-ccВсё логично: экшен ставит zine, zine билдит сайт, wrangler пушит на cf pages.
Из секретов нужны только CLOUDFLARE_API_TOKEN и CLOUDFLARE_ACCOUNT_ID
(права Account → Cloudflare Pages → Edit).
над было сразу по доке следовать, но хотелось изначально без gh actions делать
Плюшки?
Скорость. Билд за миллисекунды вместо секунд.
Простота. Нет node_modules. Нет package-lock.json. Нет сотен зависимостей. Один бинарник, папка с контентом, папка с шаблонами.
Контроль. Я знаю, что в каждой строчке сгенерированного HTML. Никакого скрытого JS, который Astro добавляет по умолчанию.
Минусы?
Zine в бете.
Документация местами бедная. Сообщество маленькое. Если что-то сломалось - ты первый, кто это заметил.
Но для личного сайта это топ.
Один бинарник, пара .smd-файлов, один лэйаут и готово.