Концепции, ценность и типичные сценарии клонирования — меньше кода.
Концепции, ценность и типичные сценарии клонирования — меньше кода.
Підготовка контенту платформи Ring
Підготовка контенту платформи Ring
Підготовка контенту платформи 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, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:
cache() из React 19.| Оптимизация | Преимущество |
|---|---|
| React 19 cache() | Дедупликация чтений Firestore на один запрос |
| Имитация Firebase во время сборки | ~31% более быстрые сборки, предотвращает 22+ лишних инициализаций |
| Уровень запросов DatabaseService | Унифицированный PostgreSQL + Firestore с кэшированием |
| Серверные компоненты по умолчанию | Без клиентского JS для большинства страниц |
| WayForPay только на сервере | Никакая логика платежей не попадает на клиент |
| FCM Service Worker | Push-уведомления обрабатываются вне главного потока |
По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.
Стратегии профилирования и оптимизации, специфичные для Ring Platform. Этот документ охватывает реальные паттерны кодовой базы. По ожиданиям производительности для пользователей см. Производительность. По усилению производительности в продакшене см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.
Ring Platform не использует Firestore на стороне клиента. Firebase используется исключительно через Admin SDK в lib/firebase-admin.server.ts. Единственный клиентский код Firebase — это public/firebase-messaging-sw.js для push-уведомлений FCM.
Ring Platform загружается быстро, поскольку большинство страниц — это серверные компоненты React, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:
cache() из React 19.| Оптимизация | Преимущество |
|---|---|
| React 19 cache() | Дедупликация чтений Firestore на один запрос |
| Имитация Firebase во время сборки | ~31% более быстрые сборки, предотвращает 22+ лишних инициализаций |
| Уровень запросов DatabaseService | Унифицированный PostgreSQL + Firestore с кэшированием |
| Серверные компоненты по умолчанию | Без клиентского JS для большинства страниц |
| WayForPay только на сервере | Никакая логика платежей не попадает на клиент |
| FCM Service Worker | Push-уведомления обрабатываются вне главного потока |
По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.
Стратегии профилирования и оптимизации, специфичные для Ring Platform. Этот документ охватывает реальные паттерны кодовой базы. По ожиданиям производительности для пользователей см. Производительность. По усилению производительности в продакшене см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.
Ring Platform не использует Firestore на стороне клиента. Firebase используется исключительно через Admin SDK в lib/firebase-admin.server.ts. Единственный клиентский код Firebase — это public/firebase-messaging-sw.js для push-уведомлений FCM.
Ring Platform загружается быстро, поскольку большинство страниц — это серверные компоненты React, рендерящиеся на сервере. Ключевые факторы, влияющие на производительность:
cache() из React 19.| Оптимизация | Преимущество |
|---|---|
| React 19 cache() | Дедупликация чтений Firestore на один запрос |
| Имитация Firebase во время сборки | ~31% более быстрые сборки, предотвращает 22+ лишних инициализаций |
| Уровень запросов DatabaseService | Унифицированный PostgreSQL + Firestore с кэшированием |
| Серверные компоненты по умолчанию | Без клиентского JS для большинства страниц |
| WayForPay только на сервере | Никакая логика платежей не попадает на клиент |
| FCM Service Worker | Push-уведомления обрабатываются вне главного потока |
По ожиданиям производительности для пользователей см. Производительность (пользователь). По мониторингу продакшена и настройке инфраструктуры см. Производительность развертывания. По общим конвенциям разработки см. Лучшие практики.
db.query({ collection, filters })lib/database/DatabaseService.ts:74Все страницы в app/ являются серверными компонентами, если они не содержат директиву 'use client'. Это устраняет клиентский JavaScript для большинства маршрутов. Клиентские компоненты используются только для:
Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.
Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.
Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.
Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:
Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.
Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:
Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:
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
})
import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
if (isBuildTime()) {
const { mockDb, mockAuth } = getMockFirebaseServices()
// mockDb.collection('test').get() возвращает пустые результаты
// Учетные данные Firebase не нужны во время сборки
}
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 для большинства маршрутов. Клиентские компоненты используются только для:
Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.
Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.
Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.
Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:
Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.
Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:
Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:
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
})
import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
if (isBuildTime()) {
const { mockDb, mockAuth } = getMockFirebaseServices()
// mockDb.collection('test').get() возвращает пустые результаты
// Учетные данные Firebase не нужны во время сборки
}
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 для большинства маршрутов. Клиентские компоненты используются только для:
Ищите 'use client' в app/, чтобы увидеть полный перечень клиентских компонентов.
Firebase Cloud Messaging полностью обрабатывается в Service Worker в public/firebase-messaging-sw.js. Push-события обрабатываются без пробуждения главного потока JavaScript. Клиент только регистрирует Service Worker и передает FCM-токен на сервер.
Платежные запросы выполняются исключительно на стороне сервера. Никакие учетные данные продавца WayForPay, HMAC-ключи или логика платежей не попадают в браузер. Клиент отправляет ссылку на заказ; сервер формирует и верифицирует все платежные данные. См. Интеграция WayForPay.
Используйте экспорт force-dynamic, force-static или revalidate для каждой страницы, чтобы контролировать рендеринг:
Статическая генерация является режимом по умолчанию. Явно помечайте страницы как force-dynamic, если они отображают данные конкретного пользователя.
Web Vitals собираются в продакшене. Настройте отслеживание аналитики в среде развертывания. Для анализа во время сборки выполните:
Модуль firebase-service-manager.ts также предоставляет внутренние метрики кэша:
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
})
import { isBuildTime, getMockFirebaseServices } from '@/lib/firebase/build-mock.server'
if (isBuildTime()) {
const { mockDb, mockAuth } = getMockFirebaseServices()
// mockDb.collection('test').get() возвращает пустые результаты
// Учетные данные Firebase не нужны во время сборки
}
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')
}
// Статическая страница, ревалидируется каждые 60 секунд
export const revalidate = 60
// Полностью динамическая — без кэширования
export const dynamic = 'force-dynamic'
npm run build
npm run analyze
import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
const metrics = getCacheMetrics()
console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)
// Статическая страница, ревалидируется каждые 60 секунд
export const revalidate = 60
// Полностью динамическая — без кэширования
export const dynamic = 'force-dynamic'
npm run build
npm run analyze
import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
const metrics = getCacheMetrics()
console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)
// Статическая страница, ревалидируется каждые 60 секунд
export const revalidate = 60
// Полностью динамическая — без кэширования
export const dynamic = 'force-dynamic'
npm run build
npm run analyze
import { getCacheMetrics } from '@/lib/services/firebase-service-manager'
const metrics = getCacheMetrics()
console.log(`Hit rate: ${metrics.hitRate.toFixed(1)}%`)