UNPKG

cs-element

Version:

Advanced reactive data management library with state machines, blueprints, persistence, compression, networking, and multithreading support

494 lines (377 loc) 15.6 kB
# Auto-Dispose система - Автоматическое управление памятью Auto-Dispose система в CSElement обеспечивает автоматическую очистку памяти и предотвращает утечки памяти путем отслеживания отношений родитель-потомок между вычисляемыми свойствами и наблюдателями. ## 🎯 Основные возможности ### Автоматическая очистка - Автоматическое удаление дочерних computed при пересчете родительского - Scope-based очистка для группировки связанных реактивных элементов - Паттерны очистки в стиле React useEffect - Обнаружение и предупреждения об утечках памяти - Иерархическое удаление с отслеживанием зависимостей ### Управление областями видимости - Создание изолированных областей для группировки элементов - Автоматическая очистка всех элементов в области - Вложенные области с каскадной очисткой ## 🚀 Быстрый старт ### Базовая настройка ```typescript import { CSElement } from 'cs-element'; // Включение auto-dispose глобально CSElement.configureReactivity({ autoDispose: true, debug: true, warnMemoryLeaks: true, maxComputedDepth: 50 }); ``` ### Создание и использование областей ```typescript // Создание области видимости const scope = CSElement.createScope(); // Выполнение кода в области CSElement.runInScope(scope.id, () => { const data = CSElement.reactive({ count: 0 }); const doubled = CSElement.computed(() => { return data.count * 2; }); const tripled = CSElement.computed(() => { return data.count * 3; }); const sum = CSElement.computed(() => { // Эти computed автоматически отслеживаются return doubled.value + tripled.value; }); console.log(sum.value); // 0 data.count = 5; console.log(sum.value); // 30 }); // Очистка всей области CSElement.disposeScope(scope.id); ``` ## 📚 Подробное руководство ### Автоматическая очистка computed ```typescript const data = CSElement.reactive({ items: [1, 2, 3] }); const processedItems = CSElement.computed(() => { // При каждом пересчете старые дочерние computed удаляются return data.items.map(item => { return CSElement.computed(() => item * 2); }); }); // При изменении items старые computed автоматически очищаются data.items = [4, 5, 6, 7]; ``` ### Управление жизненным циклом ```typescript class DataProcessor { private scope: string; private data: any; constructor() { this.scope = CSElement.createScope().id; CSElement.runInScope(this.scope, () => { this.data = CSElement.reactive({ values: [] }); this.setupComputedProperties(); }); } private setupComputedProperties() { // Все computed создаются в области класса const processed = CSElement.computed(() => { return this.data.values.map(v => v * 2); }); const filtered = CSElement.computed(() => { return processed.value.filter(v => v > 10); }); const sum = CSElement.computed(() => { return filtered.value.reduce((a, b) => a + b, 0); }); } destroy() { // Очистка всех computed и watchers CSElement.disposeScope(this.scope); } } ``` ### Вложенные области ```typescript const parentScope = CSElement.createScope(); CSElement.runInScope(parentScope.id, () => { const parentData = CSElement.reactive({ value: 1 }); const childScope = CSElement.createScope(); CSElement.runInScope(childScope.id, () => { const childData = CSElement.reactive({ multiplier: 2 }); const result = CSElement.computed(() => { return parentData.value * childData.multiplier; }); }); // Очистка только дочерней области CSElement.disposeScope(childScope.id); }); // Очистка родительской области CSElement.disposeScope(parentScope.id); ``` ## ⚙️ Конфигурация ### Настройки Auto-Dispose ```typescript CSElement.configureReactivity({ // Включить автоматическую очистку autoDispose: true, // Режим отладки debug: true, // Предупреждения об утечках памяти warnMemoryLeaks: true, // Максимальная глубина computed maxComputedDepth: 50, // Интервал проверки утечек (мс) memoryCheckInterval: 10000, // Пороговое значение для предупреждений memoryLeakThreshold: 1000 }); ``` ### Получение информации об областях ```typescript // Получение активных областей const activeScopes = CSElement.getActiveScopes(); console.log(`Активных областей: ${activeScopes.length}`); // Информация о конкретной области const scopeInfo = CSElement.getScopeInfo(scope.id); console.log(`Элементов в области: ${scopeInfo.elementCount}`); console.log(`Computed в области: ${scopeInfo.computedCount}`); console.log(`Watchers в области: ${scopeInfo.watcherCount}`); ``` ## 🔍 Отладка и мониторинг ### Обнаружение утечек памяти ```typescript // Включение детального логирования CSElement.configureReactivity({ debug: true, warnMemoryLeaks: true }); // Ручная проверка утечек const leaks = CSElement.detectMemoryLeaks(); if (leaks.length > 0) { console.warn('Обнаружены потенциальные утечки:', leaks); } // Получение статистики памяти const stats = CSElement.getMemoryStats(); console.log('Статистика памяти:', { totalComputed: stats.computedCount, totalWatchers: stats.watcherCount, totalScopes: stats.scopeCount, memoryUsage: stats.estimatedMemoryUsage }); ``` ### События жизненного цикла ```typescript // Подписка на события очистки CSElement.onScopeDisposed((scopeId, stats) => { console.log(`Область ${scopeId} очищена:`); console.log(`- Удалено computed: ${stats.computedDisposed}`); console.log(`- Удалено watchers: ${stats.watchersDisposed}`); console.log(`- Освобождено памяти: ${stats.memoryFreed}KB`); }); // Подписка на предупреждения об утечках CSElement.onMemoryLeak((leak) => { console.warn('Утечка памяти:', { type: leak.type, count: leak.count, scope: leak.scopeId, stack: leak.stackTrace }); }); ``` ## 🎯 Лучшие практики ### 1. Группировка по компонентам ```typescript class UserComponent { private scope: string; constructor(userId: string) { this.scope = CSElement.createScope().id; CSElement.runInScope(this.scope, () => { this.setupUserData(userId); }); } private setupUserData(userId: string) { const user = CSElement.reactive({ id: userId, data: null }); // Все computed автоматически привязаны к области компонента const displayName = CSElement.computed(() => { return user.data ? `${user.data.firstName} ${user.data.lastName}` : 'Loading...'; }); const permissions = CSElement.computed(() => { return user.data?.permissions || []; }); } destroy() { CSElement.disposeScope(this.scope); } } ``` ### 2. Условная очистка ```typescript const mainScope = CSElement.createScope(); CSElement.runInScope(mainScope.id, () => { const mode = CSElement.reactive({ current: 'development' }); CSElement.watch(() => mode.current, (newMode, oldMode) => { if (oldMode === 'development' && newMode === 'production') { // Очистка debug-ресурсов при переходе в production const debugScope = CSElement.findScope('debug'); if (debugScope) { CSElement.disposeScope(debugScope.id); } } }); }); ``` ### 3. Автоматическая очистка по таймауту ```typescript function createTemporaryScope(duration: number = 60000) { const scope = CSElement.createScope(); // Автоматическая очистка через указанное время setTimeout(() => { if (CSElement.isScopeActive(scope.id)) { CSElement.disposeScope(scope.id); console.log(`Временная область ${scope.id} автоматически очищена`); } }, duration); return scope; } // Использование const tempScope = createTemporaryScope(30000); // 30 секунд CSElement.runInScope(tempScope.id, () => { // Временные вычисления const tempData = CSElement.reactive({ cache: new Map() }); const cachedResults = CSElement.computed(() => { // Кэширование результатов на 30 секунд return Array.from(tempData.cache.values()); }); }); ``` ## 🔧 Интеграция с другими системами ### React интеграция ```typescript import { useEffect } from 'react'; function useCSElementScope() { const [scope] = useState(() => CSElement.createScope()); useEffect(() => { return () => { CSElement.disposeScope(scope.id); }; }, [scope.id]); return scope; } // Использование в компоненте function MyComponent() { const scope = useCSElementScope(); useEffect(() => { CSElement.runInScope(scope.id, () => { // Настройка реактивных данных const data = CSElement.reactive({ count: 0 }); const doubled = CSElement.computed(() => data.count * 2); // Все автоматически очистится при размонтировании компонента }); }, [scope.id]); return <div>My Component</div>; } ``` ### Worker интеграция ```typescript // В основном потоке const workerScope = CSElement.createScope(); CSElement.runInScope(workerScope.id, () => { const workerData = CSElement.reactive({ tasks: [] }); const processedTasks = CSElement.computed(() => { return workerData.tasks.map(task => ({ ...task, processed: true })); }); // При завершении работы с worker worker.terminate(); CSElement.disposeScope(workerScope.id); }); ``` ## 📊 Производительность ### Метрики производительности ```typescript // Измерение влияния на производительность const performanceScope = CSElement.createScope(); const startTime = performance.now(); CSElement.runInScope(performanceScope.id, () => { // Создание множества computed for (let i = 0; i < 1000; i++) { const data = CSElement.reactive({ value: i }); const computed = CSElement.computed(() => data.value * 2); } }); const creationTime = performance.now() - startTime; const disposeStartTime = performance.now(); CSElement.disposeScope(performanceScope.id); const disposeTime = performance.now() - disposeStartTime; console.log(`Создание: ${creationTime}ms`); console.log(`Очистка: ${disposeTime}ms`); ``` ### Оптимизация памяти ```typescript // Настройка для оптимальной производительности CSElement.configureReactivity({ autoDispose: true, // Более частая проверка в development memoryCheckInterval: process.env.NODE_ENV === 'development' ? 5000 : 30000, // Более строгие пороги в production memoryLeakThreshold: process.env.NODE_ENV === 'production' ? 500 : 1000, // Ограничение глубины для предотвращения бесконечной рекурсии maxComputedDepth: 100 }); ``` ## 🚨 Устранение неполадок ### Общие проблемы **Проблема:** Computed не очищаются автоматически ```typescript // ❌ Неправильно - autoDispose отключен CSElement.configureReactivity({ autoDispose: false }); // ✅ Правильно CSElement.configureReactivity({ autoDispose: true }); ``` **Проблема:** Утечки памяти в циклических зависимостях ```typescript // ❌ Неправильно - циклическая зависимость const a = CSElement.computed(() => b.value + 1); const b = CSElement.computed(() => a.value + 1); // Циклическая зависимость // ✅ Правильно - разрыв цикла const source = CSElement.reactive({ value: 0 }); const a = CSElement.computed(() => source.value + 1); const b = CSElement.computed(() => source.value + 2); ``` **Проблема:** Области не очищаются ```typescript // ❌ Неправильно - забыли очистить область const scope = CSElement.createScope(); CSElement.runInScope(scope.id, () => { // код }); // Область остается в памяти // ✅ Правильно - всегда очищаем const scope = CSElement.createScope(); try { CSElement.runInScope(scope.id, () => { // код }); } finally { CSElement.disposeScope(scope.id); } ``` ### Диагностика ```typescript // Включение подробного логирования CSElement.configureReactivity({ debug: true, logLevel: 'verbose' }); // Получение детальной информации const diagnostics = CSElement.getDiagnostics(); console.log('Диагностика Auto-Dispose:', { activeScopes: diagnostics.scopes, memoryUsage: diagnostics.memory, potentialLeaks: diagnostics.leaks, performance: diagnostics.performance }); ``` Auto-Dispose система является мощным инструментом для управления памятью в CSElement, обеспечивающим автоматическую очистку и предотвращение утечек памяти в сложных реактивных приложениях.