Уроки обновления блога
Astro, Tailwind, MDX, Pagefind и многое другое!
Недавно я начал процесс обновления своего сайта на Gatsby v1, которому больше 8 лет.
Этот пост расскажет о том, какие уроки я вынес в ходе этой работы и какие интересные технологии я исследовал.
Содержание
- Требования к проекту
- Выбор подходящей стек-технологии
- Astro: кривая обучения и ключевые особенности
- Современный CSS: удивительно
- Поиск: Pagefind
- Комментарии: Utterances
- Tailwind: сожаления
- Заключение
Требования к проекту
Перед началом обновления я определил набор требований:
Поскольку мой блог получает очень изменчивое количество ежедневных просмотров страниц, я чувствовал, что предварительно сгенерированный статический сайт обеспечит нужную производительность без дополнительной сложности.
Кроме того, мне нужно было сохранить существующий контент и функции сайта, включая:
- Выделение кода
- Комментарии
- Поиск по сайту
- Существующие React-компоненты: интерфейс опроса, встроенные Gist
- Форма обратной связи
- Адаптивные изображения
- Загрузка менее чем за 1 секунду
- Совместимость с браузерами: 2018+
- Автоматизированные + основанные на pull-запросах деплои
Выбор правильной технологической стеки
В течение лет я работал с множеством инструментов для статических сайтов, от Jekyll, Hugo, Slate и Gatsby. А также с множеством фронтенд-фреймворков: Ember, Knockout, Angular, Vue и, конечно, React.
Именно из-за этого у меня оказалось слишком много вариантов, которые я в конечном итоге сузил до Remix, Next.js и Astro,
Я мог бы написать целую серию статей о процессе оценки, но здесь я кратко изложу его:
Я выбрал Astro, потому что смог быстро делать значимые вещи.
Их дизайн API поразительно прост. Это хороший баланс между гибкостью и хорошими дизайнерскими решениями.
Было немного успокаивающе, что Astro не имеет явного предпочтения облачным решениям или амбиций фреймворка.
Astro не была единственной технологией, которую я использовал. Вот полный перечень стека:
- Astro: Современный генератор статических сайтов.
- ShadcnUI: Коллекция переиспользуемых компонентов.
- Tailwind CSS: Фреймворк CSS с утилитами.
- MDX: Markdown-контент + встроенные компоненты.
- Pagefind: Быстрая, статическая и офлайн-библиотека поиска. Нет нужды в Algolia!
- Utterances: Система комментариев на основе GitHub-задач.
- Netlify: Автоматизированные деплои, контактная форма с капчей.
Astro: Кривая обучения и ключевые особенности
Astro быстро стал основой моего обновления.
Вот некоторые ключевые особенности, которые я нашёл особенно полезными:
.astroфайлы: На первый взгляд, компоненты Astro могут выглядеть как компоненты React JSX, однако они значительно отличаются и преследуют другую цель. (См. таблицу сравнения ниже.)- Построен на собственных инструментах сборки на Go и Vite: просто работает. Безупречно обрабатывает ESM/CJS, TypeScript, бандлинг кода, стили, изображения и т.д.
- Нет предвзятости в сторону фреймворков или облачных платформ. (Кашель Next.js, OpenNext)
- Статическая vs гибридная рендеризация: Astro предоставляет гибкость для целей большинства облачных платформ: AWS, GCP, Firebase, Netlify, Vercel, Cloudflare Pages, Azure, Fly.io и многих других.
- Коллекции контента: API
getCollectionупрощает работу с файлами контента как с источником данных. - Файловая маршрутизация: Система файловой маршрутизации Astro в сочетании с
getStaticPathsделает генерацию страниц простой. - SEO: Astro не мешает вам и генерирует минимальное количество
отходоввспомогательного кода (astro-island) только при необходимости.
Некоторые вещи оказались немного неожиданными, например, работа с встроенными стилями Astro и эффект от display:contents.
<style>astro-island,astro-slot,astro-static-slot{display:contents}</style>Сравнение .astro и клиентских компонентов
Компоненты Astro — это по сути HTML-шаблоны с мощным паттерном компонентов и пропсов. Они могут запрашивать данные во время сборки, обращаться к ресурсам бэкенда и скрывать определённую чувствительную информацию.
Лучший способ понять компоненты .astro — сравнить их с клиентскими компонентами. (React, Vue, Svelte и т. д.)
| Что вам нужно сделать? | Компонент .astro | Клиентский компонент |
|---|---|---|
| Генерировать HTML с мощным шаблоном+паттерном компонентов | ✅ | ❌ |
| Запрашивать данные во время сборки | ✅ | ❌ |
| Обращаться к ресурсам бэкенда (напрямую) | ✅ | ❌ |
| Скрывать чувствительную информацию (токены доступа, API-ключи и т. д.) | ✅ | ❌ |
| Сокращать клиентский JavaScript | ✅ | ❌ |
| Использовать клиентские компоненты (React, Vue, Svelte и т. д.) | ✅ | ✅ |
Добавлять интерактивность и обработчики событий (onClick(), onChange() и т. д.) | ❌ | ✅ |
Использовать состояние и эффекты (useState(), useReducer(), useEffect() и т. д.) | ❌ | ✅ |
| Использовать API, доступные только в браузере | ❌ | ✅ |
| Использовать пользовательские хуки, зависящие от состояния, эффектов или API браузера | ❌ | ✅ |
Современный CSS: Удивительно
Возвращаясь к разработке фронтенда, я был впечатлён прогрессом в нативном CSS:
- Переменные CSS: Доступны уже давно, и их стабильность в браузерах с 202*.
- Вложенность: Наконец, включена в спецификацию, без прежней неудобной синтаксической конструкции. Теперь она похожа на Less или SCSS.
- Новые селекторы:
:is(),:where()и:has()позволяют более точно выделять элементы. - Современные единицы, такие как
ch,vw, и функции вродеclamp()обеспечивают лучший контроль над макетами и типографикой. - Установите отступы более естественно с помощью атрибутов
-inlineи-block. Установите отступы или поля по горизонтальной или вертикальной оси. Вместоmargin: 0 1rem 0 1rem→margin-inline: 1rem. - Сложные макеты: Пересмотрел CSS Grid. Ух, там полно нюансов. Это может быть пугающим из-за бесконечных способов его использования. Помните, что можно обойтись 1-2 подходами. Изучите эти замечательные ресурсы, которые помогли мне освоить магию с grid: Видео Кевина Пауэлла: Учимся CSS Grid просто, Адаптивность без медиа-запросов, Десять современных макетов в одной строке CSS.
Поиск: Pagefind
Реализация поиска по сайту без использования сторонних сервисов или хостинга баз данных казалась интересной задачей. В конце концов, у меня не 10 000 постов, которые нужно проиндексировать (пока что.)
Гуляя по интеграциям сообщества Astro, я наткнулся на потрясающий инструмент, о котором пожалел, что не знал раньше: Pagefind.
Мало каких инструментов решают задачу так хорошо, как Pagefind решает локальный поиск по сайту.
Простота внедрения Pagefind доставляет удовольствие. Его можно интегрировать с ЛЮБЫМ статическим контентом сайта, а вы можете выбрать, хотите ли вы использовать стандартный интерфейс или создать что-то кастомное по своему усмотрению.
Он аккуратно решил всё, что мне нужно. Интеграция заняла всего несколько минут, и большая часть работы заключалась в добавлении тега <div id="search"></div> и некоторого стилизования!
Комментарии: Utterances
К сожалению, мне пришлось попрощаться с Disqus и с накопленными годами комментариями.
Мне нужен был лучший контроль и прозрачность относительно сторонних скриптов на моем сайте.
Кроме того, всё должно быть простым и поддерживаемым.
Это привело меня к выбору отличного сервиса Utterances. Его система комментариев на основе GitHub-обсуждений хорошо соответствует моей аудитории. Плюс, он прост в настройке и бесплатен.
Tailwind: Сожаления
Есть только один инструмент, использование которого я всё больше сожалею: Tailwind.
С течением времени я чувствую разницу в стоимости написания и поддержки. Tailwind очень быстро писать, но как только он становится достаточно сложным, это может стать утомительно читать и расширять.
Заключение
Обновление моего старого сайта на Gatsby v1 до современной стеки, построенной вокруг Astro, было увлекательным опытом. 10/10 рекомендую.
Если вы рассматриваете возможность обновления старого сайта или создания нового статического (или гибридного) сайта, настоятельно рекомендую изучить Astro. Кривая обучения может быть крутой в некоторые моменты, но преимущества в плане производительности, опыта разработчика и устойчивости проекта к будущим изменениям полностью оправдывают усилия.