PWA calendar_today Apr 18, 2026

Как превратить Astro-сайт в PWA (Progressive Web App)

Подробное руководство по созданию Progressive Web App (PWA) на Astro.js. Настройка Vite PWA, Service Workers, Web App Manifest, офлайн-режима и push-уведомлений.

person
Журналист
Автор
Логотип Astro в виде иконки мобильного приложения

Хотите, чтобы ваш блог или магазин на Astro открывались без интернета и устанавливались на экраны смартфонов как настоящие приложения? Для этого нужно превратить сайт в Progressive Web App (PWA).

Концепция PWA появилась в Google в 2015 году как ответ на вопрос: «Можно ли сделать веб-приложение таким же быстрым и надежным, как нативное?». В 2026 году ответ — безусловное «да». PWA поддерживаются всеми современными браузерами, включая iOS Safari (начиная с версии 16.4). И благодаря тому, что Astro под капотом использует сборщик Vite, добавление PWA в проект занимает несколько минут.

Что такое PWA и зачем это нужно?

PWA — это обычный веб-сайт, обогащенный тремя ключевыми технологиями:

  1. Web App Manifest — JSON-файл, описывающий «личность» приложения: название, иконки, цвет фона. Именно он позволяет браузеру предложить пользователю «Добавить на домашний экран».
  2. Service Worker — фоновый JavaScript-скрипт, который браузер запускает отдельно от основного потока. Он перехватывает сетевые запросы и умеет отдавать закешированные ресурсы, когда сеть недоступна.
  3. HTTPS — обязательное условие. Service Worker’ы работают только на защищенных соединениях (исключение: localhost для разработки).

Почему PWA важен именно для Astro-проектов? Статический сайт на Astro уже обладает идеальными метриками загрузки (PageSpeed 95-100). PWA добавляет следующий уровень — Reliability (надежность): пользователь в метро без интернета все равно увидит ваш сайт, а не страницу ошибки Chrome «Динозавр не может прыгнуть».

Шаг 1: Установка интеграции Vite PWA

Добавьте официальный пакет из экосистемы сообщества:

code
npm install @vite-pwa/astro

Эта интеграция берет на себя самую сложную часть: автоматическую генерацию Service Worker’а через библиотеку Workbox (разработана Google), создание манифеста и инъекцию регистрационных скриптов в HTML.

Шаг 2: Конфигурация (astro.config.mjs)

Зарегистрируйте плагин и передайте ему настройки манифеста:

code
// astro.config.mjs
import { defineConfig } from 'astro/config';
import AstroPWA from '@vite-pwa/astro';

export default defineConfig({
  integrations: [
    AstroPWA({
      // 'autoUpdate' — Service Worker обновляется в фоне без перезагрузки
      registerType: 'autoUpdate',

      // Web App Manifest — паспорт вашего приложения
      manifest: {
        name: 'Astro Блог — Веб-разработка',
        short_name: 'AstroBlog',
        description: 'Лучшие статьи про современную веб-разработку',
        theme_color: '#7c3aed', // Фиолетовый цвет заголовка браузера
        background_color: '#0f0f23', // Цвет сплэш-скрина при запуске
        display: 'standalone', // Без адресной строки браузера
        start_url: '/',
        icons: [
          {
            src: '/icons/icon-192x192.png',
            sizes: '192x192',
            type: 'image/png',
            purpose: 'any maskable',
          },
          {
            src: '/icons/icon-512x512.png',
            sizes: '512x512',
            type: 'image/png',
          },
        ],
        screenshots: [
          {
            src: '/screenshots/desktop.png',
            sizes: '1280x800',
            type: 'image/png',
            form_factor: 'wide',
          },
        ],
      },

      // Workbox — движок кэширования
      workbox: {
        // Кэшировать все HTML, CSS, JS, шрифты и изображения
        globPatterns: ['**/*.{html,js,css,woff2,png,webp,avif,svg}'],
        // Стратегия Cache First: сначала кэш, потом сеть
        runtimeCaching: [
          {
            urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
            handler: 'CacheFirst',
            options: {
              cacheName: 'google-fonts-cache',
              expiration: { maxEntries: 10, maxAgeSeconds: 60 * 60 * 24 * 365 },
            },
          },
        ],
      },
    }),
  ],
});
image

Иконки приложения

Положите иконки 192x192 и 512x512 в папку public/icons/. Используйте формат PNG. Атрибут maskable позволит Android обрезать иконку по своей форме (круг, квадрат с закругленными углами).

mobile

display: standalone

Параметр standalone скрывает адресную строку браузера при запуске PWA. Пользователь видит ваше приложение как «нативное» — без хромовского интерфейса.

bolt

Стратегии кэша

Cache First — сначала ищет в кэше (быстро). Network First — сначала идет в сеть (актуально). Stale While Revalidate — отдает кэш, обновляет в фоне (баланс).

Шаг 3: Регистрация Service Worker в Layout

Подключите скрипт инициализации в базовый макет (src/layouts/BaseLayout.astro):

code
---
// src/layouts/BaseLayout.astro
import { pwaInfo } from 'virtual:pwa-info';
---

<html lang="ru">
  <head>
    <!-- ... другие теги ... -->
    <meta name="theme-color" content="#7c3aed" />
    <link rel="apple-touch-icon" href="/icons/icon-192x192.png" />
    {pwaInfo && <Fragment set:html={pwaInfo.webManifest.linkTag} />}
  </head>
  <body>
    <slot />
    <script src="/src/pwa-register.ts"></script>
  </body>
</html>

Создайте файл src/pwa-register.ts:

code
// src/pwa-register.ts
import { registerSW } from 'virtual:pwa-register';

const updateSW = registerSW({
  // Вызывается, когда доступна новая версия
  onNeedRefresh() {
    const update = confirm('Доступна новая версия сайта. Обновить?');
    if (update) updateSW(true);
  },
  // Вызывается, когда контент полностью закеширован для офлайна
  onOfflineReady() {
    console.log('Сайт готов к работе офлайн!');
  },
});

Шаг 4: Офлайн-страница

Создайте специальную страницу src/pages/offline.astro для случаев, когда пользователь без интернета запрашивает страницу, которой нет в кэше:

code
---
// src/pages/offline.astro
---

<html lang="ru">
  <head><title>Нет подключения</title></head>
  <body>
    <h1>Вы офлайн</h1>
    <p>Проверьте подключение к интернету и попробуйте снова.</p>
    <a href="/">На главную (из кэша)</a>
  </body>
</html>

В конфигурации Workbox укажите её как страницу для офлайна:

code
workbox: {
  navigateFallback: '/offline',
}

Шаг 5: Тестирование

Service Worker’ы работают только на https или localhost. Для тестирования выполните:

code
npm run build && npm run preview

Откройте Chrome DevTools → вкладка Application → Service Workers. Если всё настроено правильно, вы увидите зарегистрированный воркер со статусом activated and running.

Для имитации офлайна установите чекбокс Offline на той же вкладке и обновите страницу. Сайт должен загрузиться из кэша.

На Android-устройствах появится баннер «Добавить на домашний экран». На iOS нужно вручную нажать «Поделиться → На экран “Домой”».

Push-уведомления (Дополнительно)

В 2026 году Astro-PWA может отправлять нативные push-уведомления (с согласия пользователя). Это особенно полезно для блогов, новостных порталов или e-commerce (уведомление о доставке заказа).

Технология работает через Push API + Notification API и требует серверного компонента для отправки сообщений. Популярный стек: Web Push библиотека на Node.js + Vapid Keys (бесплатные ключи шифрования).

Итог

PWA — идеальный способ повысить Retention Rate (возврат аудитории). Пользователь, установивший ваш блог на телефон, с гораздо большей вероятностью вернется читать новые статьи. А поскольку Astro генерирует легчайший статический HTML, ваше PWA будет запускаться за считанные миллисекунды — быстрее большинства нативных приложений из App Store.

Портрет автора Дмитрий Соколов

Senior Frontend Engineer / Tech Writer

Senior Frontend Engineer с 9-летним опытом. Специализируется на Astro.js и JAMstack.

Комментарии (4)

АГ
18 апр 2026

Попробовал перенести проект с Next.js на Astro. Оказалось, что статическая генерация (SSG) и islands architecture действительно ускоряют загрузку (PageSpeed стал 95+). Подход с частичной гидратацией просто отличный!

МЕ
19 апр 2026

Подскажите, а как лучше настроить SSR адаптер для деплоя Astro на Vercel или Cloudflare? Вроде бы Node.js адаптер тоже подходит, но хочется использовать edge functions для максимальной скорости.

ПЗ
20 апр 2026

Спасибо за разбор! Особенно полезна часть про интеграцию Tailwind CSS v4 и работу с MDX коллекциями (content collections) через схемы Zod. Строгая типизация контента очень помогает при разработке.

ВЛ
21 апр 2026

Подключила PocketBase к Astro по вашей схеме. View Transitions (плавные переходы между страницами) работают шикарно, но возник вопрос: как правильно кэшировать запросы к БД на этапе сборки статического сайта?

Оставить комментарий

Оставляя комментарий, вы соглашаетесь с правилами.

Рекомендуем к прочтению