Устройство

Как устроен этот сайт

Проще всего показать подход на том, что у вас перед глазами. Этот сайт — сам по себе демонстрация: статика без бэкенда, свой движок, сборка из Markdown и несколько вещей, которых обычно не делают.

Ничего не выполняется на сервере

Каждая страница — заранее собранный HTML-файл. Нет базы данных, нет PHP, нет админки, нет плагинов, которые надо обновлять. Сервер только отдаёт готовые файлы.

Отсюда следуют вещи, за которые обычно платят отдельно: страница открывается мгновенно, сайт не падает от наплыва посетителей, его нечего взламывать через форму входа, а хостинг стоит ноль рублей — это GitHub Pages.

Обратная сторона честная: всё, что требует сервера, приходится делать иначе. Заявки уходят через внешний сервис, поиск работает в браузере, а ассистент живёт отдельным сервисом на другом адресе. Как это устроено в чужих проектах — в разборе про заявки с сайта без бэкенда.

Движок свой, и он открыт

Сайт собран на Notepub — генераторе статических сайтов, который я написал сам. Исходники открыты, лежат на GitHub.

Содержимое — обычные Markdown-файлы с полями в шапке. Правила лежат отдельным файлом: какие бывают типы страниц, по каким адресам они живут, какие коллекции из них собираются. Добавить новый тип страниц — это правка правил, а не программирование.

Практическое следствие: страницу правит тот, кто пишет текст. Не через админку, где половина полей непонятна, а в текстовом файле, где видно всё сразу.

Сотни страниц из одной таблицы

Отдельный случай — когда однотипных страниц должно быть много: услуга в каждом городе, разделы каталога, справочник объектов. Такие страницы не пишут руками.

В демонстрационном каталоге десять услуг и пятнадцать городов дают сто пятьдесят посадочных страниц. Добавить город — это одна строка в таблице: пересобираются все страницы, меню и перелинковка. Подробнее о том, где такой подход работает, а где превращается в мусор, — в разборе про страницы под города.

Карта для языковых моделей

В корне сайта лежит файл llms.txt: весь сайт одним списком, по предложению на страницу. Он существует, потому что модели теперь читают сайты наравне с людьми, а разбирать смысл из вёрстки — плохой способ.

Главное в нём не формат, а то, что он собирается из тех же полей, что и сами страницы. Не может устареть или разойтись с сайтом: если страница появилась, она в нём есть, если исчезла — её нет. Файл, который поддерживают руками, врёт через месяц.

Ассистент, который отвечает по сайту

Тот же принцип доведён до конца. При сборке сайт режется по заголовкам разделов и публикует индекс: каждый кусок текста со своим точным адресом. Ассистент в углу страницы ищет по этому индексу и отвечает только тем, что нашёл, — со ссылкой на конкретный раздел, а не на страницу целиком.

Отсюда его поведение, непривычное для чат-виджетов: на вопрос, ответа на который на сайте нет, он говорит, что ответа нет. Не выкручивается и не переводит разговор на соседнюю тему. Цену он тоже не называет — её здесь нет намеренно.

Знание обновляется само: выложил сайт — ассистент уже знает про новую страницу. Как это устроено внутри и почему «память» в таких штуках — это три разные вещи, разобрано в отдельной статье.

Сборка повторяема

Две сборки одного и того же содержимого дают побайтно одинаковый результат. Звучит как мелочь, но без этого нельзя посмотреть, что именно изменилось в сайте после правки: половина файлов отличалась бы просто так.

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

Компоненты работают без библиотек

Калькулятор, план объекта и календарь брони на этом сайте — не картинки и не встроенные чужие виджеты. Это работающие компоненты на обычном JavaScript, без внешних зависимостей: их можно потрогать прямо на странице услуги.

Без библиотек — не из принципа, а потому что каждая внешняя зависимость это чужой код, чужие обновления и чужая скорость загрузки на вашей странице.

Что из этого важно заказчику

Три вещи, остальное — детали реализации.

Скорость и надёжность достаются даром. Не потому что что-то оптимизировали, а потому что отдавать готовый файл нечему ломаться.

Нет ежемесячных платежей за сам сайт. Ни за хостинг, ни за CMS, ни за плагины. Платить приходится только за то, что действительно требует сервера.

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

Следующий шаг

Нужен такой же?

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

© Антон Ложкин Проекты под NDA в подборку не входят.