refactor(logging): implement unified Logger system to replace console calls

- Add Logger utility with tagged output and environment-based control
- Configure Babel to remove console calls in production builds
- Replace all console.* calls across stores, services, and components with Logger
- Enable development-only logging with formatted output and component tags
- Optimize production builds by eliminating all logging code
This commit is contained in:
zimplexing
2025-08-15 22:57:38 +08:00
parent 836285dbd5
commit e57466c8c1
25 changed files with 404 additions and 200 deletions

View File

@@ -15,6 +15,9 @@ import { useUpdateStore, initUpdateStore } from "@/stores/updateStore";
import { UpdateModal } from "@/components/UpdateModal";
import { UPDATE_CONFIG } from "@/constants/UpdateConfig";
import { useResponsiveLayout } from "@/hooks/useResponsiveLayout";
import Logger from '@/utils/Logger';
const logger = Logger.withTag('RootLayout');
// Prevent the splash screen from auto-hiding before asset loading is complete.
SplashScreen.preventAutoHideAsync();
@@ -48,7 +51,7 @@ export default function RootLayout() {
if (loaded || error) {
SplashScreen.hideAsync();
if (error) {
console.warn(`Error in loading fonts: ${error}`);
logger.warn(`Error in loading fonts: ${error}`);
}
}
}, [loaded, error]);

View File

@@ -17,11 +17,14 @@ import Toast from "react-native-toast-message";
import usePlayerStore, { selectCurrentEpisode } from "@/stores/playerStore";
import { useResponsiveLayout } from "@/hooks/useResponsiveLayout";
import { useVideoHandlers } from "@/hooks/useVideoHandlers";
import Logger from '@/utils/Logger';
const logger = Logger.withTag('PlayScreen');
// 优化的加载动画组件
const LoadingContainer = memo(
({ style, currentEpisode }: { style: any; currentEpisode: { url: string; title: string } | undefined }) => {
console.info(
logger.info(
`[PERF] Video component NOT rendered - waiting for valid URL. currentEpisode: ${!!currentEpisode}, url: ${
currentEpisode?.url ? "exists" : "missing"
}`
@@ -130,21 +133,21 @@ export default function PlayScreen() {
useEffect(() => {
const perfStart = performance.now();
console.info(`[PERF] PlayScreen useEffect START - source: ${source}, id: ${id}, title: ${title}`);
logger.info(`[PERF] PlayScreen useEffect START - source: ${source}, id: ${id}, title: ${title}`);
setVideoRef(videoRef);
if (source && id && title) {
console.info(`[PERF] Calling loadVideo with episodeIndex: ${episodeIndex}, position: ${position}`);
logger.info(`[PERF] Calling loadVideo with episodeIndex: ${episodeIndex}, position: ${position}`);
loadVideo({ source, id, episodeIndex, position, title });
} else {
console.info(`[PERF] Missing required params - source: ${!!source}, id: ${!!id}, title: ${!!title}`);
logger.info(`[PERF] Missing required params - source: ${!!source}, id: ${!!id}, title: ${!!title}`);
}
const perfEnd = performance.now();
console.info(`[PERF] PlayScreen useEffect END - took ${(perfEnd - perfStart).toFixed(2)}ms`);
logger.info(`[PERF] PlayScreen useEffect END - took ${(perfEnd - perfStart).toFixed(2)}ms`);
return () => {
console.info(`[PERF] PlayScreen unmounting - calling reset()`);
logger.info(`[PERF] PlayScreen unmounting - calling reset()`);
reset(); // Reset state when component unmounts
};
}, [episodeIndex, source, position, setVideoRef, reset, loadVideo, id, title]);

View File

@@ -18,6 +18,9 @@ import { getCommonResponsiveStyles } from "@/utils/ResponsiveStyles";
import ResponsiveNavigation from "@/components/navigation/ResponsiveNavigation";
import ResponsiveHeader from "@/components/navigation/ResponsiveHeader";
import { DeviceUtils } from "@/utils/DeviceUtils";
import Logger from '@/utils/Logger';
const logger = Logger.withTag('SearchScreen');
export default function SearchScreen() {
const [keyword, setKeyword] = useState("");
@@ -37,7 +40,7 @@ export default function SearchScreen() {
useEffect(() => {
if (lastMessage && targetPage === 'search') {
console.log("Received remote input:", lastMessage);
logger.debug("Received remote input:", lastMessage);
const realMessage = lastMessage.split("_")[0];
setKeyword(realMessage);
handleSearch(realMessage);
@@ -72,7 +75,7 @@ export default function SearchScreen() {
}
} catch (err) {
setError("搜索失败,请稍后重试。");
console.info("Search failed:", err);
logger.info("Search failed:", err);
} finally {
setLoading(false);
}