Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    Messaging
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    White Label
    Интеграция Web3
    Реальные Проекты
    Кастомизация
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Web3
    Token launch jurisdictions
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Конфигурация Окружения
    Monitoring
    Оптимизация производительности
    Backup
    Архитектура
    Data Model
    Security
    Real Time
    Архитектура PaymentConductor
    Разработка
    Ring MCP Server

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    Messaging
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    White Label
    Интеграция Web3
    Реальные Проекты
    Кастомизация
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Web3
    Token launch jurisdictions
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Конфигурация Окружения
    Monitoring
    Оптимизация производительности
    Backup
    Архитектура
    Data Model
    Security
    Real Time
    Архитектура PaymentConductor
    Разработка
    Ring MCP Server

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)

    Documentation

    Концепции, ценность и типичные сценарии клонирования — меньше кода.

    Добро пожаловать в Ring Platform
    Краткий справочник
    С чего начать
    Предварительные требования
    Установка
    Первый успех
    Следующие шаги
    Функции
    Store
    Склад и остатки
    Управление вендорами
    Комиссии и расчёты
    SubscriptionConductor
    PaymentConductor
    Интеграция платежей
    Интеграция WayForPay
    Web3 Кошелек
    Реферальные коды (Refcodes)
    NFT Exhibition Marketplace
    Система Стейкинга Токенов
    Entities
    Opportunities
    Messaging
    Модуль Новостей - Цифровой Газетный Опыт
    Блоги участников
    Система Резервирования Имён Пользователей
    Научный редактор
    Notifications
    Push-уведомления через FCM (Ring)
    Email AI-CRM
    Протокол Tunnel
    Authentication
    Безопасность и соответствие
    Система локалей
    Мобильный Опыт
    Паттерны Оптимизации Производительности
    Примеры
    Quick Start
    White Label
    Интеграция Web3
    Реальные Проекты
    Кастомизация
    Branding
    Темы оформления
    Features
    Localization
    Настройка токеномики
    Web3
    Token launch jurisdictions
    Интеграции
    Ethereum-кошельки (Wagmi v3)
    Развёртывание
    Self-hosted развёртывание
    Vercel
    Docker
    Конфигурация Окружения
    Monitoring
    Оптимизация производительности
    Backup
    Архитектура
    Data Model
    Security
    Real Time
    Архитектура PaymentConductor
    Разработка
    Ring MCP Server

    Быстрый вход (CTO · аудиторы · агенты)

    Приветствие — миссия и аудитории
    Краткий справочник
    С чего начать
    Архитектура и Auth.js
    Режимы бэкенда и базы данных (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Деплой (Docker · k8s)
    Безопасность и соответствие требованиям
    ringdom.org — база LegioX
    Исходный код — лицензия MIT (GitHub)
    1. Документация
    2. /Разработка
    3. /Производительность

    Обновлено 28 июн. 2026 г.4 мин прослушивания

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    1. Документация
    2. /Разработка
    3. /Производительность

    Обновлено 28 июн. 2026 г.4 мин прослушивания

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    1. Документация
    2. /Разработка
    3. /Производительность

    Обновлено 28 июн. 2026 г.4 мин прослушивания

    Ring Platform Logo

    Завантаження документації...

    Підготовка контенту платформи Ring

    Оптимизация производительности

    Стратегии профилирования и оптимизации, специфичные для Ring Platform. Этот документ охватывает реальные паттерны кодовой базы. По ожиданиям производительности для пользователей см. Производительность. По усилению производительности в продакшене см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    Ring Platform не использует Firestore на стороне клиента. Firebase используется исключительно через Admin SDK в lib/firebase-admin.server.ts. Единственный клиентский код Firebase — это public/firebase-messaging-sw.js для push-уведомлений FCM.

    Что влияет на время загрузки

    Ring Platform загружается быстро, поскольку большинство страниц — это серверные компоненты React, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:

    • Кэширование серверных данных — повторные чтения Firestore во время одного запроса дедуплицируются с помощью cache() из React 19.
    • Оптимизации во время сборки — Firebase Admin имитируется во время статической генерации, сокращая время сборки примерно на 31%.
    • Минимальный клиентский JavaScript — только страницы с интерактивностью (формы, карты, оформление заказа) используют клиентские компоненты.
    • Ресурсы через CDN — статические страницы предварительно собираются и обслуживаются из кэша на периферии сети.

    Доступные оптимизации производительности

    ОптимизацияПреимущество
    React 19 cache()Дедупликация чтений Firestore на один запрос
    Имитация Firebase во время сборки~31% более быстрые сборки, предотвращает 22+ лишних инициализаций
    Уровень запросов DatabaseServiceУнифицированный PostgreSQL + Firestore с кэшированием
    Серверные компоненты по умолчаниюБез клиентского JS для большинства страниц
    WayForPay только на сервереНикакая логика платежей не попадает на клиент
    FCM Service WorkerPush-уведомления обрабатываются вне главного потока

    React 19 cache() для дедупликации данных

    Модуль firebase-service-manager.ts оборачивает каждое чтение Firestore Admin SDK с помощью cache() из React 19. Это предотвращает дублирование запросов в пределах одного прохода рендеринга серверного компонента.

    Функция cache() импортируется из React 19 — это не собственная реализация. Все функции кэшированного чтения находятся в lib/services/firebase-service-manager.ts и работают с firebase-admin/firestore.

    Область кэша — только текущий проход рендеринга серверного компонента. После отправки ответа кэш удаляется. Для долговременного кэширования используйте revalidate на fetch или выделенный слой кэширования.

    Имитация Firebase во время сборки

    Во время next build устанавливается NEXT_PHASE=phase-production-build. Модуль в lib/firebase/build-mock.server.ts обнаруживает это и возвращает имитированные экземпляры Firestore, Auth и RTDB. Это предотвращает примерно 22 инициализации Firebase Admin, которые иначе выполнялись бы во время статической генерации.

    Слой имитации реализует полный интерфейс запросов Firestore с цепочечными методами where(), orderBy(), limit() и пагинацией — все возвращают пустые наборы результатов. Методы Auth возвращают безопасные объекты пользователей по умолчанию. Это активно в lib/firebase/build-mock.server.ts:36.

    Оптимизация запросов DatabaseService

    Уровень абстракции базы данных в lib/database/DatabaseService.ts предоставляет унифицированный API запросов для PostgreSQL и Firestore со встроенным кэшированием сущностей на 30 секунд.

    Сервис включает класс EntityCache с инвалидацией на основе TTL. Для согласованности чтения после записи операции записи инвалидируют соответствующие ключи.

    Не вызывайте db.users.findById() или подобные паттерны. API DatabaseService использует с одним объектом параметров. См. для полного интерфейса.


    По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    Оптимизация производительности

    Стратегии профилирования и оптимизации, специфичные для Ring Platform. Этот документ охватывает реальные паттерны кодовой базы. По ожиданиям производительности для пользователей см. Производительность. По усилению производительности в продакшене см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    Ring Platform не использует Firestore на стороне клиента. Firebase используется исключительно через Admin SDK в lib/firebase-admin.server.ts. Единственный клиентский код Firebase — это public/firebase-messaging-sw.js для push-уведомлений FCM.

    Что влияет на время загрузки

    Ring Platform загружается быстро, поскольку большинство страниц — это серверные компоненты React, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:

    • Кэширование серверных данных — повторные чтения Firestore во время одного запроса дедуплицируются с помощью cache() из React 19.
    • Оптимизации во время сборки — Firebase Admin имитируется во время статической генерации, сокращая время сборки примерно на 31%.
    • Минимальный клиентский JavaScript — только страницы с интерактивностью (формы, карты, оформление заказа) используют клиентские компоненты.
    • Ресурсы через CDN — статические страницы предварительно собираются и обслуживаются из кэша на периферии сети.

    Доступные оптимизации производительности

    ОптимизацияПреимущество
    React 19 cache()Дедупликация чтений Firestore на один запрос
    Имитация Firebase во время сборки~31% более быстрые сборки, предотвращает 22+ лишних инициализаций
    Уровень запросов DatabaseServiceУнифицированный PostgreSQL + Firestore с кэшированием
    Серверные компоненты по умолчаниюБез клиентского JS для большинства страниц
    WayForPay только на сервереНикакая логика платежей не попадает на клиент
    FCM Service WorkerPush-уведомления обрабатываются вне главного потока

    React 19 cache() для дедупликации данных

    Модуль firebase-service-manager.ts оборачивает каждое чтение Firestore Admin SDK с помощью cache() из React 19. Это предотвращает дублирование запросов в пределах одного прохода рендеринга серверного компонента.

    Функция cache() импортируется из React 19 — это не собственная реализация. Все функции кэшированного чтения находятся в lib/services/firebase-service-manager.ts и работают с firebase-admin/firestore.

    Область кэша — только текущий проход рендеринга серверного компонента. После отправки ответа кэш удаляется. Для долговременного кэширования используйте revalidate на fetch или выделенный слой кэширования.

    Имитация Firebase во время сборки

    Во время next build устанавливается NEXT_PHASE=phase-production-build. Модуль в lib/firebase/build-mock.server.ts обнаруживает это и возвращает имитированные экземпляры Firestore, Auth и RTDB. Это предотвращает примерно 22 инициализации Firebase Admin, которые иначе выполнялись бы во время статической генерации.

    Слой имитации реализует полный интерфейс запросов Firestore с цепочечными методами where(), orderBy(), limit() и пагинацией — все возвращают пустые наборы результатов. Методы Auth возвращают безопасные объекты пользователей по умолчанию. Это активно в lib/firebase/build-mock.server.ts:36.

    Оптимизация запросов DatabaseService

    Уровень абстракции базы данных в lib/database/DatabaseService.ts предоставляет унифицированный API запросов для PostgreSQL и Firestore со встроенным кэшированием сущностей на 30 секунд.

    Сервис включает класс EntityCache с инвалидацией на основе TTL. Для согласованности чтения после записи операции записи инвалидируют соответствующие ключи.

    Не вызывайте db.users.findById() или подобные паттерны. API DatabaseService использует с одним объектом параметров. См. для полного интерфейса.


    По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    Оптимизация производительности

    Стратегии профилирования и оптимизации, специфичные для Ring Platform. Этот документ охватывает реальные паттерны кодовой базы. По ожиданиям производительности для пользователей см. Производительность. По усилению производительности в продакшене см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    Ring Platform не использует Firestore на стороне клиента. Firebase используется исключительно через Admin SDK в lib/firebase-admin.server.ts. Единственный клиентский код Firebase — это public/firebase-messaging-sw.js для push-уведомлений FCM.

    Что влияет на время загрузки

    Ring Platform загружается быстро, поскольку большинство страниц — это серверные компоненты React, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:

    • Кэширование серверных данных — повторные чтения Firestore во время одного запроса дедуплицируются с помощью cache() из React 19.
    • Оптимизации во время сборки — Firebase Admin имитируется во время статической генерации, сокращая время сборки примерно на 31%.
    • Минимальный клиентский JavaScript — только страницы с интерактивностью (формы, карты, оформление заказа) используют клиентские компоненты.
    • Ресурсы через CDN — статические страницы предварительно собираются и обслуживаются из кэша на периферии сети.

    Доступные оптимизации производительности

    ОптимизацияПреимущество
    React 19 cache()Дедупликация чтений Firestore на один запрос
    Имитация Firebase во время сборки~31% более быстрые сборки, предотвращает 22+ лишних инициализаций
    Уровень запросов DatabaseServiceУнифицированный PostgreSQL + Firestore с кэшированием
    Серверные компоненты по умолчаниюБез клиентского JS для большинства страниц
    WayForPay только на сервереНикакая логика платежей не попадает на клиент
    FCM Service WorkerPush-уведомления обрабатываются вне главного потока

    React 19 cache() для дедупликации данных

    Модуль firebase-service-manager.ts оборачивает каждое чтение Firestore Admin SDK с помощью cache() из React 19. Это предотвращает дублирование запросов в пределах одного прохода рендеринга серверного компонента.

    Функция cache() импортируется из React 19 — это не собственная реализация. Все функции кэшированного чтения находятся в lib/services/firebase-service-manager.ts и работают с firebase-admin/firestore.

    Область кэша — только текущий проход рендеринга серверного компонента. После отправки ответа кэш удаляется. Для долговременного кэширования используйте revalidate на fetch или выделенный слой кэширования.

    Имитация Firebase во время сборки

    Во время next build устанавливается NEXT_PHASE=phase-production-build. Модуль в lib/firebase/build-mock.server.ts обнаруживает это и возвращает имитированные экземпляры Firestore, Auth и RTDB. Это предотвращает примерно 22 инициализации Firebase Admin, которые иначе выполнялись бы во время статической генерации.

    Слой имитации реализует полный интерфейс запросов Firestore с цепочечными методами where(), orderBy(), limit() и пагинацией — все возвращают пустые наборы результатов. Методы Auth возвращают безопасные объекты пользователей по умолчанию. Это активно в lib/firebase/build-mock.server.ts:36.

    Оптимизация запросов DatabaseService

    Уровень абстракции базы данных в lib/database/DatabaseService.ts предоставляет унифицированный API запросов для PostgreSQL и Firestore со встроенным кэшированием сущностей на 30 секунд.

    Сервис включает класс EntityCache с инвалидацией на основе TTL. Для согласованности чтения после записи операции записи инвалидируют соответствующие ключи.

    Не вызывайте db.users.findById() или подобные паттерны. API DatabaseService использует с одним объектом параметров. См. для полного интерфейса.


    По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.

    db.query({ collection, filters })
    lib/database/DatabaseService.ts:74

    Серверные компоненты по умолчанию

    Все страницы в app/ являются серверными компонентами, если они не содержат директиву 'use client'. Это устраняет клиентский JavaScript для большинства маршрутов. Клиентские компоненты используются только для:

    • Интерактивных форм (оформление заказа, онбординг продавцов)
    • Отображения карт (Ringdom Maps)
    • Интерфейсов кошельков и платежей
    • Панелей администрирования

    Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.

    Обработка фоновых сообщений FCM

    Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.

    WayForPay только на сервере

    Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.

    Стратегии рендеринга Next.js 16

    Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:

    Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.

    Показатели производительности

    • First Contentful Paint: < 1.5 с
    • Largest Contentful Paint: < 2.5 с
    • First Input Delay: < 100 мс
    • Cumulative Layout Shift: < 0.1
    • Сокращение времени сборки благодаря имитации Firebase: ~31%

    Мониторинг

    Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:

    Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:

    typescript
    
    import { getCachedDocument, getCachedCollection } from '@/lib/services/firebase-service-manager'
    
    // Несколько вызовов одного документа во время SSG сводятся к одному чтению Firestore
    const entity = await getCachedDocument('entities', 'abc123')
    const sameEntity = await getCachedDocument('entities', 'abc123') // cache hit
    
    // Запросы коллекций также кэшируются на один запрос
    const activeEntities = await getCachedCollection('entities', {
      where: { field: 'status', operator: '==', value: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      limit: 20
    })
    typescript
    
    import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
    
    if (isBuildTime()) {
      const { mockDb, mockAuth } = getMockFirebaseServices()
      // mockDb.collection('test').get() возвращает пустые результаты
      // Учетные данные Firebase не нужны во время сборки
    }
    typescript
    
    import { getDatabaseService } from '@/lib/database/DatabaseService'
    
    const db = getDatabaseService()
    const result = await db.query({
      collection: 'entities',
      filters: { status: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      pagination: { limit: 20 }
    })
    
    if (!result.success) {
      throw result.error || new Error('Query failed')
    }
    db.query({ collection, filters })
    lib/database/DatabaseService.ts:74

    Серверные компоненты по умолчанию

    Все страницы в app/ являются серверными компонентами, если они не содержат директиву 'use client'. Это устраняет клиентский JavaScript для большинства маршрутов. Клиентские компоненты используются только для:

    • Интерактивных форм (оформление заказа, онбординг продавцов)
    • Отображения карт (Ringdom Maps)
    • Интерфейсов кошельков и платежей
    • Панелей администрирования

    Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.

    Обработка фоновых сообщений FCM

    Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.

    WayForPay только на сервере

    Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.

    Стратегии рендеринга Next.js 16

    Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:

    Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.

    Показатели производительности

    • First Contentful Paint: < 1.5 с
    • Largest Contentful Paint: < 2.5 с
    • First Input Delay: < 100 мс
    • Cumulative Layout Shift: < 0.1
    • Сокращение времени сборки благодаря имитации Firebase: ~31%

    Мониторинг

    Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:

    Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:

    typescript
    
    import { getCachedDocument, getCachedCollection } from '@/lib/services/firebase-service-manager'
    
    // Несколько вызовов одного документа во время SSG сводятся к одному чтению Firestore
    const entity = await getCachedDocument('entities', 'abc123')
    const sameEntity = await getCachedDocument('entities', 'abc123') // cache hit
    
    // Запросы коллекций также кэшируются на один запрос
    const activeEntities = await getCachedCollection('entities', {
      where: { field: 'status', operator: '==', value: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      limit: 20
    })
    typescript
    
    import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
    
    if (isBuildTime()) {
      const { mockDb, mockAuth } = getMockFirebaseServices()
      // mockDb.collection('test').get() возвращает пустые результаты
      // Учетные данные Firebase не нужны во время сборки
    }
    typescript
    
    import { getDatabaseService } from '@/lib/database/DatabaseService'
    
    const db = getDatabaseService()
    const result = await db.query({
      collection: 'entities',
      filters: { status: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      pagination: { limit: 20 }
    })
    
    if (!result.success) {
      throw result.error || new Error('Query failed')
    }
    db.query({ collection, filters })
    lib/database/DatabaseService.ts:74

    Серверные компоненты по умолчанию

    Все страницы в app/ являются серверными компонентами, если они не содержат директиву 'use client'. Это устраняет клиентский JavaScript для большинства маршрутов. Клиентские компоненты используются только для:

    • Интерактивных форм (оформление заказа, онбординг продавцов)
    • Отображения карт (Ringdom Maps)
    • Интерфейсов кошельков и платежей
    • Панелей администрирования

    Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.

    Обработка фоновых сообщений FCM

    Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.

    WayForPay только на сервере

    Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.

    Стратегии рендеринга Next.js 16

    Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:

    Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.

    Показатели производительности

    • First Contentful Paint: < 1.5 с
    • Largest Contentful Paint: < 2.5 с
    • First Input Delay: < 100 мс
    • Cumulative Layout Shift: < 0.1
    • Сокращение времени сборки благодаря имитации Firebase: ~31%

    Мониторинг

    Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:

    Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:

    typescript
    
    import { getCachedDocument, getCachedCollection } from '@/lib/services/firebase-service-manager'
    
    // Несколько вызовов одного документа во время SSG сводятся к одному чтению Firestore
    const entity = await getCachedDocument('entities', 'abc123')
    const sameEntity = await getCachedDocument('entities', 'abc123') // cache hit
    
    // Запросы коллекций также кэшируются на один запрос
    const activeEntities = await getCachedCollection('entities', {
      where: { field: 'status', operator: '==', value: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      limit: 20
    })
    typescript
    
    import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
    
    if (isBuildTime()) {
      const { mockDb, mockAuth } = getMockFirebaseServices()
      // mockDb.collection('test').get() возвращает пустые результаты
      // Учетные данные Firebase не нужны во время сборки
    }
    typescript
    
    import { getDatabaseService } from '@/lib/database/DatabaseService'
    
    const db = getDatabaseService()
    const result = await db.query({
      collection: 'entities',
      filters: { status: 'active' },
      orderBy: { field: 'createdAt', direction: 'desc' },
      pagination: { limit: 20 }
    })
    
    if (!result.success) {
      throw result.error || new Error('Query failed')
    }
    typescript
    
    // Статическая страница, ревалидируется каждые 60 секунд
    export const revalidate = 60
    
    // Полностью динамическая — без кэширования
    export const dynamic = 'force-dynamic'
    bash
    
    npm run build
    npm run analyze
    typescript
    
    import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
    
    const metrics = getCacheMetrics()
    console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)
    typescript
    
    // Статическая страница, ревалидируется каждые 60 секунд
    export const revalidate = 60
    
    // Полностью динамическая — без кэширования
    export const dynamic = 'force-dynamic'
    bash
    
    npm run build
    npm run analyze
    typescript
    
    import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
    
    const metrics = getCacheMetrics()
    console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)
    typescript
    
    // Статическая страница, ревалидируется каждые 60 секунд
    export const revalidate = 60
    
    // Полностью динамическая — без кэширования
    export const dynamic = 'force-dynamic'
    bash
    
    npm run build
    npm run analyze
    typescript
    
    import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
    
    const metrics = getCacheMetrics()
    console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)