Как я не перешел с WordPress на Hugo, Gatsby и прочий Node

Периодически меня вместе с этим блогом охватывает творческое настроение — но не в плане что-нибудь написать (такое тоже бывает), а посовершенствовать его немного, сделать еще более быстрым, местами более гиковским, короче, как-то проапгрейдить.

Надо сказать, что я не очень расположен к большой разработке и люблю обходиться готовыми решениями — взять готовый движок, готовую тему, что-то подкрутить по мелочам и попользоваться результатом. И в какой-то момента у меня сошлись сразу несколько ощущений относительно несовершенства текущего решения.

Основное ощущение касается скорости. Нет, блог вроде не тормозит и ему хватает возможностей хостинга (а если бы не хватало, то увеличить не проблема), но работает небыстро и это в основном результат того, что он работает на том стеке, на котором работает — php+mysql, хоть и с агрессивным кэшированием.

Вместе с тем, меня более чем устраивает сам движок WordPress со всеми его богатейшими возможностями — благодаря тому, что его уже много лет развивают десятки тысяч человек, в нем можно сделать практически всё и уж точно всё, что может понадобиться небольшому блогу.

Я, впрочем, попробовать еще с месяц назад перенести контент в Ghost — который я помню еще в версии 0.1 и который вроде бы развился во что-то, но был достаточно сильно разочарован. После WordPress, где информация достаточно хорошо структурирована, в Ghost регулярно встречаются места, где предлагается просто написать вот так, чтобы оно выводилось красиво — это как, знаете, в Word-е секретарши делают шрифт пожирнее и побольше, чтобы получился заголовок, а редактор честно продолжает считать это обычным текстом, а не заголовком. Впрочем, особенно меня удивило отсутствие групповых операций — представьте себе блог с тысячами записей, где любое действие надо делать с одной отдельной записью! Тем более, что первое, что сделал Ghost с контентом — объявил всех пользователей блога, которых WordPress зарегистрировал как комментаторов (вы и сейчас можете так зарегистрироваться для комментария), просто авторами блога. Таких оказалось несколько десятков и никакого способа выбрать всех и сменить им роли или даже удалить не оказалось. Хотя показатели скорости публичной части прямо радовали, но пришлось отказать.

В результате я решил покопать тему Headless CMS. Упрощенно говоря, это такая конструкция, когда у вас отдельно есть сама CMS, которая управляет созданием и хранением контента, а отдельно — конструкция/фреймворк/генератор, который этот контент собирает в очень быстрый и часто — статический вебсайт и отвечает за его работу. Конструкция очень интересная — во-первых, она действительно красива логически, разделяя контент и его представление, во-вторых, она практически безопасна, поскольку даже критическая уязвимость публичной части вряд ли сможет сказаться на контенте. При этом на выходе получается действительно очень быстрый сайт.

Первая возможность, которую я исследовал, — как бы не отказываться от WordPress-а и заменить только головную часть блога, которую видят пользователи. Такая возможность есть, поскольку у WordPress по умолчанию есть Rest API, а с помощью плагина реализуется GraphQL API — пожалуйста, забирайте данные и собирайте из них что хотите.

Я попробовал несколько фреймворков — Next.js, Gatsby и Nuxt, тем более, что это довольно легко сделать с помощью облачных сервисов типа Netlify и Vercel — вы просто берете репозиторий на Github, даете его сервису и он сам собирает из него сайт. Если дать ему статический контент — соберет из него, дать контент через API из WordPress — терпеливо запросит и соберет из полученного.

Правда, тут надо оговориться. Этому блогу много лет и в нем много контента. 8 с лишним тысяч заметок, 16 тысяч комментариев, 800 картинок, итого несколько гигабайт контента, который тяжеловато тягать с места на места и тем более обрабатывать. Это осложняет процесс тестирования, хотя я пробовал ограничивать число запросов. И, конечно, накладывает свои требования.

Так вот, тестирование фреймворков закончилось некоторым разочарованием — получающиеся сайты были действительно быстрыми, но даже на ограниченных данных они строились довольно долго и в любом случае говорить о разумной скорости публикации не удавалось — новый контент отображался примерно минуты через две-три. Возможно, всё было бы быстрее, если не пользоваться готовыми CI/CD сервисами, а собрать свой, но там впереди нарисовалась еще одна проблема — некрасивость.

Ну, правда, при взгляде на подавляющее большинство (не такое уж многочисленное, кстати) предлагаемых шаблонов дизайна возникала мысль, что громоздить всю эту схему, модные фреймворки, кучу сервисов и так далее, чтобы в итоге получился академический стиль с гугл-шрифтами, это как-то слишком. Особенно, когда начинало казаться, что потому сайты такие и быстрые, что там выводить нечего. Итого, все доступные шаблоны выглядели странно, а пара коммерческих не желала работать с WordPress как источником контента.

В общем, несмотря на сильное нежелание, я пошел исследовать вторую возможность — перенос всего блога на другую платформу.

Тут особых вариантов не было — если не увлекаться совсем экзотическими форматами, то очевидный выбор — экспортировать блог в набор файлов в формате Markdown и использовать статический генератор типа hugo, который используется у нас на сайте подкаста Радио-Т.

Скрипт, переносящий контент, найти оказалось несложно, впрочем, результат его работы пришлось долго править руками — возможно, тому причиной опять-таки большой архив, причем созданный еще движком под названием «Movable Type», если кто такой помнит. Соорудить сайт на hugo оказалось на удивление несложно — в отличие от JS-фреймворков, у движка большое сообщество и немало прилично выглядящих шаблонов. При этом те же сервисы CI/CD позволяют собирать сайт и на базе hugo — опять же, только укажи им репозиторий и вперед.

В общем, я в итоге соорудил такой сайт. Правда, в процессе понял, что скорость публикации меня устраивает еще меньше — на этот раз работа шла с полными данными и сборка сайта занимала примерно 15-20 минут. Правда, кажется, это особенность как раз конкретных сервисов — они заводились от изменений в репозитории, клонировали весь репозиторий целиком, потом, видимо, собирали необходимое окружение, генерировали весь сайт и начинали его деплоить, загружая собственно на хостинг. Но даже локальная сборка у меня на ноутбуке занимала 70 секунд, пересобирая весь сайт — не очень понятно, зачем это делать, если добавляется один пост, например, что отражается примерно в пяти файлах максимум. Это удручает — вы написали текст, обнаружили орфографическую ошибку уже на готовом сайте и теперь её исправление займет 20 минут.

Впрочем, когда я решил попробовать что-то туда написать, стало еще печальнее. Вы помните, я говорил о богатых возможностях WordPress — причем, очень большую часть в них занимают возможности редактора. Так вот, практически единственный способ создания текстов в данном случае выглядит так — возьмите текстовый редактор и напишите в нем файл со всеми служебными полями. Есть какое-то количество онлайн-редакторов (на самом деле их примерно два), позволяющих ввести текст и как-то его отправить в репозиторий, но их возможности гораздо беднее нынешнего редактора WordPress, у них какие-то свои настройки, которые еще где-то лежат и при всём это совершенно не факт, что они заработают. Конечно, в мире больших сайтов есть те самые Headless CMS типа Strapi или Contentful, но они сами по себе или платные, или требуют отдельной установки и это перестает помещаться в рамки персонального блога.

Переходя на статический сайт, возникает еще одна проблема — что делать с комментариями? Они, во-первых, есть за все эти годы, и, во-вторых, я надеюсь, еще будут. Чтобы их как-то включить на статических страницах, требуется использовать что-то типа disqus или даже remark42 от нашего уважаемого Umputun-а. Но это либо еще один комплекс для установки и настройки, либо сторонний сервис. Кроме того, установка disqus моментально роняет скорость загрузки — он сам по себе загружает около 400 кБ библиотек, графики и чего-то еще. И вся затея по оптимизации сайта становится немного бессмысленной.

В общем, как я уже всё названием, я решил, что вся эта технология еще не готова к тому, чтобы переносить на неё мой блог. Хотя это, конечно, прикольно и можно поиграться, развивая любознательность, но, если хочется именно писать тексты, а не разрабатывать блог — пока ничего лучше WordPress нет.

Впрочем, если у вас есть какой-то особенный способ решить те проблемы, которые я описал — делитесь, с удовольствием попробую.