Improve app speed and responsiveness for users around the world
Improves Redis connection handling and introduces a new hook `usePerformanceOptimization.ts` for font preloading and RTL layout optimization. Replit-Commit-Author: Agent Replit-Commit-Session-Id: c5f0c281-8dd8-4846-b452-4a07bcd21062 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/9777c70b-fc38-4831-8d6b-78dfffe041b0/e30af87a-6b1f-4210-9add-1f060bd1d9e3.jpg
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
import { useEffect, useCallback, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
interface PerformanceMetrics {
|
||||
renderTime: number;
|
||||
memoryUsage: number;
|
||||
networkRequests: number;
|
||||
rtlPerformance: number;
|
||||
}
|
||||
|
||||
export function usePerformanceOptimization() {
|
||||
const { i18n } = useTranslation();
|
||||
const isRTL = i18n.language === 'ar';
|
||||
|
||||
// Optimize font loading for Arabic
|
||||
useEffect(() => {
|
||||
if (isRTL) {
|
||||
const link = document.createElement('link');
|
||||
link.rel = 'preload';
|
||||
link.href = 'https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@400;500;600;700&display=swap';
|
||||
link.as = 'style';
|
||||
link.onload = () => {
|
||||
link.rel = 'stylesheet';
|
||||
};
|
||||
document.head.appendChild(link);
|
||||
|
||||
return () => {
|
||||
document.head.removeChild(link);
|
||||
};
|
||||
}
|
||||
}, [isRTL]);
|
||||
|
||||
// Memory cleanup for large components
|
||||
const cleanupMemory = useCallback(() => {
|
||||
if ('gc' in window && typeof (window as any).gc === 'function') {
|
||||
(window as any).gc();
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Optimize RTL layout calculations
|
||||
const optimizeRTLLayout = useCallback(() => {
|
||||
if (isRTL) {
|
||||
document.documentElement.style.setProperty('--direction-factor', '-1');
|
||||
document.documentElement.style.setProperty('--text-align', 'right');
|
||||
} else {
|
||||
document.documentElement.style.setProperty('--direction-factor', '1');
|
||||
document.documentElement.style.setProperty('--text-align', 'left');
|
||||
}
|
||||
}, [isRTL]);
|
||||
|
||||
// Performance monitoring
|
||||
const measurePerformance = useCallback((): PerformanceMetrics => {
|
||||
const renderStart = performance.now();
|
||||
|
||||
// Simulate component render time
|
||||
const renderTime = performance.now() - renderStart;
|
||||
|
||||
const memory = (performance as any).memory;
|
||||
const memoryUsage = memory ? memory.usedJSHeapSize / 1024 / 1024 : 0;
|
||||
|
||||
const networkRequests = performance.getEntriesByType('resource').length;
|
||||
|
||||
// Measure RTL specific performance
|
||||
const rtlStart = performance.now();
|
||||
const testElement = document.createElement('div');
|
||||
testElement.style.direction = isRTL ? 'rtl' : 'ltr';
|
||||
testElement.innerHTML = isRTL ? 'اختبار الأداء' : 'Performance Test';
|
||||
document.body.appendChild(testElement);
|
||||
document.body.removeChild(testElement);
|
||||
const rtlPerformance = performance.now() - rtlStart;
|
||||
|
||||
return {
|
||||
renderTime,
|
||||
memoryUsage,
|
||||
networkRequests,
|
||||
rtlPerformance
|
||||
};
|
||||
}, [isRTL]);
|
||||
|
||||
// Memoized optimization settings
|
||||
const optimizationSettings = useMemo(() => ({
|
||||
enableVirtualization: true,
|
||||
prefetchRoutes: ['/', '/tasks', '/finances'],
|
||||
cacheSize: 50,
|
||||
rtlOptimizations: isRTL
|
||||
}), [isRTL]);
|
||||
|
||||
useEffect(() => {
|
||||
optimizeRTLLayout();
|
||||
}, [optimizeRTLLayout]);
|
||||
|
||||
return {
|
||||
cleanupMemory,
|
||||
measurePerformance,
|
||||
optimizationSettings,
|
||||
isRTL
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user