МожливостіСутності
Документація
    Ring Platform

    Децентралізоване самобудівне майбутнє

    Увійти
    Сутності
    Можливості
    Магазин
    Документація
    Концепції
    RING ЕкономікаSonoratek LLCГлобальний впливAI зустрічає Web3
    Розпочати
    Швидкий стартКалькуляторДорожня карта
    Конфіденційність|Контакти
    v1.104.17|Sonoratek LLC

    Documentation

    Концепції, цінність і типові сценарії

    Ласкаво просимо до Ring
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    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
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    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
    Швидкий довідник
    Початок роботи
    Передумови
    Встановлення
    Валідація першого успіху
    Наступні кроки
    Функції
    Магазин
    Склад і залишки
    Керування вендорами
    Комісії та розрахунки
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Інтеграція платежів
    Публічні пули та DAO-банки
    Інтеграція WayForPay
    Web3 Гаманець
    WalletConductor
    Партнерська та реферальна підтримка
    Реферальні коди (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Система Стейкінга Токенів
    Лабораторія проєкту власника (Owner Project Lab)
    Сутності
    Можливості
    Повідомлення
    Завдання Ring
    WebRTC-дзвінки та STUNner TURN
    Ігри з друзями
    Модуль Новин - Цифровий Газетний Досвід
    Блоги учасників
    Сторінки публічного профілю
    Віджети профілю облікового запису
    Ring File Cabinet
    Система Резервування Імен Користувачів
    Науковий редактор
    Notifications
    Push-сповіщення через FCM (Ring)
    Email AI-CRM
    Ring Mailer і RingdomX Mail
    Протокол Tunnel
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Безпека та відповідність
    Консоль адміністратора
    Адмінська Wiki
    Керування через Telegram
    Система локалей
    Мобільний Досвід
    Паттерни Оптимізації Продуктивності
    Приклади
    Швидкий старт
    Базове налаштування
    Білий лейбл
    Користувацьке брендування
    Інтеграція Web3
    Реальні приклади
    Розширені функції
    Кастомізація
    Швидкий старт — ваш перший клон Ring
    Повний посібник налаштування
    Вертикальні пресети (SSOT)
    Ringization playbook
    Брендування
    Теми
    Функції
    Локалізація
    Налаштування токеноміки
    Інтеграція платіжних шлюзів
    Еталонні деплої Ring
    Конфігурація
    Публічні змінні середовища
    Секрети Order Lab
    Project ID WalletConnect (Reown Cloud)
    Підтримувані сервіси
    Вікі NODUS (знання проєкту)
    Плейбук конфігурації
    Web3
    Token launch jurisdictions
    Гаманець
    Поради з безпеки гаманця
    Інтеграції
    Ethereum гаманці (Wagmi v3)
    RingFileBase (API об’єктного сховища)
    Ring CDN (edge RingFileBase)
    Розгортання
    Self-hosted розгортання
    Vercel
    Docker
    Конфігурація Середовища
    Моніторинг та Аналітика
    Оптимізація продуктивності
    Резервне копіювання і відновлення
    Архітектура
    Data Model
    Security
    Real Time
    Синхронізація discovery після мутацій
    Архітектура PaymentConductor
    Архітектура WalletConductor
    Бекенд Сервіси
    Інтеграція Firebase
    Розробка
    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)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Оптимізація продуктивності

    Стратегії профілювання та оптимізації, специфічні для 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 }) з одним об'єктом параметрів. Див. для повного інтерфейсу.


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

    Оптимізація продуктивності

    Стратегії профілювання та оптимізації, специфічні для 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 }) з одним об'єктом параметрів. Див. для повного інтерфейсу.


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

    Оптимізація продуктивності

    Стратегії профілювання та оптимізації, специфічні для 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')
    }
    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')
    }
    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)}%`)
    1. Документація
    2. /Розробка
    3. /Продуктивність

    Оновлено 28 черв. 2026 р.4 хв прослуховування

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

    Оновлено 28 черв. 2026 р.4 хв прослуховування

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

    Оновлено 28 черв. 2026 р.4 хв прослуховування