solovyov.net

Gostatic: ещë один прекрасный блог-движок

3 min read · news, blog, gostatic

Очевидно, что раз написав движок для блога, остановиться уже невозможно. Я чувствую себя Асприном, который пишет очередную МИФическую историю (я даже попытался сделать отсылку на них в названии, но не думаю, что получилось).

Короче, ещë один. Зачем? Предыдущий тоже генерировал статику и хорошо при этом назывался, зачем менять? Ну, он тормозил. Скажем, в неудачный момент (кеш сбросился, етц) он мог 20 секунд генерировать мой блог. Раздражает, конечно. А еще мне что-то захотелось написать его на го, чтоб 1 бинарник в результате и никаких гвоздей с установкой чего-то там.

Я даже внимательно смотрел вокруг, думал может чьë-то чужое творение использую, не всë же велосипеды строить. Ну вот сейчас нашëл Stog, на окамле, его я раньше не видел. Был еще какой-то на окамле, у меня его не получилось собрать и он не умел зависимости (страниц друг от друга). Еще есть Hakyll, он компилируемый, умеет зависимости и вроде бы довольно быстрый, но у него есть критический минут - он на хаскеле. Ну т.е. круто, конечно, супер, но мне хватило уже конфигурации xmonad, плюс установки окружения в 40 минут и тому подобного. Не знаю, не решился я связать судьбу, смалодушничал.

Все остальные еще хуже, конечно, практически никто не умеет зависимостей, плюс пишут все эти генераторы если не на руби, то на питоне. Я даже пробовал как-то несколько разных, и оказалось, что Cyrax еще очень и очень быстрый. :)

Тем более велосипеды манят. :) Короче, я построил свой. На мой вкус, довольно быстрый - сайт из 250 страниц он рендерит за 0.3 секунды полностью. Еще 0.3 секунды рендерится мой цсс из бутстрапа (подлый тормоз!). Надо сказать, что на линуксе всë быстрее - там нормальная файловая система.

Умеет зависимости, маркдаун, конфигурируется через простой декларативный синтаксис - каждый файл имеет зависимости в виде других файлов и проходит систему фильтров. Никаких плагинов нет, к сожалению, всë либо уже сделано внутри функциями на Го, либо вызовами внешних команд. Внешние команды пока умеют только менять контент. Я думал над тем, как бы можно было это улучшить (т.е. сделать систему плагинов через вызовы команд), но ничего клëвого не придумал и решил, что мне пока не надо.

Имеет встроенный хттп-сервер и следилку за файлами, чтоб удобно было писать пост и в процессе на него поглядывать.

Интересно, что написал-то я его на Go, но горутины не использовал - так выходит только медленнее, всë завязано на ввод/вывод. Хотя только что перечитал про тормоза лесса и подумал, что надо разными горутинами процессить и писать на диск, первых иметь пул, а вторую - всего одну. Может позже поиграюсь.

Короче, он умеет всë, что надо. Вдруг кому захочется - пользуйтесь, в репозитории есть пример, еще есть мой блог на гитхабе, он сложнее внутри. В том же репозитории в README есть ссылки на бинарные сборки. Если вдруг у кого проснëтся желание улучшать, я буду вообще счастлив, так что велкам.

If you like what you read — subscribe to my Twitter, I always post links to new posts there. Or, in case you're an old school person longing for an ancient technology, put a link to my RSS feed in your feed reader (it's actually Atom feed, but who cares).

Other recent posts

Server-Sent Events (SSE), but with POST
ngrok for the wicked, or expose your ports comfortably
PostgreSQL collation
History Snapshotting in TwinSpark
Code streaming: hundred ounces of nuances